【C】翻译与执行

版权声明:原创,还是不要转载了吧,如果忍不住要转载,就一定要注明地址哦! https://blog.csdn.net/Reborn_Lee/article/details/82052590

环境

在ANSI C 的任何一种实现中,存在两种不同的环境。分别为: 翻译环境(translation environment)和 执行环境(execution environment)。

在翻译环境中,源代码被转换为可执行的机器指令;执行环境,用于实际执行代码。


翻译

翻译阶段由几个步骤组成,组成一个程序的每个源文件通过编译过程分别转换为目标代码(object code)。然后,各个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它也可以搜索程序员个人的程序库,将其中需要使用的函数也链接到程序中。

如下图描述了这个过程:

编译过程本身也分为几个阶段,首先是预处理器(preprocessor)处理。在这个阶段,预处理器在源代码上执行一些文本操作。例如,用实际值代替由 #define 指令定义的符号以及读入由 #include 指令包含的文件的内容。

然后,源代码经过解析(parse),判断它的语句的意思。第2个阶段是产生绝大多数错误和警告信息的地方。

随后,便产生目标代码。目标代码是机器指令的初步形式,用于实现程序的语句。

如果我们在编译程序的命令行中加入了要求进行优化的选项,优化器(optimizer)就会对目标代码进一步进行处理,使它效率更高。


注意:文件名约定

C源代码通常保存于以 .c 扩展名命名的文件中。

由#include 指令包含到C源代码的文件称为头文件,通常具有扩展名 .h。

至于目标文件名,不同的环境可能具有不同的约定。例如,在UNIX系统中,它们的扩展名是.o,但在MS-DOS系统中,它们的扩展名为.obj。


执行

程序的执行过程,也需要经历几个阶段。

首先,程序必须载入内存中。在宿主环境中(也就是具有操作系统的环境),这个任务由操作系统完成。

在自由式环境中,程序常常永久存储于ROM中。

然后,程序的执行便开始。在宿主环境中,通常一个小型的启动程序与程序链接在一起。它负责处理一系列日常事务。

接着,便调用main函数,开始执行程序代码。在绝大多数机器中,程序将使用一个运行时堆栈(stack),它用于存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中变量在程序的整个执行过程中将一直保留它们的值。

程序执行的最后一个阶段就是程序的终止,它可以由多种不同的原因引起。“正常”终止就是mian函数返回。在宿主环境中,启动程序将再次取得控制权,并可能执行各种不同的日常任务,如关闭那些程序可能使用过但并未显式关闭的任何文件。除此之外,也可能是由于在执行过程中出现错误而自行中断。

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/82052590