编译器工作过程
- 格式:pptx
- 大小:73.98 KB
- 文档页数:9


编译器和解释器的基本工作流程
编译器和解释器都是将程序翻译成计算机可以理解的机器语言,让计算机能够执行程序的工具。
它们的基本工作流程如下:
1. 编写源程序:程序员使用高级语言编写程序,例如 C++、Java、Python 等。
2. 编译器的工作流程:
(1)词法分析:编译器将源程序按照词法规则分解为一个个单独的单词,称为词法分析。
(2)语法分析:编译器将单词按照语法规则分解为语法树,称为语法分析。
(3)中间代码生成:编译器将语法树转化为中间代码,例如汇编语言或机器码。
(4)优化:编译器对生成的中间代码进行优化,以提高程序的性能。
(5)目标代码生成:编译器将中间代码转化为目标机器的机器码,以便计算机直接执行。
3. 解释器的工作流程:
(1)词法分析:解释器将源程序按照词法规则分解为一个个单独的单词,称为词法分析。
(2)语法分析:解释器将单词按照语法规则分解为语法树,称为语法分析。
(3)解释执行:解释器不生成中间代码和目标代码,而是直接按照语法树执行程序。
编译器的优点是执行速度快,目标代码的执行效率高,但需要在编译过程中花费时间,需要提前编译好程序才能执行。
而解释器的优点是不需要编译过程,可以直接执行程序,但执行速度较慢,因为需要在运行时解析和执行程序。
编译器的⼯作过程简单的说,其实要理解cpp⽂件与头⽂件有什么不同之处,⾸先需要弄明⽩编译器的⼯作过程,⼀般说来编译器会做以下⼏个过程:1.预处理阶段(也就是常说的切token)2.词法与语法分析阶段3.编译阶段,⾸先编译成纯汇编语句,再将之汇编成跟CPU相关的⼆进制码,⽣成各个⽬标⽂件 (.obj⽂件)4.连接阶段,将各个⽬标⽂件中的各段代码进⾏绝对地址定位,⽣成跟特定平台相关的可执⾏⽂件,当然,最后还可以⽤objcopy⽣成纯⼆进制码,也就是去掉了⽂件格式信息。
(⽣成.exe⽂件)编译器在编译时是以cpp⽂件为单位进⾏的,也就是说如果你的项⽬中⼀个cpp⽂件都没有,那么你的项⽬将⽆法编译。
连接器是以⽬标⽂件为单位,它将⼀个或多个⽬标⽂件进⾏函数与变量的重定位(确定每个函数和变量相对于程序起始位置的地址,这⾥还不是真正的内存的地址,真正内存的地址要等到程序载⼊器根据某个寄存器的地址确定),⽣成最终的可执⾏⽂件。
在PC上的程序开发,⼀般都有⼀个main函数,这是各个编译器的约定。
当然,你如果⾃⼰写连接器脚本的话,可以不⽤main函数作为程序⼊⼝ (main .c⽂件⽬标⽂件可执⾏⽂件)有了这些基础知识,再⾔归正传,为了⽣成⼀个最终的可执⾏⽂件,就需要⼀些⽬标⽂件,也就是需要cpp⽂件,⽽这些cpp⽂件中⼜需要⼀个main函数作为可执⾏程序的⼊⼝,那么我们就从⼀个cpp⽂件⼊⼿,假定这个cpp⽂件内容如下:main.c函数#include <stdio.h>#include "mytest.h"int main(int argc,char **argv){test = 25;printf("test.................%d\n",test);return0;}mytest.h头⽂件内容如下:int test;现在以这个例⼦来讲解编译器的⼯作:1.预处理阶段:编译器以cpp⽂件作为⼀个单元,⾸先读这个cpp⽂件,发现第⼀句与第⼆句包含⼀个头⽂件,就会在所有搜索路径中寻找这两个头⽂件,找到之后,就会到相应头⽂件中再去处理宏、变量、函数声明、嵌套的头⽂件等,检测依赖关系,进⾏宏替换,看是否有重复定义与声明的情况发⽣,最后将那些⽂件中所有的东东全部扫描进这个当前的cpp⽂件中,形成⼀个中间"cpp⽂件"。
程序编译的四个步骤程序编译通常涉及以下四个步骤:预处理、编译、汇编和链接。
1.预处理预处理是编译过程的第一步,它主要负责对源代码进行一些预处理操作。
预处理器工具通常被称为预处理程序,它会根据源代码文件中的预处理指令来修改源代码。
预处理指令位于源代码文件的开头,以“#”字符开头。
预处理指令主要包括宏定义、条件编译和包含文件等。
在预处理阶段,预处理器会执行以下操作:-展开宏定义:将代码中的宏定义替换为相应的代码片段。
-处理条件编译:根据条件编译指令的结果,决定是否包含或排除一些代码。
-处理包含文件:将文件中的包含文件指令替换为实际的文件内容。
预处理后的源代码通常会生成一个中间文件,供下一步编译使用。
2.编译编译是程序编译过程的第二个阶段。
在编译阶段,编译器将预处理生成的中间文件翻译成汇编语言。
编译器会按照源代码的语法规则,将源代码转换为汇编语言指令,生成目标文件(也称为汇编代码文件)。
编译器在编译过程中执行以下操作:-词法分析:将源代码分割为多个词法单元,如关键字、标识符和运算符等。
-语法分析:根据语言的语法规则,分析词法单元的组合,生成语法树。
-语义分析:检查语法树的语义正确性,进行类型检查等。
-优化:对生成的中间代码进行各种优化,以提高程序执行效率。
编译器输出的目标文件通常是汇编语言形式的代码,以便下一步汇编使用。
3.汇编汇编是编译过程的第三个阶段,它将编译器生成的汇编代码翻译成目标机器码。
汇编器(或称为汇编程序)将汇编代码中的指令和操作数翻译为目标机器指令的二进制表示。
汇编器在汇编过程中执行以下操作:-识别和解析汇编指令:将汇编代码中的汇编指令和操作数分割解析。
-确定存储器地址:根据符号的引用和定义,计算并分配存储器地址。
-生成目标机器指令:将汇编指令和操作数翻译为目标机器指令的二进制表示。
汇编器的输出是一个或多个目标文件,每个目标文件都包含可在目标机器上执行的二进制指令。
4.链接链接是编译的最后一个阶段,它将多个目标文件和库文件组合在一起,生成最终的可执行文件。
请简述编译器和解释器的基本工作流程
编译器和解释器是两种常见的程序语言处理工具,它们的基本工作流程有所不同。
编译器的基本工作流程:
1. 词法分析:将源代码分解成单词或符号,例如变量名、关键字、运算符等。
2. 语法分析:将单词或符号组成的序列转换成语法树,检查语法是否正确。
3. 语义分析:检查语法树是否符合语义规则,例如变量是否定义、类型是否匹配等。
4. 代码生成:将语法树转换成目标代码,例如汇编语言或机器码。
5. 优化:对目标代码进行优化,例如删除冗余代码、减少指令数等。
6. 目标代码生成:将优化后的代码生成可执行文件或库。
解释器的基本工作流程:
1. 词法分析:将源代码分解成单词或符号,例如变量名、关键字、运算符等。
2. 语法分析:将单词或符号组成的序列转换成语法树,检查语法是
否正确。
3. 语义分析:检查语法树是否符合语义规则,例如变量是否定义、类型是否匹配等。
4. 解释执行:逐行解释执行源代码,将代码转换成机器指令并执行。
编译器和解释器的区别在于代码生成的方式不同。
编译器将源代码转换成目标代码后再执行,而解释器则直接解释执行源代码。
因此,编译器生成的可执行文件或库可以在不同的机器上运行,而解释器需要在每台机器上重新解释执行源代码。
总的来说,编译器和解释器都是将源代码转换成机器指令的工具,但它们的基本工作流程有所不同。
编译器需要将源代码转换成目标代码后再执行,而解释器则直接解释执行源代码。
在实际应用中,可以根据需要选择编译器或解释器来处理程序语言。