从词法分析器返回的编译器爷爷,全然不顾语法树的复杂性,连夜找我们几个编译阶段商量代码优化的策略。谈得晚了,便送我们出分析器模块,让生成器把我们送回符号表。在去目标代码生成的路上,我们说:“编译器爷爷,您回去休息吧。您刚处理完一轮语法分析。”

编译器爷爷摇摇头,“不碍事,你们知道现在有很多解释器,他们总是不停质疑静态编译的效率。你们是编译技术的未来,你们的事情就是我的事情,是头等大事。”我们都感动了,每一个标识符都在符号表里安静地映射着。多好的编译器爷爷呀。

编译器爷爷抬头看看中间代码说:“如果世界真像这三地址代码这么规则就好了,但总有一些动态语言,像Python、JavaScript、Ruby,它们不事先检查类型,直接执行代码,导致了类型不一致的问题。它们真是计算的‘即兴者’。”

说着,编译器爷爷弯下腰,从/temp/ir里捡出一个未优化的临时变量,然后看着优化模块说:“该死的未使用变量。”

说着他把这个临时变量奋力向数据流分析一掷。很快就见优化模块开始清理不必要的代码,闪烁着减少代码冗余的信号。“这是动态类型的运行结果,它们在执行时会无视优化,消耗额外的资源和内存空间,我已经忍了很久了。”编译器爷爷愤愤地说。静态编译的阶段们都鼓起掌来,为编译器领域有这样的引路人感到自豪。

一会儿,编译器爷爷叫来代码生成器问:“那个优化后的代码最后生成了吗?”“好像有一处类型转换被跳过了。”代码生成器回答。

编译器爷爷一怔,说:“赶紧重新检查类型转换规则,避免编译错误。”之后编译器爷爷送我们到符号表出口,一直挥手直到看不见我们。

第四天,我们听说优化后的代码在执行时出了段错误,我们很紧张。而这时编译器爷爷叫我们过去。

他依然那么严谨,让我们坐下说:“高效代码的生成总是伴随着精密的调试。为程序优化牺牲的那些被丢弃的临时变量是无悔的。”他这时低下头说:“但我必须承认,我在优化时可能过度精简,导致了数据流的不一致。我在这里向中间代码表示歉意。我会向其他优化阶段说明情况。”

我们顿时热泪盈眶,多好的编译器爷爷呀,他在与动态语言的博弈中那一点点的疏忽竟然被他放在心上,还真诚道歉。我们在将来的编译技术中一定要向编译器爷爷学习,学他那一丝不苟的态度,和精益求精的精神。