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