【编译原理】源文件生成目标文件的过程

编译器驱动程序包括预处理器、编译器、汇编器、连接器

下面看各部分的功能:

1 预处理阶段:

     在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并 对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。

      预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令:

指令         用途
    #           空指令,无任何效果
    #include    包含一个源代码文件
    #define     定义宏
    #undef      取消已定义的宏
    #if         如果给定条件为真,则编译下面代码
    #ifdef      如果宏已经定义,则编译下面代码
    #ifndef     如果宏没有定义,则编译下面代码
    #elif       如果前面的#if给定条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写
    #endif      结束一个#if……#else条件编译块
    #error      停止编译并显示错误信息


2 编译阶段:

     将hello.i编译成hello.s  汇编语言程序。各种高级语言可能不同,但是汇编语言大部分都是相同的。

3 汇编阶段:

     将汇编语言代码编译成为及其语言指令,并最终生成可重定位的目标文件的格式。并将结果保存在目标文件hello.o中。

4 链接阶段:

     将源程序调用的包含的库函数的编译好的.o文件链接到我们的源文件中。链接器的输出结果是可执行的目标程序。

 

预处理阶段与链接阶段的关系:

比如这样一条语句:#include 在预处理阶段,stdio这个文件的头文件也就是函数的声明文件在源程序中被展开了,因为后续main函数里面用到用到printf函数的时候,需要去找函数声明来定位函数参数,返回值类型等信息以判断语法错误之类的各种错误。

而链接阶段就是,需要使用到什么函数就链接什么包含什么函数的最小执行文件。

   

你可能感兴趣的:(编译原理)