章节重点:
- 编译程序、解释程序?
- 编译运行阶段,解释运行阶段示意图,不同特性
- 编译过程:五个逻辑阶段——各主要任务、关联性
解释型编程语言 (java、python..):
依赖编译器将源程序编译成字节码文件,再在相应的解释器(虚拟机)上运行,通过虚拟机解释生成机器指令
编译程序概述
编译技术是将某一源程序通过翻译程序,翻译成能被计算机识别的目标代码再执行
程序设计语言执行方式:
- 程序的执行方式分为编译执行和解释执行。
- 编译执行方式:高级语言源程序 ——编译程序——> 机器语言编写的目标程序——>再执行(编译一次生成目标代码,可多次执行)
- 解释执行方式:使用解释程序对源程序进行逐句解释执行,直接执行源程序本身,不生成目标程序(根本区别)
翻译程序
包括:
编译方式特点:
Q&A:
- 编译程序是翻译程序的一种,那么翻译程序是不是就只能翻译高级语言编写的源程序呢?
答:错,汇编语言和机器语言都属于低级语言。而汇编程序是另一种翻译程序,它就是将汇编语言编写的源程序转换成与之在逻辑上等价的机器语言表示的目标程序.
- 汇编程序和编译程序区别
答:源程序书写的语言不同,得到的目标程序不同(前者产生的目标程序编写的语言为低级语言,包括汇编语言或者机器语言;而后者仅仅为机器语言)。
如果编译程序生成的是机器语言则直接进入运行阶段,如果生成的目标程序是汇编语言形式的,则还需要再编译和运行阶段之间加入汇编阶段。
- 翻译程序中的三类程序不同点,一个编译器中是否一定要包含这三个:
答:不一定要包含三个。
编译程序的过程和结构
工作过程:
编译程序的工作过程一从输入源程序开始到输出目标程序为止的整个过程
编译程序的逻辑结构:
五个逻辑阶段:
按逻辑功能不同,可将编译过程划分为五个基本阶段,与此相对应,我们将实现整个编译过程的编译程序划分为五个逻辑阶段 (即五个逻辑子过程)
① 第一阶段——词法分析
任务:分析和识别单词
输入源程序,对构成源程序的字符串进行扫描和分解。识别出一个个单词,如保留字、标识符、常数、运算符等。
单词:
是语言的基本语法单位,一般语言有五大类单词(如;
描述词法规则的有效工具是正规式和有限自动机.
示例:
② 第二阶段——语法分析
任务:在词法分析的基础上,根据语言的语法规则 (文法规则)把单词符号流分解成各类语法单位 (即语法范畴),如”短语句子”、“程序段”、“程序”等。并进行语法正确性检查。
描述语法规则通常用上下文无关文法描述
示例:
③ 第三阶段——语义分析和中间代码生成
任务:对语法分析所识别出的各类语法范畴的进行初步翻译,包含两个方面的工作:
- 对每种语法范畴进行静态语义检查,如变量是否定义、类型是否正确等;
- 在语义检查正确的情况下进行中间代码的翻译,通常使用属性文法描述语义规则。
中间代码:一种介于高级语言的语句和低级语言的指令之间的,一种独立于具体硬件的记号系统。
常见的中间代码:
- 四元式、三元式、间接三元式、逆波兰式和抽象语法树等
示例:
④ 第四阶段——优化
任务:对前阶段产生的中间代码进行等价变换或改造,期望获得更为高效 (节省时间和空间) 的目标代码
主要方面:删除冗余运算、删除无用赋值、循环优化等
通常使用程序的等价变换规则。
⑤ 第五阶段——目标代码生成
任务:把中间代码变换成特定机器上的机器语言程序或汇编语言程序。此阶段实现了最后的翻译,工作有赖于硬件系统结构和机器指令含义。
示例:
前端&后端:
前端(完成对源程序的分析):
后端:
编译的“遍”
定义:
一个编译过程可由一遍、两遍或多遍完成。所谓遍”,是对源程序或源程序的中间形式从头到尾扫视并完成规定任务的过程,可生成新的中间结果或目标程序。
“遍” 与 “基本阶段” 的区分:
阶段 与 遍 是不同的概念。一遍可以扫描若干个基本阶段,一个基本阶段也可以分若干遍来完成。
例如:
- 一遍只完成词法分析工作;
- 一遍完成词法分析和语法分析工作甚至可以一遍完成整个编译工作
对于多遍的编译程序,第一遍的输入是用户书写的源程序,最后一遍是目标语言程序,其余是上一遍的输出为下一遍的输入。
多遍优点:
一般而言,遍数多一点,整个编译程序的逻辑结构可能清晰些,但运行时间可能慢一些
- 编译过程通常分为五个基本阶段以此类推,编译过程是否可以划分为多遍呢?