典型的编译器负责把高级语言编写的源代码转换为机器(指令)代码或汇编代码。如果运行编译器的CPU 或操作系统是一个类型,编译后的代码是另一种类型的CPU 的指令,称此为交叉编译器(cross-compiler)。将低级语言(例如机器或汇编)转换为高级语言(如C 语言)的编译器称为反向编译器(decompiler)。反向编译比正向编译更难实现。高级语言之间的转换程序,例如将FORTRAN 语言转换为C语言,称为源编译器。
在构造编译器时,一般把编译器分为前端、中端和后端,如图4-1所示。
方舟编译器
图4-1 支持多语言、多目标机的编译器的工作过程(www.xing528.com)
前端(front end)先对源代码进行词法、语法和语义检查,例如,变量的类型定义与赋给它的值的类型是否一致。编译器如果发现错误,就会产生一个错误或警告(error and warning),并指出对应的语句行。如果没有任何错误,前端再做语法和语义分析,并把该语言转换为中间表达(IR-intermediate representation)形式,称为中间代码。
中端(middle end)负责对中间代码进行优化,优化是针对目标CPU 进行的。用中间表达将源代码和目标代码分割开的目的是让编译器能支持多种语言和多种目标机的指令格式。中端优化的例子有,消除无用的废代码或不允许的代码,重新分配计算空间等。优化过的中间代码再交给后端处理。
后端(back end)接收优化过的中间代码。然后针对目标CPU 的结构,进行分析、转换和优化。后端产生目标CPU 的汇编代码和机器代码,分配指令所用的寄存器。后端执行指令调度,重新分配指令,让指令尽可能地并行执行。后端的典型输出是机器代码文件。
一般来讲,编译器生成的机器指令并不能在机器上直接运行,因为编译出的机器代码地址是相对地址。如果有多个程序,还需要把这些程序的目标代码与编译厂商提供的运行库装配到一起,形成可执行文件。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。