1.1 什么是编译程序
-
编译程序的必要性:计算机只能识别机器语言,但是编程语言有很多
-
编译程序概念:
最初定义:高级语言——>汇编语言或机器语言
-
程序设计语言源程序的两种执行方式:
翻译:翻译程序 → 低级语言(生成目标程序) → 执行 →c++/c/Pascal
解释:解释程序,边解释边执行 → Basic/Lisp/Sql/Javasript
Java → 编译程序 → Bytecode →解释程序
共同点:都需要进行词法(词法分析要解决的问题是:如何将输入的字符序列转换成 token(词法序列) 序列)、语法、语义分析
不同点:是否生成目标程序
-
翻译程序的分类
1.2.1编译过程概述
- 五个阶段:词法分析、语法分析、语义分析和中间代码生成、优化、目标代码生成、表格管理和错误处理
①词法分析:
- 任务:输入源程序(字符串形式)→根据词法规则时别单词
- 单词内部表示形式:(二元式)类型 + 名称
②语法分析
- 任务:输入单词字符串,根据语法规则识别出各类语法单位
- 程序语言的语法单位:表达式(x,x*y)、语句(y = x + 1;)、程序等
- 语法单位内部表示:语法树
③语义分析和中间代码的产生
-
任务:输入语法,根据语义,分析含义,初步翻译,产生中间代码
-
产生中间代码:易于优化,生成目标代码;形式有三元式、四元式、树结构等
四元式:(op,num1,num2,res);
④优化
- 任务:将中间代码转换成更加高效的代码
- 目的:降低时间、空间复杂度
⑤目标代码的生成
- 任务:由优化后的代码 → 机器能识别的代码,目标代码
- 特点:依赖机器硬件系统;通常使用汇编语言作为目标语言的实现语言
⑥表格管理和出错处理
表格管理任务:前五个是基础,随时对符号进行管理,记录源程序中使用的名字
出错处理任务:检查词法、语法、语义的出错信息和位置,便于处理和恢复
1.2.1编译程序的结构
- 编译程序的结构框图
- 遍的概念
输入文件 → 遍 → 输出文件
分遍原则:①多遍:占用内存少,结构清晰;读写次数多,耗时。②一遍:栈用内存多,速度快。