汇编、编译、解释系统
1.编译方式和解释方式
程序种类 | 是否生成目标程序 | 是否参与程序的运行过程 | 程序执行速度 | 可移植性 |
---|---|---|---|---|
编译程序 | 生成 | 不参与 | 快 | 差 |
解释程序 | 不生成 | 参与 | 慢 | 好 |
编译方式过程:词法分析、语法分析、语义分析、(中间代码生成、代码优化、)目标代码生成。
解释方式过程:词法分析、语法分析、语义分析。
-
编译器和解释器都不可省略词法分析、语法分析、语义分析且顺序不可交换。
-
即词法分析、语法分析、语义分析是必须的。
-
编译器方式中中间代码生成和代码优化不是必要,可省略。
-
即编译器方式可以在词法分析、语法分析、语义分析阶段后直接生成目标代码。
2.编译方式具体过程
(1)词法分析
输入:源程序
输出:记号流
词法分析阶段的主要作用是:分析构成程序的字符 及由字符按照构造规则构成的符号,是否符合程序语言的规定。
(2)语法分析
输入:记号流
输出:语法树(分析树)
语法分析阶段可以发现程序中所有的语法错误。包括确定变量是否定义声明。
语法分析阶段的主要作用是:对各条语句的结构进行合法性分析,分析程序中的句子结构是否正确。(例如括号不匹配)
(3)语义分析
输入:语法树(分析树)
语义分析阶段的主要作用是进行类型分析和检查。
语义分析阶段不能发现程序中所有的语义错误。
语义分析阶段可以发现静态语义错误,不能发现动态语义错误,动态语义错误运行时才能发现(除数为0时只能在运行阶段检查出来)
(4)中间代码生成
常见的中间代码有:后缀式、三地址码、三元式、四元式和树(图)等形式。
中间代码与具体的机器无关(不依赖具体的机器),可以将不同的高级程序语言翻译成同一种中间代码。
中间代码可以跨平台。
因为与具体的机器无关,使用中间代码有利于进行与机器无关的优化处理 和提高编译程序的可移植性。
(5)代码优化
(6)目标代码生成
目标代码生成阶段的工作与具体的机器密切相关。
寄存器的分配工作处于目标代码生成阶段。
目标程序完全独立于源程序。
3.其他
符号表
不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其存入符号表中。
记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。
反编译
编译是将高级语言源程序翻译成机器语言程序(汇编形式或机器代码形式),反编译是编译的逆过程。反编译通常不能把可执行文件还原成高级语言源代码,只能转化成功能上等价的汇编程序。
编译过程地址分配
编译过程为变量分配存储单元所用的地址是逻辑地址 ,程序运行时再映射为物理地址。