新手上路学习JavaScript引擎实现——路线图

1,038 阅读5分钟
原文链接: zhuanlan.zhihu.com

最近在知乎接连看到几个相关的问题:


这些问题都是试图从阅读源码着手去学习JavaScript引擎的实现的。然而,对新手而言,直接从一个复杂的实现的源码着手,不可避免的是事倍功半的做法。

要学习JavaScript引擎的实现,就跟学习其它东西一样,最好是循序渐进的来,先打好基础,再去结合现实学习主流实现。

我推荐的学习路线是:

  • 临摹:先找个比较简单语言的简单解释器实现,以它为模子,自己抄一个解释器出来。这个过程中可以学习到编程语言的解释器的基本构造,特别是其组成部分的划分,以及这些组成部分在工作流程中各自处于什么位置。整个流程串起来之后,思路就会清晰许多,接下去学习就可以有针对性了。
  • 巩固:临摹的时候必然只能一个解释器的各部分的一种特定的简单实现。然而其背后的原理是怎样的,同一个组件是否有别的更先进(或不同取舍)的做法,就需要进一步学习了。此时可以针对各部分去读不同的书,例如编译原理、GC、对象模型等方面。学习原理,巩固基础,拓展视野。
  • 规范:到此有足够基础可以着手学习/实现真正的JavaScript引擎了。但在动手之前,应该熟读ECMAScript规范,了解到底JavaScript语言所要求的语义是怎样的,解决“是什么”的问题。觉得新的ECMAScript 2015太复杂的话,从ECMAScript 5.1学习是个不错的开始。有个带注解的ECMAScript 5.1规范特别适合学习:Annotated ECMAScript 5.1。另外,更喜欢阅读中文文档的同学可以看@呂康豪大大在评论区推荐的 ES5 - HTML5 Chinese Interest Group Wiki,那是他的怨念喔。
  • 接轨:把前面学习的知识都结合起来,按照规范实现自己的简单的JavaScript引擎;或者此时也可以去阅读现成的比较简单的JavaScript引擎的实现,但还是自己动手写过一次能有更深刻的理解。
  • 进阶:到这个阶段,再去阅读现实中主流的、高性能的JavaScript引擎的源码,就可以做到有的放矢了。快速阅读一下官方文档,浏览一下代码组织结构,就应该能大概掌握一个实现的大致架构。然后再抓住JavaScript引擎实现可能存在的重要设计点去看看,就可以知道这个实现在每个部分都选择了哪些实现方式。其实就像搭积木一样,每个部分能有什么选择都了然于心,这样再去深入到细节读代码,就可以事半功倍的提取出自己想要知道的信息了。很多时候看目录结构和源码文件名就能大概猜到需要的信息在哪个文件里,进去确认一下就好。

我推荐这个学习路线,是因为上面的阶段我全都走过一遍了,亲测有效。国内有不少从事JavaScript引擎研发的同行们,不知道大家的学习路线又是怎样的呢?

Kinoma XS6的讨论为例,我从看到问题到开始阅读源码,到写完整个回答,总共只用了几分钟。这个回答就包含了我在阅读一个JavaScript引擎实现时会首先关注的设计点,抓住这些点去阅读源码就可以很快的了解这个实现的全貌、其大体的设计思路和取舍方向。换言之,我并不需要为了了解它的概况而需要去从细节开始学习很多新的知识,而只要在已有知识里印证这个实现在可能的实现方式里到底选择了哪些。

另外也想提一下Constellation大大的lv5 JavaScript引擎(Constellation/iv · GitHub)。它的发展历程见证了Constellation的成长,也跟上面的学习路线中“规范-接轨-进阶”的过程完全吻合——一开始lv5是作者边读ES5规范边用最直观的方式把规范实现出来的。整个流程走通之后,他就开始从开源的主流JavaScript引擎学习先进的做法,并逐步实现到lv5当中,渐渐将其发展成一个颇为实在的、现代的实现。

我在这里也提到过lv5:准大三,计算机专业如何确定工作方向? - RednaxelaFX 的回答



我从2012年开始其实也有断断续续积累一些文字,希望能规整到一个系统的知识体系下写成一本书,以便更好的把这些相关知识传播给大家。不过目前这个计划还在早期阶段,暂时不接受催稿谢谢…

虽然书离成形还尚远,但我曾经试过把积累的内容的一部分汇总起来发出来:[链接帖] 各JavaScript引擎的简介,及相关资料/博客收集帖,欢迎大家参考和提建议。这系列帖子已好久没更新就是了…


话说回来,万事开头难,按照上面的路线,得找个最初的临摹对象来学习。

可以选择的对象有很多,不过这里我还是想再次推荐『プログラミング言語を作る』(中文版《自制编程语言》)一书。我在这里发过一个简介帖:《自制编程语言》集中讨论帖

其中的Crowbar语言及其解释器实现,就是我想推荐作为入门临摹的对象。

欲知它究竟是怎样设计与实现,且看下回分晓 ^_^