编译程序的组织和生成

十年热恋 提交于 2019-12-02 11:21:08

编译程序的组织和生成

编译程序的组织

根据系统资源的状况、运行目标的要求…… 等,可以将一个编译程序设计成多遍(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语言的编译

问题的解决办法

  1. (人)用C语言编制B机的C编译程序P0 0(C→ →B) B)
  2. 2.(A机的C编译P1 1)编译P0 0,得到在A机上可运行的P2 2(C→ →B)
  3. (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子集部分)

自展1

用C子集编制C语言的编译程序(因为编写c语言比汇编简单得多,这一步相对于第一步效率更高)

自展2

用P2编译P3,得到P4

6、利用编译程序自动生成器

所谓编译器生成器即对于一段给定的单词正则表达式,自动构造一个能进行词法分析的词法分析器;对于一段给定的文法,自动构造一个能进行语法分析的语法分析器:能自动加上必要的语义分析,并能给出面向用户的语义程序接口的程序。编译器生成器——百度百科

参考文章:https://www.jianshu.com/p/00fe35b06974

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!