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

时间:2014-07-24 15:31:53

标签: compiler-construction

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

1 个答案:

答案 0 :(得分:3)

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

您可以在解析时直接生成“即时”代码,即使没有构建AST也是如此。以这种方式生成非常好的代码非常困难,但是使用优秀的窥视孔优化器,可以获得令人惊讶的好结果。 (参见Jack Davidson关于通过窥孔优化生成代码的工作:http://dl.acm.org/citation.cfm?id=357098

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

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

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

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