`
wwn15wwn
  • 浏览: 16422 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

编译程序与操作系统的关系

 
阅读更多

编译程序与操作系统的关系
2010年06月25日
  转自刘建文博客:http://arttech.us/y-2010/relation-compiler-os.html
  和很多程序员一样,编译器到目前为止对我还存在一些让我迷惑的地方。比如编译器与操作系统的关系,编译器与CPU的关系,动态链接器从哪查找共享库 等。让人困惑的原因有几,第一是编译器的功能角色特殊,编译器是生成程序的程序;第二是编译过程变得越来越复杂[注],一支编译器支持多种程序语言、支持 共享库、编译优化,编译与链接可分开等;第三,操作系统的介入。本文试着从第三点--操作系统介入编译过程后对编译器的影响,看看操作系统与编译器有什么 关系。  注:编译过程变复杂源于计算机应用变复杂。例如应用程序项目越来越庞大,功能越来越多;为了管理大项目,拆分源程 序文件为多个;为了提高程序的性能,目标程序文件的链接期被延迟到运行前;为了程序的灵活安装和升级,引入各种脚本工具,如 make,configure(shell)。   我们看看编译器的一种传统定义: 编译程序是一支将抽象度较高的编程语言程序(也称源程序)【转化】成抽象度较低的编程语言程序(也称目标程 序)的【程序】[注]。抽象度的两端分别是机器语义和人理解语义。【处理器体系】和【编程语言】是一支编译程序的根本属性。 注:以下仅使用【程序】一语,"器"是一种形象的比喻,不够严谨;而软件(software)是产品性的程序,最 好只用在商业语境中。 以上对编译程序的定义描述在【现代意义下】对全面认识编译程序是不够的,因为它没有涉及操作系统,没有涉及现代的复杂的程序构建过程。有一定开发经 验的程序员都知道,程序的"编译过程"包括编译、链接(静态链接与动态链接)、调试,还可能包括组态配置和安装两步。"编译"一词已经不能很好描述这个过 程。整个过程可称为【程序构建】,而编译只是第一步,在这一点上,编译程序在传统意义上与现代意义上产生了不同。由于本文试图讨论编译程序与操作系统的关 系,为了避免产生歧义,本文的【编译程序】包括编译和静态链接两个部分,动态链接部分有点特殊,后面会提到它的角色。
  下面我们给出有关【操作系统与编译程序关系】的三个问题,并试图回答它们: 第一,编译程序与操作系统的关系是什么? 
  第二,编译程序对操作系统有依赖么? 
  第三,编译程序与CPU的关系又是什么? 
  第四,操作系统对C标准库与C编译程序的关系有什么影响?
  为了更好的进行下一步讨论,我先给出现代编译程序比较完整的定义,并由定义引出问题: 现代编译程序是一支将某抽象度较高的编程语言程序【转化】为运行在【某软硬体系下】的抽象度较低的编程语言 程序的【程序】。所谓硬件体系是指处理器体系,软件体系指操作系统体系。 要回答前三个问题,我们得厘清现代编译程序定义中的【属概念】--程序,并对操作系统有更深一层认识。 程序的分类是多种多样的,比如常见的两分法是【系统程序】和【应用程序】。这是一种粗粒度的按【计算任务】不同的分法。我们看程序的定义: 程序(program)是完成特定【计算任务】的【指令】序列,指令由相应的【图灵机】读取并操作。 由以上对程序的定义可知,还可根据--程序【指令的性质】和读取程序的【图灵机】性质--两个标准再进一步对程序分类。比如,按指令序列是否连续可 以分为独立程序和共享程序(使用了共享库);按指令的抽象度可分为高级语言程序和低级语言程序。按【图灵机】的体系可分为X86程序和ARM程序,16位 程序和32位程序等。
  高级语言程序是不是【程序】?如果是,它的【图灵机】是什么?
  我们一般理解下的【程序】是指二进制的可执行文件,那么高级语言的源程序是不是程序?从指令序列的定义看,【高级语言的源程序】是程序,因为【高级语言的 源程序】与【二进制的可执行文件】一样,也是指令序列,只不过【高级语言的源程序】的【图灵机】不是CPU,也不是编译器或解释器,而是程序员。【高级语 言的源程序】的功能更多体现在程序员间的相互学习和交流。
  除了以上基本分类外,现代的程序还会受为其提供虚拟运行环境的操作系统影响,可以根据操作系统的体系属性对程序再分类,例如win32程 序,linux程序。
  
  操作系统是一类比较独立的系统程序,操作系统有支持各种【图灵机】的体系类型,比如16位DOS,32位Windows,X86的BSD,ARM的 Linux等。而系统程序一般是指一支为应用程序直接提供半成品(为应用程序提供执行的虚拟环境)和协调多个应用程序并行运行的程序。所谓半成品是指,系 统程序的一部分(指令序列)也是应用程序的一部分(指令序列),但这部分程序不专属任何应用程序,它是共享的。例如各种新硬件的驱动程序、C标准库函数、 POSIX库函数等。而作一个协调程序,操作系统表现出与一般应用程序的程序性,如独立调度的线程,只是它们运行在权力更高的状态下。协调程序如线程调度 程序。  这里的操作系统泛指像Linux这样的现代32位操作系统,而【非操作系统程序】运行在操作系统之上,对操作系统存在可能的依赖的程序。
  其实只要是运行在某操作系统之上的程序都会烙上该操作系统的印,对操作系统有依赖,包括编译程序。不过这些程序对操作系统的依赖程度和依赖的内容确 实有很多区别。例如一支最简单的【Hello world程序】都会对【操作系统的C库】产生依赖,如果去掉【Hello world程序】的输入输出功能,只作加减或逻辑运算,【Hello world程序】依然会对操作系统有少量依赖,因为【Hello world程序】由运行在该【操作系统上的编译程序】编译的,有特定的目标文件格式,并由该【操作系统的载入程序】载入内存运行[注]。这种只【在形式 上】对OS存在依赖的"无用"程序可谓是最独立于OS的程序。在此基础之上,其它程序都对OS有不同程度的依赖,依赖表现在对OS内的各种程序库的依赖, 比如C标准库,POSIX系统库,线程库、网络库和其它基于这些基础库的第三方应用代码库。 注:由此可见编译程序与引导程序、SHELL程序一样,是现代操作系统的基本部分。  有了以上的对程序以及操作系统本质的一定了解后,我们知道编译程序与操作系统有一定亲缘性。但这种亲缘性的一些表现会让人迷惑。例如Linux发行版可以 不安装有编译程序的,只有开发工作站才需要编译程序。而所有Linux发行版的应用程序都可能使用了共享库,需要动态链接这些系统共享库。由此可见,应该 分开【开发期】与【运行期】来看待编译程序与操作系统的关系。在开发期,编译程序运行操作系统之上,属于【非操作系统程序】,对操作系统有依赖;在运行 期,编译程序的子部分--动态链接程序和加载程序属于操作系统有机部分。
  由以可得编译程序与操作系统的关系有: 第一,编译程序的编译部分和静态链接部分是运行在操作系统上的系统程序; 
  第二,编译程序的动态链接部分与操作系统的亲缘性更强,所以完全可把动态链接部分独立出来[FIXME:动态链接程序与操作系统具体关系未知]; 
  第三,编译程序的编译输出格式是操作系统相关的。
  由此可见,编译程序是操作系统相关的,编译程序也是操作系统的功能很重要组成部分,但编译程序没有被集成入操作系统内核内,所以编译程序不算是操作系统的 有机组成部分。  由上面可得,编译程序是运行操作系统之上【非操作系统程序】,对操作系统有依赖。编译程序是一支【计算集中】更大的程序,它相对于应用程序对OS依赖会少 一些,依赖有: 形式依赖(由另一支同软硬体系的编译程序[行话本地编译器],编译得到或不同软硬体系的编译程序[行话交叉编译器],交叉编译得到) 
  C库依赖,读取高级语言源码程序文件,写入低级语言的目标文件
  操作系统对C库没有什么影响,C库是一种通用代码库;但与[FIXME] 刘建文原创,引用请注明出处。
分享到:
评论

相关推荐

    很好用的foxpro反编译程序

    在Windows操作系统上,.exe文件是应用程序的执行文件,用户双击运行即可启动程序。为了使用这个工具,用户需要先解压缩文件,然后在兼容的环境中运行Foxtool.exe,按照软件提供的指示进行操作,例如选择要反编译的...

    nachos程序编程(操作系统)

    "Nachos程序编程"主要涉及的是操作系统领域的实践教学,它是一个小型的操作系统模拟器,用于帮助学生理解操作系统的核心概念和工作原理。在这个实验中,你将深入到操作系统的设计与实现中,通过编写和完善 Nachos ...

    计算机操作系统试题

    计算机操作系统的试题《计算机操作系统》试题库 1. 单项选择题(共200个题目) 100236. 一般用户更喜欢使用的系统是(C )。 A.手工操作 B.单道批处理 C.多道批处理 D.多用户分时系统 有争议:答案是D 100237. 与...

    如何编译uClinux操作系统.doc

    【如何编译uClinux操作系统】 在嵌入式系统开发中,了解如何编译和烧录操作系统至关重要,尤其是针对特定硬件平台如ARM架构。本篇主要介绍如何编译uClinux操作系统,一个专为没有MMU(内存管理单元)的处理器设计的...

    操作系统实验及课程设计代码自动编译系统.zip

    总的来说,这个压缩包中的代码自动编译系统是一个面向教育场景的实用工具,它整合了操作系统、软件工程和编程语言的知识,实现了自动化编译与反馈,为教学和学习带来了便利。通过深入理解和使用这样的系统,学生不仅...

    HRN_操作系统HRN_源代码_

    操作系统是计算机系统的核心组成部分,它负责管理系统的硬件资源和软件资源,为用户提供友好的接口,使得用户能够方便地执行各种任务。在这个名为"HRN_操作系统HRN_源代码_"的压缩包中,包含了实现特定操作系统调度...

    基于单片机的PLC编译程序设计研究毕业设计论文.doc

    编译程序的结构设计直接关系到编译效率和程序的可维护性。设计中考虑到了如何优化编译过程,减少资源消耗,并提高编译速度。通过精心设计的数据结构和算法,编译程序能够在保证稳定性和准确性的同时,大幅提升处理...

    操作系统用户界面命令控制

    通过系统调用,程序员可以编写出与操作系统紧密集成的应用程序,确保程序的高效运行和资源的正确管理。 2.6 Linux和Windows的系统调用 Linux和Windows的系统调用接口各有特点。Linux的系统调用接口是通过C库中的...

    操作系统实验课作业linux编译.zip

    操作系统是计算机科学的基础课程之一,尤其在Linux环境下,学习如何编译和管理操作系统至关重要。Linux是一种自由开源的操作系统,它的源代码可供用户学习和修改,为深入理解操作系统的工作原理提供了便利。在这个...

    最新编译程序行业办公室管理制度.pdf

    因此,制定一套科学、系统的办公室管理制度,对于推动编译程序行业的发展具有极为重要的意义。《最新编译程序行业办公室管理制度》的发布,正是为满足这一需求而生,它为相关企业提供了标准化的内部管理框架和操作...

    Linux_下编译程序的三种方式

    这些工具可以生成跨平台的配置脚本,使得程序能在不同的操作系统和环境中编译。 **CMake** 是一个通用的跨平台构建系统,它的配置文件叫`CMakeLists.txt`。相比于Makefile,CMake提供了一种更加抽象和灵活的方式来...

    操作系统 用户接口实验

    操作系统用户接口实验主要关注的是操作系统与用户交互的方式,这一领域涵盖了命令行接口、系统调用以及内核编译和配置等多个方面。实验的目的在于让学习者深入理解操作系统如何响应用户的指令,并通过实践来掌握这些...

    基于单片机的plc编译程序设计研究-毕业论文.doc

    本文主要探讨了基于单片机的可编程逻辑控制器(PLC)编译程序的设计与实现。PLC是一种在工业控制领域广泛应用的设备,它通过编程实现对自动化系统的控制。单片机作为PLC的核心,其上的编译程序设计至关重要。 在...

    基于单片机的PLC编译程序设计研究毕业设计论文(1).doc

    本文主要探讨了基于单片机的可编程逻辑控制器(PLC)编译程序的设计与研究,这是计算机科学领域中的一个重要议题,特别是在自动化控制和工业生产中具有广泛应用。PLC是用于控制工业设备和过程的电子系统,通过单片机...

    深度探索Linux操作系统

    这种方式的妙处在于,让读者先从宏观上全面认清一个完整的操作系统中都包含哪些组件,各个组件的作用,以及各个组件间的关系,从微观上深入理解系统各个组件的原理,帮助读者达到事半功倍的学习效果,这是作者潜心...

    QT编译程序打包工具.zi

    4. **多平台支持**:QT编译程序打包工具兼容Windows、Linux、macOS等多种操作系统,这意味着开发者可以轻松地为各种平台打包应用。 5. **资源文件管理**:除了代码,打包工具还允许用户包含资源文件,如图片、音频...

    Linux0.01内核分析与操作系统设计

    ### Linux 0.01 内核分析与操作系统设计 #### Linux 0.01:初版的意义与架构 Linux 0.01 是 Linux 的第一个版本,它标志着开源操作系统发展的一个重要里程碑。尽管该版本只有 8413 行代码,但已经具备了操作系统的...

    操作系统实验报告——熟悉linux操作系统

    实验中可能采用了三状态模型(运行、就绪、等待),通过模拟程序展示了这些状态如何相互转换,以及与进程控制块(PCB)的关系。通过自行设计和调试程序,学生可以深入理解进程状态转换的逻辑和PCB在其中的作用,这有...

    高级程序编译与设计复习题

    10. 编译程序的可移植性:编译程序往往需要针对目标机器进行调整,即使两台机器的操作系统功能相同,也不能直接使用。 11. 递归下降分析:递归下降分析是一种自顶向下的语法分析方法,通常用于构造LL(1)解析器。 ...

Global site tag (gtag.js) - Google Analytics