编译系统和运行系统

编译系统和运行系统

ID:8846447

大小:232.00 KB

页数:25页

时间:2018-04-09

编译系统和运行系统_第1页
编译系统和运行系统_第2页
编译系统和运行系统_第3页
编译系统和运行系统_第4页
编译系统和运行系统_第5页
资源描述:

《编译系统和运行系统》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、第十章编译系统和运行系统通常,除了编译器外,我们还需要一些其它工具的帮助,才能得到可执行的目标程序,这些工具包括预处理器、汇编器和连接器等。对于Fortran、Pascal和C来说,这些工具都较简单或明显。了解这些工具有助于我们掌握从源程序到可执行目标程序的实际处理过程,这些知识对于参与大型软件系统的开发是很有用的。本章介绍C语言编译系统。另外,目标代码运行时,还需要一些工具的支撑,如动态连接程序、无用单元收集程序等,这些工具的集合称为运行系统。本章还介绍Java语言的运行系统及其无用单元收集程序。10.1C语言的编译系统除了编译器外,我们还需要一些其它的工具来建立一个可执行的目标程序。本

2、节以GNUC编译系统(简称GCC系统)为例,来说明程序设计语言编译系统的一般工作过程。预处理器源程序修改后的源程序可重定位的目标程序可重定位的目标文件库图10.1一个语言编译系统编译器汇编器汇编程序连接器可执行的目标程序一个C源程序可以分成若干个模块,存储在不同的文件中。C编译系统对这些源文件分别进行预处理、编译和汇编、形成可重定位的目标文件;然后再利用连接器将这些目标文件和必要的库文件连接成一个可执行的目标文件,即具有绝对地址的机器代码。这一过程可用图10.1描绘。大多数编译系统提供一个驱动程序来调用语言的预处理器、编译器、汇编器、连接器,以支持用户完成从源程序到可执行程序的翻译。在GC

3、C系统中,驱动程序的名字是gcc(或cc)。下面我们结合一个C语言的程序实例来讨论GCC系统的工作步骤。图10.2中的程序由两个文件main.c和swap.c组成,为便于引用中间的语句,我们增加了行号。在Unix(还有Linux)环境下,键入如下命令可以得到该程序的可执行文件swap:gcc–v–oswapmain.cswap.c25这里,使用选项–v可以输出该编译系统各步骤执行的命令和执行结果,选项–o紧跟着的字符串指示生成的可执行文件的名字。图10.2main.c和swap.c组成的程序main.c(1)#if1(2)intbuf[2];(3)#else(4)intbuf[2]={10

4、,20};(5)#endif(6)voidswap();(7)#defineAbuf[0](8)intmain()(9){(10)scanf("%d,%d",buf,buf+1);(11)swap();(12)printf("%d,%d",A,buf[1]);(13)return0;(14)}swap.c(1)externintbuf[2];(2)int*bufp0=buf;(3)int*bufp1;(4)voidswap()(5){(6)inttemp;(7)bufp1=buf+1;(8)temp=*bufp0;(9)*bufp0=*bufp1;(10)*bufp1=temp;(11)}

5、10.1.1预处理器gcc首先调用预处理器cpp,将源程序文件翻译成一个ASCII中间文件,它是经修改后的源程序。图10.3是main.c经预处理后生成的中间文件main.i。图10.3main.i的内容(1)#1“main.c”(2)(3)intbuf[2];(4)(5)(6)(7)voidswap();(8)(9)intmain()(10){(11)scanf("%d,%d",buf,buf+1);(12)swap();(13)printf("%d,%d",buf[0],buf[1]);(14)return0;(15)}预处理器产生编译器的输入,它实现以下功能:(1)文件包含预处理器可

6、以把源程序文件中的包含声明(#include)扩展为程序正文。例如,当源程序文件中含有语句#include时,预处理器会在系统标准路径下搜索stdio.h,再用文件stdio.h中的内容来代替这个语句。25(2)宏展开C程序中可以使用#define来定义宏,一个宏定义给出一段C代码的缩写。预处理器将源程序文件中出现的、对宏的引用展开成相应的宏定义,这一过程称为宏展开。例如,main.c的第(7)行为宏A的定义,第(12)行中的A是对该宏的引用。在预处理后产生的main.i中,宏A的定义转换成一个空行,对宏A的引用则展开成buf[0]。(3)条件编译预处理器根据#if和#i

7、fdef等编译命令及其后的条件,将源程序中的某部分包含进来或排除在外。通常把排除在外的语句转换成空行。显然,实现一个这样的预处理器并不困难。有些语言的预处理器用于增强老的语言,使之包含现代的控制结构和数据类型。从增强语言到老语言的翻译由这样的预处理器完成。10.1.2汇编器GCC系统的编译器cc1产生汇编代码,main.i被编译成的ASCII汇编文件main.s见图10.4。这些汇编代码由汇编器进一步处理。最简单的汇编器

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。