尾声
总有曲终人散时,不知不觉我们已经完成了对UCC编译器的剖析,一路走来,最深的体会仍然是“纸上得来终觉浅,绝知此事要躬行”。按这个道理,理解UCC编译器的最好办法应是“直接阅读其源代码,思考UCC编译器在不同的执行点应处于怎样的状态,加入一些打印语句,输出相应的调试信息来验证自己的判断是否正确,如果发现Bug,就写一些测试程序来触发Bug,然后修改UCC编译器的源代码”。在遇到困惑时,或许拙作能带来一点点的帮助和提示,但拙作不能代替,也不应取代对UCC源代码的主动阅读。源代码分析的相关书籍很容易带来一个副作用,即读者在书籍的牵引下被动地看书,而忽视了对源代码本身的主动阅读。主动思考和被动阅读所带来的效果是完全不一样的。
LLVM和GCC的功能已经足够强大,也有足够庞大的程序员社区在支撑其不断发展和改进。而UCC几乎没有可能与这些编译器媲美,UCC编译器最大的优点在于“它的规模和复杂度都在一个C程序员单枪匹马就可以掌控的范围内”。只要我们愿意付出努力,我们一定可以较好地搞明白UCC编译器,从而更好地用好C语言这个简洁用力的利器。当然能基本读懂UCC编译器,与能像UCC原作者([email protected])那样写出UCC还是有一定差距的。UCC编译器最适合的读者可能是在校的大学生,有时间,有精力,且暂时还不用考虑“写代码养家糊口”,可以静下心来打好专业基本功。能有机会在一线参与编译器开发的程序员少之又少,但攻克UCC编译器这座山头的意义在于“它能让我们获得攻克其他山头的能力”,这可能就是所谓磨刀不误砍材功。当然,选择怎样的山头来练兵,源于我们自己的兴趣。从打基本功的角度出发,我们可以选择其他自己感兴趣的山头来攻克,比如麻省理工大学的XV6操作系统,而不一定要选择UCC编译器。XV6操作系统是UnixV6系统在X86平台上的重生,若时间允许,或许我们可以再一起进行“XV6操作系统剖析”。
每个人心中都有自己的偶像,当我们在谈论某某是我的偶像时,其潜台词往往是“我们希望自己能成为那样的人”。绝大部分人都无法达到自己偶像的高度,但偶像很大程度上会指引我们前进的方向。20世纪70年代诞生的C和Unix,影响了一代又一代的程序员,对IT整个行业也产生了深远的影响。阅读“UCC源代码和XV6源代码”,比“捧着编译原理和操作系统的教材”,应会更有趣得多,这也是我们向伟大的先行者Dennis
Ritchie和Ken Thompson致敬的最好办法,其实也是学习编译原理和操作系统的最有效方法之一。有了源代码级的感性认识后,再去补充理论知识,才会得到更好的升华。
CPU由于物理上的限制,其主频已不再无限提高了,摩尔定律在单CPU上已渐渐失效,现在和未来的方向应是多核、分布式和并行。在分布式或者并行的环境下,如何为程序员提供一个易用的编程环境,或许是未来若干年编译方向的研究热点。当然还有优化,毕竟我们始终在追求“没有最好,只有更好”。
限于水平和能力,书中不当之处敬请批评与指正。
[email protected]