Google V8 团队的技术博客(Blog)是理解V8架构和实现细节、后续研发进展的重要的来源。 另一方面,V8的技术实现一直在快速变化,博客内容从2015到2020时间跨度很大, 是否与代码一致,需要读者自己去对比才行。 我们在《深入V8引擎》的repo中记录自己阅读V8博客中的笔记和评论,方便后续我们新加入V8项目的同事理解。
目前的技术评论的时间节点是2020年第二季度。
Published 19 May 2020 · tagged with ECMAScript
如果对JS规范不熟悉,可以看一看。熟悉的就不用看了。
Published 14 May 2020 · tagged with WebAssembly JavaScript tooling
不用看。
Published 04 May 2020 · tagged with release
不用看。
Published 27 April 2020 · tagged with WebAssembly tooling
不用看。
Published 01 April 2020 · tagged with ECMAScript
如果对JS规范不熟悉,可以看一看。熟悉的就不用看了。
Published 30 March 2020 · tagged with internals memory
需要阅读。
Published 02 March 2020 · tagged with ECMAScript
如果对JS规范不熟悉,可以看一看。熟悉的就不用看了。
Published 25 February 2020 · tagged with release
不用看。
Published 03 February 2020 · tagged with ECMAScript
如果对JS规范不熟悉,可以看一看。熟悉的就不用看了。
Published 18 December 2019 · tagged with release
不用看。
Published 21 November 2019 · tagged with WebAssembly tooling
不用看。
Published 20 November 2019 · tagged with release
基本不用看。
Published 04 October 2019 · tagged with internals RegExp
需要阅读。
... we first compile all regular expressions to bytecode and interpret them. This way, we save a lot of memory ...
Starting with V8 v7.8, whenever the RegExp compiler generates bytecode to interpret a regular expression, a trampoline to the RegExp interpreter is now stored in the JSRegExp object’s code field in addition to the generated bytecode.
However, a big difference between Ignition and the RegExp interpreter is that Ignition’s bytecode handlers are written in CodeStubAssembler, whereas the whole RegExp interpreter is written in C++ using computed gotos (a GNU extension also supported by clang), which is easier to read and maintain than CSA.
Published 27 September 2019 · tagged with release
需要看一下。在跟UI主线程的交互上更加的异步。
Published 12 September 2019 · tagged with internals memory presentations
需要阅读。涉及到目前的架构实现。
In late 2018 we started a project called V8 Lite, aimed at dramatically reducing V8’s memory usage. Initially this project was envisioned as a separate Lite mode of V8 specifically aimed at low-memory mobile devices or embedder use-cases that care more about reduced memory usage than throughput execution speed.
这类博客是难得的,里面有设计思想和代码实现的目的。带着这个目的来看,很多设计选择会更加容易理解。
Published 28 August 2019 · tagged with internals presentations
必读。非常好的入门进阶。尤其是对JS不熟悉的C++程序员。
Published 13 August 2019 · tagged with release
不用看。
Published 01 July 2019 · tagged with WebAssembly tooling
Published 25 June 2019 · tagged with internals parsing
看一下。油管视频需要翻墙。
Published 19 June 2019 · tagged with release
不用看。
Published 17 June 2019 · tagged with WebAssembly internals
不用看。我们暂时不做 wasm。后续做到了需要看。
Published 16 May 2019 · tagged with release
不用看。
Published 25 April 2019 · tagged with ECMAScript Intl
不用看。
Published 23 April 2019 · tagged with security
安全相关的,刚开始入手V8项目的话不用看。
在 Spectre 和 Meltdown 之后,所有的软件也都不是原先的实现了。具体的设计上会有一些防御的模式
Published 15 April 2019 · tagged with internals parsing
这篇值得看一看。涉及到了部分执行的细节。
For this reason V8 has two simple patterns it recognizes as possibly-invoked function expressions (PIFEs; pronounced “piffies”), upon which it eagerly parses and compiles a function:
Published 08 April 2019 · tagged with internals
这篇值得看一看。
Chrome has two levels of caching for V8 compiled code (both classic scripts and module scripts): a low-cost “best effort” in-memory cache maintained by V8 (the Isolate cache), and a full serialized on-disk cache.
这部分我不太了解。第一个知识点是从scanner之前就是全部规整成了 UTF-16 编码格式(不同的编码是真的一个工程噩梦);另一个知识点是JS的自动分号插入(希望这个特性早点被废哈哈)
其他部分的加速技巧和算法改进,由于我们基本上不太可能做scanner,可以跳过。
没有必须要看的内容。可能后续做版本回溯的时候需要。
But in some situations it can be desirable to run V8 without allocating executable memory:
Some platforms (e.g. iOS, smart TVs, game consoles) prohibit write access to executable memory for non-privileged applications, and it has thus been impossible to use V8 there so far; and disallowing writes to executable memory reduces the attack surface of the application for exploits.
引入了新的参数选项 jitless,值得看下。因为移植的时候会从 jitless 开始,看起来简单一点(后来发现并没有)
What’s the difference between --jitless and --no-opt?
--no-opt disables the TurboFan optimizing compiler. --jitless disables all runtime allocation of executable memory.
Published 07 February 2019 · tagged with release
可以不用看。
标题玩梗 :-)
技术报告值得一看,或者说是需要看。已经搬运到的国内B站: https://www.bilibili.com/video/BV1TJ411n7pi
Published 18 December 2018 · tagged with release
可以不用看。
Published 04 December 2018 · tagged with ECMAScript benchmarks
暂时不用看。
Published 12 November 2018 · tagged with ECMAScript benchmarks presentations
暂时不用看。
Published 31 October 2018 · tagged with release
基本不用看。
Published 15 October 2018 · tagged with release
基本不用看。
Published 28 September 2018 · tagged with ECMAScript internals
提到了 Timsort 在 torque 的介绍中也提到了,可以看一下本文。
Published 18 September 2018 · tagged with ECMAScript benchmarks
可以不看。
Published 11 September 2018 · tagged with benchmarks
值得阅读。
Published 20 August 2018 · tagged with WebAssembly internals
做 WebAssembly 需要看。
Published 14 August 2018 · tagged with internals
值得阅读。提供了不少内存布局中的细节信息。
Published 07 August 2018 · tagged with release
不用看。
Published 21 June 2018 · tagged with release
需要看一下,帮助理解V8的内存中数据结构改进(历史)轨迹。
Published 11 June 2018 · tagged with internals memory
GC 相关的。暂时不用看。以后做GC的时候回过头来看。
Published 04 May 2018 · tagged with release
不用看。
Published 02 May 2018 · tagged with ECMAScript
可以跳过去。
Published 24 April 2018 · tagged with internals
有需要 Code Caching 功能的可以看下。 默认做 RISC-V 移植先不用看。
Published 27 March 2018 · tagged with release
- GYP 没有了。从这个版本开始。
- Code Caching (还没搞清楚是哪一块的 Code Caching)的改进。
- 还有一系列内容。
使用老旧版本V8的小伙伴或许需要关注下。
Published 26 March 2018 · tagged with internals
不用看。
Published 01 March 2018 · tagged with internals memory
Chrome’s DevTools 不用看。做到浏览器的时候才需要。
Published 12 February 2018 · tagged with internals
相关,但是可以不看,一般移植工作做不到这里。
Published 01 February 2018 · tagged with release
新增了 untrusted code 模式。其它不用看。
Published 29 January 2018 · tagged with internals
有一个设计细节,可以看一下。不看也行,代码中有。
Published 24 January 2018 · tagged with benchmarks
不用看。
Published 19 December 2017 · tagged with release
不用看。
Published 13 December 2017 · tagged with internals
Published 29 November 2017 · tagged with internals memory
parallel Scavenger。
没看。需要改GC的性能的时候再看吧。
Published 16 November 2017 · tagged with internals
需要重点看下。看完之后去看文档。
Published 06 November 2017 · tagged with benchmarks Node.js
不用看。
Published 25 October 2017 · tagged with release
可以不看。
Published 05 October 2017 · tagged with ECMAScript benchmarks internals
需要看。
Published 04 October 2017 · tagged with memory internals
这位同学的PPT很魔性😄推荐看看。
更正:记错了,blog中给出来的slides非常正经,而且做V8的同学是需要看懂 deopt 的。
Published 22 September 2017 · tagged with security
不用看了。
Published 12 September 2017 · tagged with internals presentations
视频我搬运到了B站,可以组合看下,如果是编译领域从业,对JS不熟悉的话,可以解惑:
Mathias Bynens - V8 internals for JavaScript developers https://www.bilibili.com/video/BV1oJ411J7j1
Published 11 September 2017 · tagged with release
不用看。
Published 30 August 2017 · tagged with internals
这篇blog的内容所有做V8的同学都需要阅读下(以保证自己理解了JS的语言特性以及V8的处理方式)
Published 11 August 2017 · tagged with security
不做安全的话不用看,已经过去了。
Published 03 August 2017 · tagged with release
不用看。
Published 09 June 2017 · tagged with release
不用看。
Published 15 May 2017 · tagged with internals
第一次接触V8的需要看一下。
那个logo应该不是一个灯笼,是两个火花装置尖端放电?
Published 27 April 2017 · tagged with release
v5.9 开始启用了 Igniton + TurboFan。
Published 12 April 2017 · tagged with benchmarks
不用看。其实我们还是在用 Octane 的。
Published 20 March 2017 · tagged with release
可以不看。
Published 01 March 2017 · tagged with internals
需要看一下。涉及到 for-in 的内部处理。性能提升部分不用细看,看原理就行。
Published 17 February 2017 · tagged with ECMAScript
不用看。
Published 14 February 2017 · tagged with internals
不用看。
Published 09 February 2017 · tagged with memory
Dev工具改进,感知内存压力并自动停止,防止对V8的堆造成压力。
我们目前是只做V8的话不用看这篇。以后做Chromium的时候需要关注下是不是还是当前的实现。
Published 06 February 2017 · tagged with release
启用了 webassemly。 其它主要是性能改进。
Published 10 January 2017 · tagged with internals RegExp
从 v5.7 开始ship新的regexp,从第三方的库实现,转移到了turbofan中,使用CSA形式。
具体RE这部分实现我还没看。目前感觉不需要阅读。
Published 21 December 2016 · tagged with benchmarks
在做性能测试之前需要阅读下这篇博客,给出了比技术分享视频更加简洁的 brief history。
Published 15 December 2016 · tagged with Node.js
好的好的。可以在 DevTools 中对 Node.js 进行调试。
Published 02 December 2016 · tagged with release
是个大版本更新。Ignition/TurboFan的两阶段架构开始启用,原有的Crankshaft在后续的版本中被移除了。 内存的性能改进还是围绕着 Orinoco GC 的改进进行。这部分更小众,暂时没有关注。 速度优化覆盖了一系列原先加入的ES6特性(估计是跟各个浏览器厂商在PK的结果)。
相关阅读: https://benediktmeurer.de/2016/11/25/v8-behind-the-scenes-november-edition/
Published 31 October 2016 · tagged with WebAssembly
联合几个浏览器大厂宣布了 WebAssembly。 由于目前我们还没有关注到 WebAssembly,暂时没有评论。 时至今日wasm还是作为一个输入进入 turbofan 的。所以在 turbofan 的知识是共用的。
Published 24 October 2016 · tagged with release
语言特性介绍了 async functions,继续改进了内存优化。
The V8 inspector was migrated from Chromium to V8. The inspector code now fully resides in the V8 repository.
Published 07 October 2016 · tagged with memory benchmarks
介绍了Chrome/V8模拟在野评测的评测的方法。
提供了新的 V8 heap visualizer,同时介绍了内存优化的几个技术概述。 如果是做浏览器或者后续的嵌入式的环境的话,或许需要看一看。
有关 Tracing 的内容可以进一步从 https://www.chromium.org/developers/how-tos/trace-event-profiling-tool 获得。
Published 09 September 2016 · tagged with release
本次发布没有说ES6特性,主要是性能和内存改进的说明。
技术细节可以参考 BlinkOn 6 Day 1 Talk 2- Ignition - an interpreter for V8 https://www.bilibili.com/video/BV15J411J7Gf/
以及V8的文档中的ignition部分。
Published 21 July 2016 · tagged with presentations
会议内容有价值,值得观看。 油管内容已经搬运到B站:
Real-world JavaScript performance https://www.bilibili.com/video/BV1e54y1d7HX/
BlinkOn 6 Day 1 Talk 2- Ignition - an interpreter for V8 https://www.bilibili.com/video/BV15J411J7Gf/
How we measure and optimize for RAIL in V8’s GC #
ECMAScript 2015 and beyond
Tracing wrappers from V8 to Blink (lightning talk)
Published 18 July 2016 · tagged with release
启用了 Ignition 解释器。
Published 04 June 2016 · tagged with release
其中提到的油管视频,我搬运到了B站,可以直接看: BV1WK411L7zS
Published 29 April 2016 · tagged with ECMAScript
对ES6标准不熟悉的可以看看。不涉及V8细节。
Published 23 April 2016 · tagged with release
新增JS特性我已经看不懂了。
v5.1 版本开始有初步的wasm支持;继续改进了 orinoco。
Published 12 April 2016 · tagged with internals memory
有关V8的GC的,是必须要看的内容。
对照 Orinoco: The new V8 Garbage Collector Peter Marshall 一起看。
Published 15 March 2016 · tagged with release
不熟悉ES6的同学可以按照 🏷️release 标签一步一步学习下。不至于一次知识点太多噎住了。
Published 15 March 2016 · tagged with WebAssembly
等做到 WASM 的时候、并且要写PPT的时候需要回来考古下。
代码方面不用看了,可以以代码为准。
JS的正则表达式的一个功能点介绍。默认可以不看。
TODO 确认是否还存在。
用更容易的方式从JS构建V8的 custom snapshot。
V8 extras provide a new and lightweight way for embedders to implement features.
ref: https://v8.dev/blog/custom-startup-snapshots
JS的新技能。熟悉JS就不用看。
(btw,对于我是有帮助的,原来JS又添加了这么多的 feature …… Proxy & Reflect)
17 December 2015 🏷️ECMAScript 🏷️internals
安全问题相关。默认不用看。
25 November 2015 🏷️release
ES6的两个特性的实现。
30 October 2015 🏷️memory
原理和开发人员的关注点(需求来源)可以看下。改进的目标讲解的比较清楚。技术细节没有讲。
14 October 2015 🏷️release
不熟悉JS的可以看看,熟悉的可以跳过。
25 September 2015 🏷️internals
TODO 确认下这里的 snapshot 跟目前V8代码中的 mksnapshot 等概念是否是一致的。
概念上类似于将代码内容确定的 builtin 编译成 so 库直接加载。
另一个概念是JS是有宿主环境这个概念的,不同的宿主环境给出来的可用的函数不一样,例如nodejs和浏览器。
28 August 2015 🏷️release
- 介绍了几个ES6的特性。对JS熟悉的可以跳过,不熟悉的建议看看,多学习点。
- 提到了四个避免 jank 的优化。目前建议是不用看了。可能已经过时。
07 August 2015 🏷️internals 🏷️memory
如果是没有接触过GC的概念的话,这篇需要看下。目前的GC已经有了一些改进,参考 Orinoco: The new V8 Garbage Collector Peter Marshall 同时,增量GGC的基本思路目前是没变的。
TODO 提到的Chromium的 task scheduler 不确定现在是否淘汰了。以及 vsync 的概念是否还有。
27 July 2015 🏷️internals
TODO 确认,不确定是否目前还是同样的实现。
这里的 Code Caching 是类似将JS源代码解析到 BaseCompiler 编译之后的结果, 优化的假设是一个脚本文件可以被多次使用,那么可以节约AST解析和输出的时间。 现在这个想法可能逐步发展成了 WebAssembly?
17 July 2015 🏷️release
版本发布类的并不需要仔细看。主要都是 feature 的内容。本次添加了一些ES2015的语言特性。
13 July 2015 🏷️internals
开始针对某些特定的JS代码启用 turbofan。提到了特性:SoN,多层次翻译和优化。 明确的区分了JS语言、VM层和特定架构后端。这个目前也还是的。 给了一个 SoN IR 的例子。具体的IR细节内容可以看V8文档中的 IR 介绍。
https://v8.dev/blog/hello-world
从 chromium blog 中剥离出来的第一篇。没技术内容。
这里收录了 Chromium Blog 中标记了 v8 tag 以及我们觉得跟理解V8代码相关的内容。
Tuesday, May 1, 2012
https://blog.chromium.org/2012/05/better-code-optimization-decisions-for.html
PR成分多一些,介绍的是 Chrome 20 相对于 Chrome 19 的提升。
Thursday, March 15, 2012
https://blog.chromium.org/2012/03/v8-benchmark-suite-extended-with.html
内容关系不大,可以不看。
Monday, November 21, 2011
https://blog.chromium.org/2011/11/game-changer-for-interactive.html
GC的内容,本篇是PR,没有技术细节。而后续可以参考另一个演讲视频:
Orinoco: The new V8 Garbage Collector Peter Marshall
Wednesday, May 4, 2011
https://blog.chromium.org/2011/05/updating-javascript-benchmarks-for.html
内容相关,有效。信息量不大,知道 Kraken、SunSpider 和 Octane 是 JS 测试集就行。
Tuesday, December 7, 2010
https://blog.chromium.org/2010/12/new-crankshaft-for-v8.html
Crankshaft 在 V8 7.x 之后就没有了。
欢迎国内的伙伴提交PR将自己的文章加入进来,一起积累❤️