Oasis's Cloud

一个人的首要责任,就是要有雄心。雄心是一种高尚的激情,它可以采取多种合理的形式。
—— 《一个数学家的辩白》

V8 引擎工作原理

作者:oasis


https://mathiasbynens.be/notes/shapes-ics

在V8里,解释器的名字叫Ignition,它负责生成和执行字节码。当它运行字节码的时候,还会收集一些性能分析数据,这些数据之后可以用来加速执行。当一个函数变得“火热”了,比如说它被频繁运行的时候,生成的字节码和性能分析数据就会被传递给TurboFan,也就是我们的优化编译器,让它根据这些数据生成超级优化的机器码。

SpiderMonkey是Mozilla的JavaScript引擎,用在Firefox和SpiderNode里,它的做法有点不一样。它不仅有一个,而是有两个优化编译器。解释器先优化到Baseline编译器,生成一些优化过的代码。然后,结合运行代码时收集到的性能分析数据,IonMonkey编译器可以生成高度优化的代码。要是预测性优化失败了,IonMonkey就会退回到Baseline代码。

Chakra是微软的JavaScript引擎,用在Edge和Node-ChakraCore里,它的设置和前面提到的很像,也是有两个优化编译器。解释器先优化到SimpleJIT(JIT就是Just-In-Time编译器的意思),生成一些优化过的代码。然后,结合性能分析数据,FullJIT可以生成更高度优化的代码。📈🤖

JavaScriptCore(简称JSC)是苹果的JavaScript引擎,用在Safari和React Native里,它直接把优化编译器的数量拉满,搞了三个!LLInt(低级解释器)先优化到Baseline编译器,Baseline编译器再优化到DFG(数据流图)编译器,最后DFG编译器还能进一步优化到FTL(比光速还快)编译器。

JS 引擎会针对对象单独存储每个属性的描述符,通过共享的方式减少内存的使用。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode

async,该属性使脚本下载时不会阻塞 HTML 解析器(类似defer),但它会尽快执行脚本,不保证执行顺序,也不等待 HTML 解析完成。该async属性不适用于经典内联脚本,但适用于 内联<script type="module">。

模块脚本默认是延迟加载的。因此,无需添加defer标签<script type="module">!不仅主模块的下载与 HTML 解析并行进行,所有依赖模块的下载也同样如此!

import.meta

另一个与模块相关的新功能是import.meta,它为您提供当前模块的元数据。您获取的具体元数据并非 ECMAScript 中规定的内容;它取决于主机环境。例如,在浏览器中,您获取的元数据可能与在 Node.js 中不同。

import.meta这是Web 上的一个示例。默认情况下,图像是相对于 HTML 文档中的当前 URL 加载的。import.meta.url这使得可以相对于当前模块加载图像。