Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1732265
  • 博文数量: 782
  • 博客积分: 2455
  • 博客等级: 大尉
  • 技术积分: 4140
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-06 21:37
个人简介

Linux ,c/c++, web,前端,php,js

文章分类

全部博文(782)

文章存档

2015年(8)

2014年(28)

2013年(110)

2012年(307)

2011年(329)

分类:

2012-01-04 09:00:23

原文地址:C/C++编译过程 作者:juruqiang

   1、编译预处理:

  编译器读取C源程序,对其中的预处理命令(以#开头)和特殊符号进行处理。预处理命令包括主要包括三种,一是宏定义命令,二是条件编译指令,三是头文件包含指令。采用头文件的目的是使某些定义可以供多个不同的C源程序使用。在需要用到这些定义的C源程序中,只需加上#include语句即可,而不必重新定义一遍。预编译程序将头文件中的代码统统加入到源文件,进而产生输出文件。

  除了以上三种预处理命令,还有特殊符号。预编译程序可以识别一些特殊符号。例如在源程序中出现的LINE表示将被解释为十进制表示的当前行号。FILE则被解释为当前编译的源程序的文件名。

  预编译程序完成的,可以说成是对源程序的“替换”工作。经过这个过程,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。

  2、编译、优化:

  编译程序的工作是,通过词法分析、语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码或汇编代码。

  在生成中间代码或汇编代码过程中,可能涉及到优化处理。优化有两种:一种优化仅涉及代码本身,主要是删除公共表达式、循环优化、代码外提、无用代码赋值的删除等。另一种优化设计具体的计算机硬件,比如,如何根据机器硬件执行指令的特点对指令进行调整优化,减少目标代码长度,提高执行效率。

  中间代码或者汇编代码生成以后,编译程序将中间代码转换为目标机器指令的序列,得到对应于源程序的目标文件。目标文件中存放的也就是与源程序等效的目标机器的机器语言代码。目标文件一般至少包含2个段:代码段和数据段。

  3、链接:

  由第二阶段生成的若干对应于多个源程序的目标文件,并不能立即就被执行。其中存在一些问题,比如,某个源文件中的函数可能引用了另一个源文件中的某个符号(如变量或者函数等);在一个源文件中可能调用了某个库文件中的函数,等等。这些问题,需要连接程序来解决。

  连接程序的主要工作就是将有关的目标文件彼此连接。也就是将在一个文件中引用的符号同该符号在另一个文件中的定义连接起来。使得所有这些目标文件成为一个能够被执行的一个整体。

  补充:链接库分为2种

  静态链接

  在这种连接方式下,函数的代码将直接拷贝到最终的可执行文件中。该程序被执行时候,会被装入该进程的虚拟地址空间中。静态链接库实际上是一个或若干目标文件。

  动态链接

  这种方式下,函数的代码被放到称作动态连接库或共享对象的某个目标文件中。链接程序此时的工作只是在生成的可执行文件中,记录下共享对象的名字以及少量关键信息。动态连接库可以被多个进程共享,在运行时候内存中只有一个实例。

  二者比较

  使用动态链接能够使可执行文件较小,并且当共享对象被多个进程使用时节省内存。但有时候系统运行改变或省级,不能保证动态连接库一定可用、有效。

阅读(347) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~