【发布时间】:2016-12-26 02:37:41
【问题描述】:
我最近一直在研究编译器设计。我已经成功地掌握了解析阶段,但是在理解代码生成的工作原理时遇到了一些麻烦。
根据我的阅读,代码生成阶段似乎有 3 个主要步骤:
- 指令选择(贪婪平铺)
- 指令调度
- 注册分配
现在,指令调度有点超出了我目前正在尝试做的事情,我认为通过更多的研究和原型设计,我可能会围绕寄存器分配的图形着色算法。
让我难过的是第一步,指令选择。根据我所读到的,目标机器语言中的每条指令都由一个图块表示;目标是找到与树的最大部分匹配的指令(因此称为贪婪平铺)。
我很困惑的是,当指令与语法树实际上不是 1:1 对应时,你如何选择指令?
以基于累加器的架构(如 Z80 或 MIP 单指令架构)为例。在 Z80 上执行 16 位整数运算可能需要使用累加器或影子寄存器。
还有一些指令只能在某些寄存器上使用,尽管它们是通用的。
我的假设是否正确?
a) 一个 tile 可能由与语法树模式匹配的指令序列组成,而不仅仅是 1:1 匹配。
b) 代码生成器首先为基于堆栈的架构(或具有无限临时寄存器的架构)生成代码,并在寄存器分配阶段以某种方式扩展和替换指令。
【问题讨论】:
标签: compilation compiler-construction code-generation