上 Kent Dybvig 的编译器课程的时候,他有一次对我们说,很多编译器课程都强调“优化”,但大部分编译器的“优化”都是针对糟糕的程序员做的优化。比如 common subexpression elimination(CSE,提取共同子表达式)。本来训练有素的程序员应该避免写出重复而且耗时的表达式,自己定义变量来避免重复的计算。现在编译器却把这事揽在自己头上,好像这很重要一样。其实不是那么重要。
编译器的速度才是重要的事情。很多编译器做很多这类愚蠢的“优化”,试图把糟糕的代码变成优秀的代码,结果编译器的速度就因为这些优化降低了。每次 build 一个 project 用很长时间,这样修改代码到看结果的周期就变长了,开发效率就降低了。
所以 Chez Scheme 不强调这些普通的优化,它假设程序员具有基本的素质,能够自己避免重复而耗时的表达式。Chez Scheme 的优化大部分都是针对编译器自己生成的代码做的,比如 closure optimization,会尽量减小产生的 closure 的内存大小。这些是程序员无法控制的,所以编译器应该尽量达到最优。但这样的优化也都有一个限度,要是为了优化而让编译器变得很慢,目标程序却没有快很多,也不值得了。Chez Scheme 力争编译速度和目标程序的速度达到平衡。
结果在后来的工程实践中,我多次的领悟到这个重要的道理。