C语言/C++编译过程 | 您所在的位置:网站首页 › c语言程序编译过程 › C语言/C++编译过程 |
C语言/C++编译过程
原创|其它|编辑:郝浩|2010-04-12 10:16:58.000|阅读 608 次 概述:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。本文将对C语言的编译过程进行详细的介绍,希望对大家的学习有所帮助。 # 31款JAVA开发必备控件和工具 # 五月热门软控件产品低价促销,为正版软件护航>> 1、编译预处理: 编译器读取C源程序,对其中的预处理命令(以#开头)和特殊符号进行处理。预处理命令包括主要包括三种,一是宏定义命令,二是条件编译指令,三是头文件包含指令。采用头文件的目的是使某些定义可以供多个不同的C源程序使用。在需要用到这些定义的C源程序中,只需加上#include语句即可,而不必重新定义一遍。预编译程序将头文件中的代码统统加入到源文件,进而产生输出文件。 除了以上三种预处理命令,还有特殊符号。预编译程序可以识别一些特殊符号。例如在源程序中出现的LINE表示将被解释为十进制表示的当前行号。FILE则被解释为当前编译的源程序的文件名。 预编译程序完成的工作,可以说成是对源程序的“替换”工作。经过这个过程,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。 2、编译、优化: 编译程序的工作是,通过词法分析、语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码或汇编代码。 在生成中间代码或汇编代码过程中,可能涉及到优化处理。优化有两种:一种优化仅涉及代码本身,主要是删除公共表达式、循环优化、代码外提、无用代码赋值的删除等。另一种优化设计具体的计算机硬件,比如,如何根据机器硬件执行指令的特点对指令进行调整优化,减少目标代码长度,提高执行效率。 中间代码或者汇编代码生成以后,编译程序将中间代码转换为目标机器指令的序列,得到对应于源程序的目标文件。目标文件中存放的也就是与源程序等效的目标机器的机器语言代码。目标文件一般至少包含2个段:代码段和数据段。 3、链接: 由第二阶段生成的若干对应于多个源程序的目标文件,并不能立即就被执行。其中存在一些问题,比如,某个源文件中的函数可能引用了另一个源文件中的某个符号(如变量或者函数等);在一个源文件中可能调用了某个库文件中的函数,等等。这些问题,需要连接程序来解决。 连接程序的主要工作就是将有关的目标文件彼此连接。也就是将在一个文件中引用的符号同该符号在另一个文件中的定义连接起来。使得所有这些目标文件成为一个能够被操作系统执行的一个整体。 补充:链接库分为2种 静态链接 在这种连接方式下,函数的代码将直接拷贝到最终的可执行文件中。该程序被执行时候,会被装入该进程的虚拟地址空间中。静态链接库实际上是一个或若干目标文件。 动态链接 这种方式下,函数的代码被放到称作动态连接库或共享对象的某个目标文件中。链接程序此时的工作只是在生成的可执行文件中,记录下共享对象的名字以及少量关键信息。动态连接库可以被多个进程共享,在运行时候内存中只有一个实例。 二者比较 使用动态链接能够使可执行文件较小,并且当共享对象被多个进程使用时节省内存。但有时候系统运行改变或省级,不能保证动态连接库一定可用、有效。 标签:本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至[email protected] 文章转载自:网络转载 上一篇:Google决定资助开发Ogg Theora 下一篇:ASP.NET使用多线程范例 |
CopyRight 2018-2019 实验室设备网 版权所有 |