理论教育 使用自动代码生成器构建编译器

使用自动代码生成器构建编译器

时间:2023-11-04 理论教育 版权反馈
【摘要】:应用模式文件实现目标代码生成器的优点就是便于修改、维护与移植。不可否认的是,一些经典的自动代码生成器更热衷基于树、DAG、前缀波兰代码等形式的IR实现,而不是传统的三地址代码。这种设计的主要优点是可以最大程度上减少代码生成器对IR形式的要求。本书将讨论基于三地址代码的自动代码生成器的实现,这种实现方法更多关注的是算法的第2、3步。

使用自动代码生成器构建编译器

所谓“自动代码生成”指的是编译器设计者将与目标机指令相关的翻译规则抽象成外部文件(习惯上,将该文件称为“模式文件”),然后,按照IR的实际形式,由代码生成器进行模式匹配,检索合适的翻译规则,用于生成目标代码。应用模式文件实现目标代码生成器的优点就是便于修改、维护与移植。虽然这种目标代码生成器的设计较手工编码实现的生成器稍复杂,但它的优点是后者无法比拟的。

本质上讲,IR对生成正确的代码并没有决定性的影响,但它却是影响选择代码生成方法的主要因素。针对DAG、树、四元式、三元式、前缀波兰代码等,寻找合适的代码生成方法是不容易的。其中,最著名的自动代码生成方法是Graham-Glanville方法,其基本思想是运用形式化的规则来描述目标机器的操作,并依据相应的指令模板进行代码生成。此过程与构造上下文无关文法分析器是类似的。

Graham-Glanville代码生成器由三部分组成,即中间语言转换、模式匹配器和代码生成。代码生成的过程可为三步:

1)将IR转换为适合匹配的模式串形式。(www.daowen.com)

2)根据模式串匹配指令模板库,确定指令序列。

3)根据指令序列生成相应的目标代码。

注意,Graham-Glanville代码生成器的默认输入IR是前缀波兰代码,这是早期代码生成器广泛应用的一种IR形式。不可否认的是,一些经典的自动代码生成器更热衷基于树、DAG、前缀波兰代码等形式的IR实现,而不是传统的三地址代码。这种设计的主要优点是可以最大程度上减少代码生成器对IR形式的要求。众所周知,AST、DAG或其他变体形式是较高级的IR,实际上,Graham-Glanville算法第1步关注的就是将高级形式转换为LIR形式,然后,再从LIR形式中分析得到模式串。如果输入的IR是MIR或LIR,那么,算法可以最大程度上适应IR的变化。本书将讨论基于三地址代码的自动代码生成器的实现,这种实现方法更多关注的是算法的第2、3步。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈