compiler-construction - 编译器中是否必须生成三地址代码?

标签 compiler-construction

编译器必须生成三地址代码吗?我的编译器已经将表达式转换为 AST。

最佳答案

不,您不需要 3 地址代码。 (它非常有用)。

您可以在解析时直接“即时”生成代码,如果您足够努力,甚至无需构建 AST。以这种方式生成真正好的代码非常困难,但是通过一个好的窥孔优化器,可以获得令人惊讶的好结果。 (参见 Jack Davidson 关于通过窥孔优化生成代码的工作:http://dl.acm.org/citation.cfm?id=357098)

您可以构建直接从 AST 运行的代码生成器。您可以生成比即时生成更好的代码,因为代码生成器可以在树中向前和向后查看,并使用有关代码生成器的一部分对另一部分的期望的提示对树进行注释。

也可以进行纯转换,并应用树重写来将原始程序的 AST 逐步转换为目标代码的 AST。由于树重写本质上是字符串重写的概括,因此它们具有图灵能力,理论上您可以通过这种方式生成任意好的代码。我认为 LISP 编译器经常这样做。

三地址代码是一种方式,编译器通常使用这种方式来进行代码优化。它真正代表的本质上是用户程序暗示需要完成的抽象计算之间的数据流。这个数据流告诉编译器哪些计算相互依赖,哪些计算是独立的,因此它可以优化它识别的事物,并确保对一个部分的优化不会破坏另一个。可以选择其他数据流表示或变体,效果也一样。

要对具有副作用的程序程序进行真正好的优化,就必须能够识别数据流。三地址代码直接标识它们。我提到的其他技术通常不直接表示它们,但如果他们想使用该信息则必须隐式计算它们,这实际上很尴尬。因此,通常使用三地址码。

关于compiler-construction - 编译器中是否必须生成三地址代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24938018/

相关文章:

c - 我如何实现解析?

compiler-construction - 如何将 CoffeeScript 文件及其编译版本保存在不同的文件夹中?

c++ - 当移动构造函数声明为私有(private)时使用复制构造函数

c - 编译器如何解析变长数组后声明的变量地址?

java - 为什么编译器在进行 "bad"转换时不给出错误?

compiler-construction - 实时范围与到达定义

c - cl编译器(Visual Studio)在哪里生成LIB和EXP文件

c++ - 如何在用户自定义命名空间的成员函数中引用指针**environ?

python - 名称和函数体如何存储在 Python 代码对象中?

c++ - 使用代码将字符集设置为多字节