如何开始学习 V8

本文转载自:众成翻译
译者:yu-wj
链接:http://www.zcfy.cc/article/3963
原文:https://medium.com/dailyjs/how-do-i-get-started-with-v8-development-17e976ebe4af

如何学习v8开发

你是否有兴趣理解更多关于编译器、虚拟机、JavaScript引擎的知识,或者贡献V8项目

你也许曾没上过编译原理的课程或者没有c++编程经验,但是没人生来就具有这些知识的,你不需要理解任何编译器方面知识。这里有一些资源也许会帮助你。

但是现在世面上有很少的编译的书籍,而且也没发现一本具有现代优化知识的书籍,尤其是对于JavaScript引擎来说。如果你想学习基础,可以去看看龙书(中文版《编译原理》,现在已经出到了第二版)

这里有几个关于V8的 博客:

  • Official V8 blog v8project.blogspot.com

  • benediktmeurer.de (V8 compiler and benchmarks)

  • http://ripsawridge.github.io/ (V8 compiler)

  • https://medium.com/@tverwaes (V8 runtime)

  • http://mrale.ph/ (Not on the V8 team anymore.)

如果你比较喜欢看视频学习,这里也有一些不错的视频

  • Breaking the Speed Limit from 2012 by Daniel Clifford, V8 lead [Slides]

  • A Trip to the Zoo from 2015 by me, Nordic.js [Slides]

  • V8, modern JavaScript, and Beyond from 2016 by Seth Thompson

  • A little on V8 and WebAssembly from 2016b by Ben Titzer [Slides]

  • JS Engines — how do they even? from 2017 by me JSConfEU [Slides]

不幸的是,在这些高级资源和V8源码中还是有挺大的差距,但是你需要边做边学。所以去获取源代码然后编译它。V8在V8/test中有数万行代码。坚持在本地运行它,否则你需要等待几个小时。跟着V8 Wiki去编译 and 运行 V8。维基百科也有如何提交变更记录的说明,变更记录是Chromium中用于拉取请求的术语。

需要花点时间去编译V8

我建议先从简单开始。改变一些小地方,比如更改错误信息的提示语。然后编译,并在几行能导致错误代码中运行它,看看是否能获取你的错误信息。这里变更记录就是改变了一个错误信息。就这样修改代码,慢慢地就会熟悉基本代码和编译过程。

使用D8运行你本地修改后的V8引擎而不是使用浏览器。当你擅长V8后,你可以使用git

变更记录在 Chromium’s code review tool, Gerrit.

一旦你编辑错误信息和在D8上看到改变后,就可以 上传你的代码然后在V8测试框架下进行所有测试,你应该发现一些测试失败,是因为其中一些测试是检查错误信息的。这就要求需要熟悉代码审查工具和如何在框架中自动执行测试,所有当你想提交补丁都需要准备好。如何使用V8审查工具和如何运行测试的细节内容都在这里

如果你熟悉JavaScript但是不太了解c++,你也许想从V8/src/js.部分开始,这部分都是用JavaScript编写的,而且在都在这个目录下。代码中大部分都是按照EcmaScript 规范实现的。选择一个函数然后查找其规范。你能理解规范如何对应于代码吗?如果你改变或删除部分代码,什么测试失败,违反了规范中哪一步说明?在V8/test, 尤其是 V8/test/mjsunit中有大量的JavaScript代码。

下一步,你可以阅览V8 issue tracker。也许你会发现一些小问题,试图去修改。首先检查你是否能理解,然后复制错误。在JavaScript中写一段小代码片段,当运行时显示错误。在代码中寻找到错误代码,然后试图分解代码,然后运行测试代码确保是因为你分解代码导致了错误。玩弄代码。V8代码量特别大且复杂。你需要足够能力去解决错误。如果不行的话,不用担心,当你审查错误时会学习到知识的。

V8中做出大量更改是很困难的,并且需要大量时间和知识。如果我告知你可以很容易改变V8的运行方式或添加新特点,那一定是骗人的。但是任何人不得不从某处开始,也许你坚持,会在未来看到来自你的变更记录。

你可能感兴趣的:(javascript)