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

Compiler construction 编译器中是否必须生成三个地址代码?,compiler-construction,Compiler Construction,编译器中是否必须生成三个地址代码?我的编译器已经将表达式转换为AST。不,您不需要3个地址代码。(它非常有用) 您可以在解析时直接“动态”生成代码,如果您足够努力,甚至不用构建AST。用这种方法很难生成真正好的代码,但是有了一个好的窥视孔优化器,可以得到令人惊讶的好结果。(参见Jack Davidson关于通过窥视孔优化生成代码的工作:) 您可以构建直接从AST工作的代码生成器。您可以生成比动态生成更好的代码,因为代码生成器可以在树中前后查看,并使用代码生成器的一部分对另一部分的期望的提示对树进

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

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

您可以在解析时直接“动态”生成代码,如果您足够努力,甚至不用构建AST。用这种方法很难生成真正好的代码,但是有了一个好的窥视孔优化器,可以得到令人惊讶的好结果。(参见Jack Davidson关于通过窥视孔优化生成代码的工作:)

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

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

三地址代码是进行代码优化的编译器常用的一种方法。它真正代表的是用户程序暗示需要进行的抽象计算之间的数据流。这个数据流告诉编译器哪些计算是相互依赖的,哪些是独立的,因此它可以根据自己识别的内容进行优化,并确保一部分的优化不会破坏另一部分。可以选择其他数据流表示或变体,也可以这样做

能够识别数据流是对程序程序进行真正良好的优化的基础,这会产生副作用。三个地址代码直接标识它们。我提到的其他技术通常不直接表示它们,但如果它们想使用这些信息,就必须隐式地计算它们,这实际上相当尴尬。因此,通常使用三个地址码