程序的编译
由于自己对程序的编译过程一直很模糊,所以写这篇博客帮助自己梳理并且记忆学到的知识。
一台计算机上所有的程序都是由某种编程语言写成的,而在程序运行之前,必须将由编程语言写成的源文件翻译成计算机可以读懂的二进制代码(目标文件)。实现这个功能的工具就是编译器(compiler)。编译器从源文件到生成可执行文件的过程实际上又可大体分为编译预处理,句法分析和语义分析,代码生成与优化,汇编,链接四个部分。
- 编译预处理(preprocessing):
该阶段主要是处理#include命令和宏展开以及其他的一些预处理命令。该阶段生成的文件的扩展名一般是.i(c语言)和.ii(c++) - 句法分析和语义分析(parsing and semantic analysis):
对输入文件进行句法分析生成parse tree,再对parse tree进行语义分析,计算表达式类型并分析代码里有没有错误。这个阶段负责输出代码的错误和警告信息。输出形式是Abstract Syntax Tree(AST) - 代码生成与优化(code generation and optimization):
将上一个阶段的输出(AST)翻译成低级的中间码(汇编文件)。该阶段负责对代码的优化(有不同的优化等级)。输出文件为.s文件 - 汇编(assembling):
通过汇编器(assembler)将.s文件翻译成最终的目标文件也就是二进制文件,输出文件为.o文件 - 链接(linking):
通过链接器(linker)将不同的目标文件以及用到的库文件链接起来形成最终的可执行文件
Comments
Post a Comment