编译原理(一)
最近在学习编译原理这一门课程,顺便来对所学知识进行一下回忆
开篇
翻译程序和编译程序
-
翻译程序:翻译不就和中英互译很像吗?这样一想,那翻译可以用 JAVA 版的 Hello World 程序翻译为 C++ 版的 Hello World 解释,这解释应该还可以吧,也是一种语言翻译成另一种语言。
-
编译程序:这个就相对复杂一些,但也有翻译程序的影子;编译程序是将高级语言作为源程序,编译为低级语言(汇编、机器语言,机器语言也就是那些0、1组成的长长的一串串数字,汇编就高级一些用到了英文加强了对源程序的解释),这些低级语言是直接面向机器的(比如电脑)。
编译程序结构框图(先盗个图,图片出处在图的右下角,希望原作者能够原谅)
词法分析
词这个字很明显,比如暂且把 just do it 看成一段英文句子吧,我们来进行分析分析,其中 just 和 do 和 it 都是单词,这就是词法分析。
比如源程序:sum = a + money/2;
单词符号 | 词素 |
---|---|
标识符 | sum |
赋值运算符 | = |
标识符 | a |
加法运算符 | + |
标识符 | money |
除法运算符 | / |
整数 | 2 |
空格 | 分析器忽略 |
界符 | ; |
语法分析
语法分析是在词法分析的基础上进行的,根据语言语法的规则从单词符号串中识别各种语法单位并进行语法检查。常用的表示方法是语法树,树中每个内部节点表示一个运算,而该节点的子节点表示运算的分量,见下图:
语义分析及中间代码生成
语义是指对语言的各种语法单位进行赋予具体的意义
代码优化
这个就是对前期中间代码进行等价变换或改造,目的是为获得更高效的省时间和空间的代码,看图
目标代码生成
目标代码生成以中间表示形式作为输出,并把它映射为目标语言。如果目标语言是机器代码,则必须为每个变量选择寄存器或内存位置,中间指令则被翻译为能够完成相同任务的机器指令序列。代码生成的一个至关重要的方面是合理分配寄存器以存放变量的值。
在编译程序的各个阶段,都要涉及表格管理和错误处理
重要的方面是合理分配寄存器以存放变量的值。
在编译程序的各个阶段,都要涉及表格管理和错误处理