用Go语言自制编译器
上QQ阅读APP看书,第一时间看更新

第1章 编译器与虚拟机

对于大部分程序员而言,“编译器”这个词令他们闻而生畏。即使没有被吓到,他们也不会否认编译器及其工作原理充满神秘。似乎所有凡人都无法读写编译器生成的机器代码。它用魔术般的优化让代码运行得更快。编译过程可能持续几分钟甚至数十分钟。如果传言属实,编译过程甚至能持续数小时。如果真的需要这么久,那编译器所做的工作一定非同寻常!

据说编译器非常庞大,而且工作原理异常复杂。实际上,编译器确实经常被列入史上最复杂的项目之一,数字会证明这一切。例如,LLVM项目和Clang项目包含300万行代码;GNU编译器GCC项目甚至更大,代码量达到1500万行。

在了解到如此大的代码量之后,没有多少人会直接打开编辑器说:“来吧,我们构建一个编译器!”他们当然不相信一下午的时间就能构建一个编译器。图1-1展示了编译器的神秘之处。

图 1-1

同样,虚拟机在很大程度上也被视为神秘之物。它漫游在软件开发的最底层,很少出现在上层,甚至鲜为人知。与编译器一样,虚拟机同样引来无数谣言和猜测。一些人认为它与编译器有着千丝万缕的联系,一些人则坚持编程语言实际上就是虚拟机,还有一些人声称虚拟机的作用是允许他们在一个操作系统中运行另一个操作系统。

所有的猜测都无济于事。

但是事情就是如此。正如“解释器”和“Web服务器”有多种实现一样,编译器和虚拟机本质上也是某种思想(模式),它们的实现方式多种多样,规模可大可小。看完GCC项目被恫吓与看完GitHub放弃构建网站是一个道理。

当然,为虚拟机构建编译器不是一个简单的任务,但也不至于像传言那样不可逾越。如果能对虚拟机和编译器的核心思想有更好的理解,我们就会发现一下午的时间足以完成编译器的构建。

构建编译器的第一步是,确定“编译”到底是什么意思。