本科是网络工程,由于没有学<<编译原理>>这门课,打算两个月把国科大的编译原理梳理完,把其中我认为的精髓概括一下,三天一篇,作为笔记。
为了了解什么是编译程序,首先了解下翻译程序是什么:
把某一种语言程序(称为源语言程序)等价地转换为另一种语言程序(目标语言程序)的程序。

而编译程序就是一种翻译程序。它把某一种高级语言程序等价转换为另一种低级语言程序(如汇编语言或机器语言)的程序。 编译程序还有以下分类:
两个概念:
还有一种翻译程序——解释程序(Interpreter),即把源语言的源程序作为输入,但不产生目标程序,而是边解释边执行源程序。

编译程序是怎样把高级语言(如C++)翻译成低级语言的(如机器指令)的?
The complier can translate a program from source language to target language.
以把英文翻译为中文为例。
任务:对源程序字符串进行扫描和分解,识别出单词符号。 原则:构词规则 工具:有限自动机
任务:在词法分析的基础上,根据语法规则把单词符号分解成各类语法单位(语法范畴) 原则:语法规则 工具:上下文无关文法
任务:对各类语法单位按语言的 语义进行初步翻译。 原则:语义规则 工具:属性文法 中间代码:三元式、四元式、树...
任务:对前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码。 原则:等价变换规则
任务:把中间代码变换成特定机器上的目标代码。 原则:依赖于硬件系统结构和机器中指令的具体含义
目标代码三种形式

优点:可针对具体机器,充分发挥计算机的系统功能(使用某些特殊指令)、生成的程序效率高。 缺点:可读性极差、可维护性极低、开发效率极低、可移植性极低。
优点:机器指令语义化,有一定可读性。可针对具体机器,充分发挥计算机的系统功能(使用某些特殊指令)、生成的程序效率高。 缺点:需要相应汇编器,可读性差、可维护性低、开发效率低、可移植性低。
如果已存在某种高级语言(如C++,已存在C++的编译器和汇编器)。现假设新语言为S,目标语言为T,实现语言为I,那么,可以利用现有的I语言为编程工具,编写从S语言到T语言的编译器,这样,一种新的语言S就产生了。因此,高级语言的产生过程最开始一定是由机器语言迭代产生的。
优点:程序易读、易理解、易维护、编码效率高。 缺点:不能精准控制目标代码的生成,目标代码执行效率可能不高,可通过插入目标代码方式解决。(如在C/C++中通过内联汇编实现,C#通过EMIT写IL代码实现)