最近有人跟我提到他看过我关于编译器专业的文章,又想起最近与一些“编译器人士”的遭遇,结果我把自己以前写的《我不是编译器专家》http://t.cn/AX20bZss 又拿出来看了一下。发现里面记录的,正好是我最近感受到的。
由于最近 AI 的热门,Rust 语言的红火,AI 编程助手的兴起,又有很多人关注编译器这个领域,张口闭口“编译器”,“IR”,“SSA”,“CFG(control-flow graph)”之类的空洞名词。殊不知这些名词在我这里什么都不是,只是一些教条和死知识。懂得编程语言本质的人随时可以把它们重新发明出来,而且不一定需要用它们。
举个例子,我的 PySonar2 类型推导实现的是很精确的 control-flow analysis,里面却不存在 CFG(control-flow graph)这种东西。如果你真去构造 CFG,是无法达到 PySonar2 那样的准确程度的。有些知道点编译器皮毛的人很是把 CFG 这概念当回事,而其实我早有更先进(而且更简单)的方式来完成它的功能。之前我写的 Scheme 语言编译器,实现了各种先进的优化,从来没用 CFG,却仍然达到 CFG 那种功能,而且还简单很多。所以 CFG 在我心目中是没有地位的,完全就是个死知识点,应付考试用的。
SSA(static single assignment)这个概念也是类似。我的 Scheme 编译器里面没有 SSA,却实现了 SSA 能做的那些事情。因为我知道 SSA 的本质是要做什么,而那些完全可以用更简单的方式做到。最早提出 SSA 的人可能明白这个道理,但后来人就开始教条主义,把 SSA 作为了一个“必考要点”,而忘了它的思想来源。
鉴于人们对编译器领域的普遍无知和盲目崇拜,所以现在我把这篇关于编译器领域的文章《我不是编译器专家》http://t.cn/AX20bZss https://www.yinwang.org/posts/compilers 再次推荐给大家,并且引用其中关键的两段话:
“大部分自称做过编译器的人,恐怕连最基本的的编译器都没法从头写出来。利用 LLVM 已有的框架做点小打小闹的优化,就号称自己做过编译器了。许多编译器人士死啃书本,肤浅的记忆各种术语(比如 SSA),死记硬背具体实现细节(比如 LLVM 的 IR),看不透,无法灵活变通。
所以我常说,编译器是计算机界死知识最多,教条主义最严重的领域。经常是某人想出一个做法,起个名字,其他人就照做,死记硬背,而且把这名字叫得特别响亮。你要是一时想不起这名字是什么意思,立马被认为是法国人不知道拿破仑,中国人不知道毛泽东。你不是做编译器的!”