一、编译程序
翻译程序:将源语言程序转换成逻辑上等价的目标语言程序。
编译程序:把用高级程序设计语言书写的源程序,翻译成等价的机器语言格式目标程序的翻译程序。
解释程序:以源程序作为输入,边解释边执行源程序本身,并不产生目标程序。
编译程序的分类:
①诊断编译程序 Diagnostic Compiler
(方便调试)
②优化编译程序 Optimizing Compiler
(提高目标代码效率)
③交叉编译程序 Cross Compiler
(宿主机与目标机不同)
④可变目标编译程序 Retargetable Compiler
(便于移植)
二、编译过程概述
编译程序的五个阶段:
①词法分析
②语法分析
③语义分析与中间代码产生
④优化
⑤目标代码生成
1.词法分析
任务:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词或符号(token) 。
描述词法规则的工具:正则式、正则文法、有限自动机
2.语法分析
任务:在词法分析的基础上,根据语言的语法规则,把单词串分解成各类语法单位(语法范畴)。
描述语法规则的工具:上下文无关文法、下推自动机
3.语义分析与中间代码产生
任务:对各类语法范畴,分析其含义,并进行初步翻译、产生中间代码。 (1)静态语义检查:变量是否定义、类型是否正确;(2)中间代码的翻译:独立于具体硬件、且含义明确的记号系统。
描述语义规则的工具:属性文法
4.优化
任务:对前段产生的中间代码进行加工变换,力求在最后阶段能产生出更高效的目标代码。
优化的原则:程序的等价变换规则
5.目标代码生成
任务:把中间代码变换成依赖于特定机器上的低级语言代码。
目标代码的三种形式:
(1) 绝对指令代码
(2) 汇编指令代码
(3) 可重定位的指令代码
三、编译程序的结构
编译程序总框:
遍:
对源程序或源程序的中间结果从头至尾扫描一次,并做有关的加工处理,并生成新的中间结果或目标程序的处理过程。
编译的前端与后端
编译前端:与源语言有关,与目标机无关的部分。( 词法分析、语法分析、语义分析与中间代码生成、优化 )
编译后端:与源语言无关,与目标机有关的部分。(优化、目标代码生成)
四、编译程序与程序设计环境
五、编译程序的生成
机器/汇编语言直接编写
在现有编译器基础上用高级语言编写
先实现语言的内核编译,再进行自编译扩展
先实现某语言的编译,再用该语言实现另一语言的编译,即编译—编译程序
利用编译程序产生器输入源语言和目标语言的形式描述而自动产生编译程序