专栏名称: zidea
目录
今天看啥  ›  专栏  ›  zidea

深入 javascript 引擎(1)

zidea  · 简书  ·  · 2019-01-12 05:54

文章预览

周末在家看了有关 javascript 引擎的 JavaScript Engines: The Good Parts”,是由 Mathias 和 Benedikt 在 JSConf EU 2018 开发者大会上给出的 presentation 。感觉不错,想跟大家分享一下,写完了,忽然发现有人已经分享有关这个 presentation 的帖子,写相当不错。

为了有自己特色自己也翻阅一些资料,想扩展一下,给大家带来更多信息,可能 JavaScript 引擎离我们还有一定距离,或者是遥不可及。不过出于兴趣还是想了解一下。了解也对于开发还是有一定帮助,可以让我们写出高性能的 JavaScript 代码。现在不仅是比

javascript 之所有今天成就,多半是因为其背后的引擎。就像 java 一样,java 成就和 JVM 是分不开的。JVM 处理 java 同时也衍生出了 groovy ,scala 和 kotlin 这些优秀的语言。

javascript 活跃在各个领域,像 web 前端和后端、 移动设备和桌面应用都有他的身影。这一切都要归功给 javascript 的引擎。

Chakra是一个由微软为其Internet Explorer 9、Internet Explorer 10、Internet Explorer 11和Microsoft Edge等网页浏览器开发的JavaScript引擎。chakra 号称更安全


SpiderMonkey 是Mozilla使用C/C++编写的JavaScript 引擎。



我们可以通过用 npm 全局安装 jsvu 来体验一下这些 js 引擎来编译你的 javascript 代码。

首先通过 paser 将 JavaScript 代码解析,注意这里是解析不是解释,解析成 AST ,一个树形结构,大家感兴趣可以用 babel 工具将讲你的代码转换为 AST 来看一看,这个树上的每一个节点有很多属性信息。

一般来说,(所有 JavaSciript 引擎)都有一个包含解释器和优化编译器的处理流程。其中,解释器可以快速生成未优化的字节码,而优化编译器会需要更长的时间,以便最终生成高度优化的机器码。


这是所有 JavaScript 引擎的核心,也是 JavaScript 之所以这么快的原因。interpreter(解释器),

我们可以逐一看一看各个 javascript 引擎都对 JavaScript 在编译成为机器码做了哪些优化,虽然优化和加速各有不同,当时本质上都是准寻上图所示。

V8 中的解释器被称作 Ignition,它负责生成并执行字节码。当它运行字节码时会收集分析数据,而它之后可以被用于加快(代码)执行的速度。当一个函数变得 hot,例如它经常被调用,生成的字节码和分析数据则会被传给 TurboFan——我们的优化编译器,它会依据分析数据生成高度优化的机器码。

SpiderMonkey,在 Firefox 和 SpiderNode 中使用的 Mozilla 的 JavaScript 引擎,则有一些不同的地方。它们有两个优化编译器。解释器将代码解释给 Baseline 编译器,该编译器可以生成部分优化的代码。 结合运行代码时收集的分析数据,IonMonkey 编译器可以生成高度优化的代码。 如果尝试优化失败,IonMonkey 将回退到 Baseline 阶段的代码。

JavaScriptCore(缩写为JSC),Apple 的 JavaScript 引擎,被用于 Safari 和 React Native 两个项目中,它通过三种不同的优化编译器使效果达到极致。低级解释器 LLInt将代码解释后传递给 Baseline 编译器,而(经过 Baseline 编译器)优化后的代码便传给了 DFG 编译器,(在 DFG 编译器处理后)结果最终传给了 FTL 编译器进行处理。

Chakra,用于 Edge 和 Node-ChakraCore 两个项目的微软 JavaScript 引擎,也有类似两个优化编译器的设置。解释器将代码优化成 SimpleJIT——其中 JIT 代表 Just-In-Time 编译器——它可以生成部分优化的代码。 结合分析数据,FullJIT 可以生成更深入优化的代码。

………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览