【发布时间】:2014-07-24 15:31:53
【问题描述】:
编译器必须生成三地址代码吗?我的编译器已经将表达式转换为 AST。
【问题讨论】:
编译器必须生成三地址代码吗?我的编译器已经将表达式转换为 AST。
【问题讨论】:
不,您不需要 3 个地址代码。 (它非常有用)。
您可以在解析时直接“即时”生成代码,即使您足够努力也无需构建 AST。以这种方式生成真正好的代码非常困难,但是使用好的窥孔优化器,可以获得令人惊讶的好结果。 (参见 Jack Davidson 通过窥视孔优化生成代码的工作:http://dl.acm.org/citation.cfm?id=357098)
您可以构建直接从 AST 工作的代码生成器。您可以生成比即时生成更好的代码,因为代码生成器可以在树中向前和向后查看,并用代码生成器的一部分对另一部分的期望来注释树。
也可以进行纯粹的转换,并应用树重写来将原始程序的 AST 转换为目标代码的 AST。由于树重写本质上是字符串重写的概括,因此它们具有图灵能力,理论上您可以通过这种方式生成任意好的代码。我认为 LISP 编译器经常这样做。
三地址代码是一种方法,编译器通常会使用它来进行代码优化。它真正代表的本质上是用户程序暗示需要完成的抽象计算之间的数据流。这个数据流告诉编译器哪些计算相互依赖,哪些是独立的,因此它可以优化它识别的东西,并确保一个部分的优化不会破坏另一个部分。人们可以选择其他数据流表示或变体,并且做得同样好。
对具有副作用的程序程序进行真正良好的优化是至关重要的,因为人们能够识别数据流。三地址代码直接识别它们。我提到的其他技术通常不直接表示它们,但如果他们想使用该信息,则必须隐式计算它们,这实际上很尴尬。所以,通常使用三地址码。
【讨论】: