C语言核心技术—第一章下

第一章:C语言基础

1.6编译器运行原理

​ 用文本编辑器写完源码,编译器对翻译单元进行处理,若没有发现错误,则会生成包含对应机器码的目标文件(扩展名为.o或.obj)

​ 目标文件也成为模块,一个链接库包含多个编译好可以快速获取的模块

​ 然后编译器调用链接器将所有目标文件和所用到的链接库函数结合起来,成为一个可执行文件

在这里插入图片描述

1.6.1编译的8个逻辑步骤

​ (1)从源码读取并转换字符,如有必要将字符转换成源代码字符集的字符

​ (2)无论何时,只要反斜线后紧跟换行符,预处理器都会将两者删除,因为行尾字符视为预处理器命令的终止,反斜线可让预处理命令(如宏定义)可以在下一行继续

​ (3)将源码文件分解为若干预处理器标记和空格符序列,每个注释被看作一个空格

​ (4)执行预处理命令,展开宏调用

​ //1~4不仅作用于源码文件,也作用于#include命令插入的文件。

​ (5)字符常量和字符串字面量中的字符和转义序列被转换成运行字符集中对应的字符

​ (6)相邻字符串字面量被连接为一个字符串

​ (7)编译器分析标记序列,生成对应机器码

​ (8)链接器解析对外部函数和对象的引用,并生成可执行文件

1.6.2标记

​ 标记可以是关键字、标识符、常量、字符串字面量、符号

​ 将源码解析成标记过程中,采用原则如下:

​ 为避免歧义,每个连续的非空格符必须附加到正在读取的标记后面,直到出现附加后使得有效标记变为无效为止

​ 例如:a+++b。第一个+无法当作标识符的一部分,也不能当作以a开头的关键字的一部分,所以+是一个新标记的开始。第二个+附加到第一个+后面形成一个有效标记++,第三个+附加上来+++不是有效标记,因此表达式被分解成a++ + b

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

猜你喜欢

转载自blog.csdn.net/Ivan_zcy/article/details/84887829
今日推荐