为什么需要编译?
理论上来说改造专用计算机来直接执行某种高级语言写的程序是可能的,但目前的计算机能执行的都是非常低级的机器语言。
编译,就是翻译,就是将高级语言变换成机器语言。
编译的过程
词法分析:读入源程序的字符流 -> 记号流
语法分析:利用编程语言的语法规则检查词法分析输出的记号流是否符合规则;并利用语言构造的层次性 -> 语法树(单个检查)
语义分析:检查程序各部分是否有意义地结合在一起。 类型检查,类型隐式转换。
中间代码生成:
独立于机器的代码优化:独立于机器的代码优化阶段试图改进中间代码,已产生较好的目标代码。这里的较好可能有多种含义,执行较快,耗能较少,代码长度最短。
代码生成
依赖于机器的代码优化
目标代码
前端和后端
为什么要对中间代码优化而不是对目标代码优化?
我是这么认为的
1)层层加工,如果一次性想达到目标比较困难。
2)编译器的过程一般分为前端和后端两个过程,前端把源程序翻译成中间表示,后端从中间表示产生目标代码,与目标语言有关的细节,以及依赖于机器的细节尽可能限制在后端。
简述编译程序的组成结构。
编译器从逻辑上分成了7个阶段。粗略的看法是分成分析和综合两大部分。分析部分揭示了源程序的基本元素和它们所形成的层次结构,决定它们的含义,建立起源程序的中间表示。分析部分经常称为前端,综合部分称为后端,后端从中间表示建立起和源程序等价的目标程序。
前端:词法分析,语法分析,语义分析,独立于机器的代码优化
后端:代码生成,依赖于机器的代码优化,目标代码