自己动手构造编译系统:编译、汇编与链接1.3.1 预编译

1.3.1  预编译

  

       GCC对源文件的第一阶段的处理是预编译,主要是处理宏定义和文件包含等信息。命令格式如下:

$gcc –E hello.c
–o hello.i

  预编译器将hello.c处理后输出到文件hello.i,hello.i文件内容如下:

# 1
"hello.c"

# 1
"<built-in>"

# 1
"<command-line>"

# 1
"hello.c"

……

extern int
printf (const char *__restrict __format, ...);

……

int main()

{

     printf("Hello World!");

     return 0;

}

  比如文件包含语句#include<stdio.h>,预编译器会将stdio.h的文件内容拷贝到#include语句声明的位置。如果源文件内使用#define语句定义了宏,预编译器则将该宏的内容替换到其被引用的位置。如果宏定义本身使用了其他宏,则预编译器需要将宏递归地展开。

  我们可以将预编译的工作简单地理解为源码的文本替换,即将宏定义的内容替换到宏的引用位置。当然,这样理解有一定的片面性,因为要考虑宏定义中使用其他宏的情况。事实上预编译器的实现机制和编译器有着很大的相似性,因此本书描述的编译系统将重点放在源代码的编译上,不再独立实现预编译器。然而,我们需要清楚的事实是:一个完善的编译器是需要预编译器的。

时间: 2024-10-30 01:00:18

自己动手构造编译系统:编译、汇编与链接1.3.1 预编译的相关文章

自己动手构造编译系统:编译、汇编与链接

"自己动手系列" 自己动手构造编译系统 编译.汇编与链接 范志东  张琼声  著 图书在版编目(CIP)数据 自己动手构造编译系统:编译.汇编与链接 / 范志东,张琼声著. -北京:机械工业出版社,2016.7 (自己动手系列) ISBN 978-7-111-54355-8 I. 自- II. ①范- ②张- III. 编译器 IV. TP314 中国版本图书馆CIP数据核字(2016)第163077号 自己动手构造编译系统:编译.汇编与链接 出版发行:机械工业出版社(北京市西城区百万

自己动手构造编译系统:编译、汇编与链接导读

Preface前 言 本书适合谁读 本书是一本描述编译系统实现的书籍.这里使用"编译系统"一词,主要是为了与市面上描述编译器实现的书籍进行区分.本书描述的编译系统不仅包含编译器的实现,还包括汇编器.链接器的实现,以及机器指令与可执行文件格式的知识.因此,本书使用"编译系统"一词作为编译器.汇编器和链接器的统称. 本书的目的是希望读者能通过阅读本书清晰地认识编译系统的工作流程,并能自己尝试构造一个完整的编译系统.为了使读者更容易理解和学习编译系统的构造方法,本书将描述

自己动手构造编译系统:编译、汇编与链接1.3 GCC的工作流程

1.3  GCC的工作流程       在着手构造编译系统之前,需要先介绍编译系统应该做的事情,而最具参考价值的资料就是主流编译器的实现.GNU的GCC编译器是工业化编译器的代表,因此我们先了解GCC都在做什么. 我们写一个最简单的"HelloWorld"程序,代码存储在源文件hello.c中,源文件内容如下: #include<stdio.h> int main() {      printf("Hello World!");      return

自己动手构造编译系统:编译、汇编与链接2.6 本章小结

2.6  本章小结      本章介绍了编译系统的设计,并按照编译.汇编和链接的顺序阐述了它们的内部实现.同时,也介绍了x86指令和ELF文件结构等与操作系统及硬件相关的知识. 通过以上的描述,可以了解高级语言如何被一步步转化为汇编语言,以及词法分析.语法分析.语义分析.符号表和代码生成作为编译器的主要模块,其内部是如何实现的.汇编器在把汇编语言程序转化为二进制机器代码时,做了怎样的工作:汇编器的词法和语法分析与编译器有何不同:汇编器如何生成二进制指令和目标文件的信息.链接器在处理目标文件时是如

自己动手构造编译系统:编译、汇编与链接2.1 编译程序的设计

第2章 编译系统设计 麻雀虽小,五脏俱全. --<围城>    一个完善的工业化编译系统是非常复杂的,为了清晰地描述它的结构,理解编译系统的基本流程,不得不对它进行"大刀阔斧"地删减.这为自 己动手实现一个简单但基本功能完整的编译系统提供了可能.虽然本书设计的是简化后的编译系统,但保留了编译系统的关键流程.正所 谓"麻雀虽小,五脏俱全",本章从全局的角度描述了编译系统的基本结构,并按照编译.汇编和链接的流程来介绍其设计. 2.1  编译程序的设计 编译器

自己动手构造编译系统:编译、汇编与链接1.2 历史渊源

1.2  历史渊源    历史上很多新鲜事物的出现都不是偶然的,计算机学科的技术和知识如此,编译系统也不例外,它的产生来源于编程工作的需求.编程本质上是人与计算机交流,人们使用计算机解决问题,必须把问题转化为计算机所能理解的方式.当问题规模逐渐增大时,编程的劳动量自然会变得繁重.编译系统的出现在一定程度上降低了编程的难度和复杂度. 在计算机刚刚诞生的年代,人们只能通过二进制机器指令指挥计算机工作,计算机程序是依靠人工拨动计算机控制面板上的开关被输入到计算机内部的.后来人们想到使用穿孔卡片来代替原

自己动手构造编译系统:编译、汇编与链接2.1.2 语法分析

2.1.2  语法分析        词法分析器的输入是文本字符串,语法分析器的输入则是词法分析器识别的词法记号序列.语法分析器的输出不再是一串线性符号序列,而是一种树形的数据结构,通常称之为抽象语法树.见图2-4. 继续前面赋值语句的例子,我们可以先看看它可能对应的抽象语法树,如图2-5所示.   图2-5  抽象语法树示例 从图2-5中可以看出,所有的词法记号都出现在树的叶子节点上,我们称这样的叶子节点为终结符.而所有的非叶子节点,都是对一串词法记号的抽象概括,我们称之为非终结符,可以将非终

自己动手构造编译系统:编译、汇编与链接1.3.2 编译

1.3.2  编译      接下来GCC对hello.i进行编译,命令如下: $gcc –S hello.i –o hello.s 编译后产生的汇编文件hello.s内容如下:      .file                "hello.c"      .section           .rodata .LC0:      .string  "Hello World!"      .text .globl main      .type        m

自己动手构造编译系统:编译、汇编与链接1.3.3 汇编

1.3.3  汇编             接着,GCC使用汇编器对hello.s进行汇编,命令如下: $gcc –c hello.s –o hello.o 生成的目标文件hello.o,Linux下称之为可重定位目标文件.目标文件无法使用文本编辑器直接查看,但是我们可以使用GCC自带的工具objdump命令分析它的内容,命令格式如下: $objdump –sd hello.o 输出目标文件的主要段的内容与反汇编代码如下: hello.o:     file format elf32-i386