



在本节中,我们探讨一种编译器,它可以将 L Int 语言程序翻译成可能更高效的 L Int 程序。编译器尽早地计算程序中不依赖于任何输入的部分,这个过程被称为 部分求值 (Jones, Gomard, and Sestoft 1993)。例如,给定下面的程序:
我们的编译器将其翻译成程序:
图1.5给出了 L Int 语言的一个简单的部分求值器的代码。部分求值器的输出是 L Int 语言中的程序。在图1.5中, exp 上的结构化递归是在pe_exp函数中捕获的,而部分取负和加法操作的代码则分解到三个辅助函数中:pe_neg、pe_add和pe_sub。这些函数的输入是子函数部分求值的输出。pe_neg、pe_add和pe_sub三个函数检查它们的参数是否为整数,如果是整数,则执行相应的算术操作;否则,它们将为算术运算创建AST节点。
图1.5 L Int 语言的一个部分求值器
图1.5 L Int 语言的一个部分求值器(续)
为了验证部分求值器的正确性,可以测试它是否产生与输入程序产生相同结果的程序。也就是说,我们可以检验它是否满足规则(1.8)。
习题1.1 用 L Int 语言创建三个程序,先用pe_Lint对程序进行部分求值,然后再用interp_Lint解释器计算,验证它们与直接用interp_Lint解释器计算所得结果是否相同。