编译器就是将高级语言翻译成机器语言的工具
词法分析:源代码程序通过扫描器的有限状态机算法将代码字符序列分割成一系列的记号。记号主要包含关键字、标识符、字面量和特殊字符。现成工具:lex
语法分析:通过上下文无关语法对记号进行语法分析,产生语法树(是一棵以表达式为节点的树)。语法分析的同时,运算符的优先级及含义也被确定。现成工具yacc
语义分析:在语法分析完成对表达式的语法层面分析后,继续分析该语句是否有真正的含义。编译器支持静态语义的分析(静态语义是指在编译器可以确定的语义,动态语义是指在运行期才能确定的语义),分析完成后语法树的表达式将被标识类型。
中间语言生成:代码优化器将整个语法树转换成中间代码,是语法树的顺序表示,已经比较接近目标代码了。单此时的中间代码与目标机器和运行环境无关(编译器前端),如它不包含数据的尺寸、变量地址和寄存器的名称。
目标代码生成及优化:代码生成器将中间代码转换成目标机器代码,整个过程依赖于目标机器。目标代码优化器对上述的目标代码进行优化,如选择合适的寻址方式,使用位移来代替乘法运算,删除多余的指令。