编译过程

来源:互联网 发布:工商银行数据录入员 编辑:程序博客网 时间:2024/05/17 06:48

由程序生成可执行文件经过了预编译——编译——汇编——链接的过程。其中编译的步骤分为:词法分析、语法分析、语义分析、中间语言生成、目标代码生成及优化(如下图)。

       例子:array[index] = (index + 4) * (2 +6)


首先是词法分析形成一个个的记号,之后进行语法分析产生语法树。


接下来进行语义分析,编译器所能分析的语义是静态语义,所谓静态语义是指在编译期可以确定的语义,与之对应的动态语义就是只有在运行期才能确定的语义。

       静态语义通常包括声明和类型的匹配,类型的转换。动态语义一般指在运行期出现的语义相关的问题(比如多态)。


之后进行中间代码的优化,由于在语法树上做优化比较困难,所以源代码优化器往往将整个语法树转换成中间代码,它是语法树的顺序表示,其实已经很接近目标代码了。但是它一般跟目标机器和运行时环境是无关的,比如它不包含数据的尺寸、变量地址和寄存器的名字等。(其实就是语法树的一种表示)比较常见的就是三地址码和P-代码。

       中间代码使得编译器可以被分为前端和后段。编译器前端负责产生机器无关的中间代码,编译器后端将中间代码转换成目标机器代码。这样对于一些可跨平台的编译器而言,它们可以针对不同的平台使用同一个前端和针对不同极其平台的数个后端。


最后将进行目标代码的生成与优化。目标代码的优化包括选择合适的寻址方式、使用唯一来代替乘除运算、删除多余的指令等。




0 0
原创粉丝点击