编译程序的组织和生成
编译程序的组织
根据系统资源的状况、运行目标的要求…… 等,可以将一个编译程序设计成多遍(Pass) 扫描的形式,在每一遍扫描中,完成不同的 任务。 如:首遍构造语法树,二遍处理中间表示,增加 信息等。
遍可以和阶段相对应,也可以和阶段无关
单遍代码不太有效
编译程序的设计目标
- 规模小、速度快、诊断能力强、可靠性高、可移植性好、可扩充性好
- 目标程序也要规模小、执行速度快
编译系统规模较大,因此可移植性很重要
- 为了提高可移植性,将编译程序划分为前端和 后端
前端
- 与源语言有关、与目标机无关的部分
- 词法分析、语法分析、语义分析与中间代码生 成、与机器无关的代码优化
后端
- 与目标机有关的部分
- 与机器有关的代码优化、目标代码生成
编译程序的生成
如何实现编译器?
- 直接用可运行的代码编制——太费力!
- 自举-使用语言提供的功能来编译该语言自 身。
- “第一个编译器是怎样被编译的?”
1、T型图
编译原理 T 形图 源语言 表示语言 目标语言分别是什么?
编译器本身也是一个软件,该软件用何种语言编写的,比如是用c语言编写的,则c语言就是它的表示语言(一般说成实现语言)。编译系统的功能是翻译,它能把一种高级语言(即源语言)编写的程序等价的翻译成另一低级语言(即目标语言)的程序。
举例:
用 C语言实现一个java编译器,可以将java程序翻译成bytecode,则该编译器的源语言为java,目标语言为bytecode,表示语言是C.
2、(自展)问题一:如何直接在一个机器上实现C语言编译器?
解决:
- 用汇编语言实现一个C子集的编译程序(P0—人)
- 用汇编程序处理该程序,得到(P2:可直接运行)
- 用C子集编制C语言的编译程序(P3—人)
- 用P2编译P3,得到P4
3、(移植)问题二:A机上有一个C语言编译器,是否可利用 此编译器实现B机上的C语言编译器?
- 条件:A机有C 语言的编译程序
- 目的:实现B机的C语言的编译
问题的解决办法
- (人)用C语言编制B机的C编译程序P0 0(C→ →B) B)
- 2.(A机的C编译P1 1)编译P0 0,得到在A机上可运行的P2 2(C→ →B)
- (A机的P2 2)编译P0 0,得到在B机上可运行的P3 3(C→ →B)
4、本机编译器的利用
问题三:A机上有一个C语言编译器,现要实现一 个新语言NEW的编译器?能利用交叉编译技术么?
- 条件:A机 有 C语言 的编译程序(P1)
- 目的:实现 A机 的 NEW语言 的编译(P3)
5、编译程序的自展技术
如果说交叉编译操作是“脱胎换骨”,那么下面的就是“无中生有”了。
直接在一个A机上实现C语言编译器。
-
用汇编语言实现一个 C子集 的编译程序(这里的子集表示必要的常用最小部分)
-
用汇编程序处理该程序,得到P2(P2:可直接运行核心的部分C语言,也就是C子集部分)
用C子集编制C语言的编译程序(因为编写c语言比汇编简单得多,这一步相对于第一步效率更高)
用P2编译P3,得到P4
6、利用编译程序自动生成器
所谓编译器生成器即对于一段给定的单词正则表达式,自动构造一个能进行词法分析的词法分析器;对于一段给定的文法,自动构造一个能进行语法分析的语法分析器:能自动加上必要的语义分析,并能给出面向用户的语义程序接口的程序。编译器生成器——百度百科
来源:https://blog.csdn.net/qq_44721831/article/details/102751936