- 通用:编译器的编写者和任何程序员一样,当然可以从各种软件工具获益,例如debugger,version manager, profiles等等。
- 专用:除了这些通用的软件开发工具之外,还有一些专用的工具,帮助实现一个编译器的不同阶段
就在第一个编译器完成后不久,帮助编写编译器的系统就出现了。这些系统通常称为编译器编译器compiler-compilers,编译器生成器compiler-generators或者翻译器编写系统 translator-writing systems。很大程度上,他们面向一种特定的语言模型,它们最适合生成和该模型类似的语言的编译器。
例如,或许假设所有语言的词法分析器基本上是相同的,除了特定的关键字和符号。
- 许多编译器编译器实际上产生固定的词法分析例程,用于生成的编译器。
- 这些例程只在识别的关键字列表上有所不同,而这个列表由用户提供。
- 这种方法是有效的,但是如果需要识别非标准的token时就可能无法工作,例如某些标识符包含字母和数字之外的字符。
某些通用的工具用于特定编译器部件的自动化设计。这些工具使用专用语言指定并实现部件,很多使用非常复杂的算法。最成功的是那些隐藏了算法细节,同时产生可能轻易集成到编译器其它组成部分的那些工具。下面是一些有用的编译器构造工具:
- Parser generator 解析器生成器,这些产生语法分析器,通常从输入基于一个上下文无关文法。在早期的编译器中,被消费的语法分析不但一个编译器运行时间的大部分,而且是编写一个编译器所需智力活动的大部分。现在这个阶段被认为是最容易实现的阶段之一。许多解析器生成器利用了强大的解析算法,手工实现的话就太过复杂了。
- Scanner generators 扫描器生成器 自动生成词法分析器,通常来自一个规格,基于正则表达式。结果的词法分析器的基本组织是一个有穷自动机。
- Syntax-directed translation engines 语法导向翻译引擎 产生遍历解析树(如图1.4)的一套例程,生成中间代码。基本的思想是一个或多个“翻译”是和解析树的每一个节点相关的,而每一个翻译用它在树中相邻节点的翻译得以定义。
- Automatic code generate 自动代码生成器取一套规则,定义把中间语言的每个操作翻译成目标机器机器语言的方法。这些规则必须包含足够的细节,以便我们能够处理数据的不同存取方法,例如,变量可能在寄存器中,在一个内存的固定(静态)位置,可能在一个栈上分配的一个位置。
基本的技术是“模版匹配”"template matching"。中间代码语句被代表机器指令序列的“模版”替换。因为通常有在哪里替换变量(例如在寄存器之1或者在内存中)有很多选项,因此有很多可能的方式把中间代码“铺”到一个给顶的模版集合,有必要选择一种好的铺法,而不会产生编译器运行时间的组合爆发。 - Data-flow engine 数据流引擎。许多代码优化都需要首先进行数据流分析,收集关于值是如何从一个程序的一部分传送到另一部分的信息。这种性质的不同任务可以被基本相同的例程执行,用户提供中间代码语句和被收集信息之间的关系。
没有评论:
发表评论