和很多程序员一样,编译器到目前为止对我还存在一些让我迷惑的地方。比如编译器与操作系统的关系,编译器与CPU的关系,动态链接器从哪查找共享库等。让人困惑的原因有几,第一是编译器的功能角色特殊,编译器是生成程序的程序;第二是编译过程变得越来越复杂[注],一支编译器支持多种程序语言、支持共享库、编译优化,编译与链接可分开等;第三,操作系统的介入。本文试着从第三点——操作系统介入编译过程后对编译器的影响,看看操作系统与编译器有什么关系。
注:编译过程变复杂源于计算机应用变复杂。例如应用程序项目越来越庞大,功能越来越多;为了管理大项目,拆分源程序文件为多个;为了提高程序的性能,目标程序文件的链接期被延迟到运行前;为了程序的灵活安装和升级,引入各种脚本工具,如make,configure(shell)。
编译程序
我们看看编译器的一种传统定义:
编译程序是一支将抽象度较高的编程语言程序(也称源程序)【转化】成抽象度较低的编程语言程序(也称目标程序)的【程序】[注]。抽象度的两端分别是机器语义和人理解语义。【处理器体系】和【编程语言】是一支编译程序的根本属性。
注:以下仅使用【程序】一语,“器”是一种形象的比喻,不够严谨;而软件(software)是产品性的程序,最好只用在商业语境中。
以上对编译程序的定义描述在【现代意义下】对全面认识编译程序是不够的,因为它没有涉及操作系统,没有涉及现代的复杂的程序构建过程。有一定开发经验的程序员都知道,程序的“编译过程”包括编译、链接&#