1.概述
在任何一种实现中,存在两种不同的环境。第一种是翻译环境,在这个环境中,源代码被转换为可执行的机器指令。第二种执行环境用于实际执行代码。这两种环境不必位于同一台机器上,例如交叉编译器就是在一台机器上运行,但他所产生的可执行代码运行,但它所产生的可执行代码运行于不同类型的机器上。操作系统也是如此。标准同时讨论了独立环境。就是不存在操作系统的环境。你可能在嵌入式系统中遇到这种类型的环境。
翻译阶段由几个步骤组成,组成一个程序的每个(有可能有多个)源文件通过编译过程分别转换为目标代码。然后,各个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。链接器同时也会引入标准函数库中任何被该程序所用到的函数,而且它也可以搜索程序员个人的程序库,将其中需要使用的函数也链接到程序中。编译过程本身也由几个阶段组成,首先是预处理器处理,在这个阶段,预处理器在源代码上执行一些文本操作。然后,源代码经过解析,判断它的语句的意思。第2个阶段是产生绝大多数错误和警告信息的地方。随后,便产生目标代码。目标代码是机器指令的初步形式,用于实现程序的语句。如果我们在编译程序的命令行中加入了要求进行的选项,优化器就会对目标代码进一步进行处理,使它效率更高。优化过程需要额外的时间,所以在程序调试完毕并准备生成正式产品之前一般不进行这个过程。至于目标代码是直接产生的,还是先以汇编语言语句的形式存在,然后再经过一个独立的阶段编译成目标文件。
2.编译过程
用于编译和链接程序的特定命令在不同的系统中各不相同,但许多都和这里所描述的两种系统差不多。在绝大多数UNIX系统中,编译器可以用多种不同的方法调用。
(1)编译并链接一个完全包含于一个源文件的程序,命令产生一个的可执行程序,再产生一个中间文件,但在链接过程完成后会被删除(2)编译并链接几个源文件,当编译的源文件超过一个时,中间文件便不会删除,这就允许你对程序进行修改后,只对那些进行过改动的源文件进行重新编译。(3)编译一个源文件,并把其和中间文件链接在一起(4)编译单个源文件,并产生一个中间文件,以后再进行链接(5)编译几个源文件,并为每个文件产生一个中间文件。(6)链接几个中间文件。
集成开发环境是一个完整的独立编程工具,它包括源代码编辑器,调试器或编译器。
3.执行过程
程序的执行过程也需要经历几个阶段,首先,程序必须载入到内存中。在宿主环境中(也就是具有操作系统的环境),这个任务由操作系统完成。那些不是存储在堆栈中尚未初始化的变量将在这个时候得到初始值。在独立环境中,程序的载入必须由手工安排,也可能是通过把可执行代码置入只读内存(ROM)来完成。
然后程序的执行边开始。在宿主环境中,通过一个小型的启动程序与程序链接在一起。它负责处理一系列日常失误,如收集命令行参数以便成像能够访问他们。接着,便调用main函数。
开始执行程序代码,在绝大多数机器里,程序将使用一个运行时堆栈,它用于存储函数的局部变量和返回地址。程序同时也可以使用静态内存,存储于静态内存中的变量在程序整个执行过程中将一直保留它们的值。
程序执行的最后一个阶段就是程序的终止,它可以由多种不同的原因引起。“正常”终止就是main函数返回。有些执行环境允许程序返回一个代码,提示程序为什么停止执行。在宿主环境中,启动程序将再次取得控制权,并可能执行各种不同的日常任务,如关闭那些程序可能使用过但并未显式关闭的任何文件。除此之外,程序也可能是由于用户按下break键或者电话连接的挂起而终止,另外也可能是由于在执行过程中出现错误而自行中断。
所有的注释都会被预处理器拿掉,取而代之的是一个空格。