
上篇介绍过JavaScript引擎的历史,《JS引擎(0):起底各种JavaScript引擎群雄争霸之路》
一些流行的 JavaScript 引擎
不懂的术语,可以跳转至 JavaScript引擎相关关术语解析
SpiderMonkey | JScript | KJS | |
|---|---|---|---|
实现语言 | C | C++ | C++ |
执行模式 | 解释执行 | 解释执行 | 解释执行 |
解释器 | 字节码解释器:基于栈的字节码 | 字节码解释器:基于栈的字节码 | 树遍历解释器 |
动态编译器 | 无 | 无 | 无 |
自动内存管理 | mark-and-sweep | mark-and-sweep | mark-and-sweep |
对象布局 | ? | 基本上是HashTable | ? |
针对密集数组的优化 | ? | 无 (JScript < 5.7);有(JScript 5.8) | ? |
Inline-cache | ? | ? | ? |
值表现形式 | tagged-value | 堆对象 | 堆对象 |
Function.prototype.toString() | 从字节码反编译 | ? | ? |
在Google推出V8之后,业界受到巨大冲击。V8的性能远高于当时所有其它JavaScript引擎,可以有效支撑起当时兴起的大量使用JavaScript的Web应用。
各大JavaScript引擎的实现者都坐不住了,像打了鸡血似的使劲优化优化再优化。先是把已在其它HLLVM上得到充分验证的优化技术引入到JavaScript引擎中,然后再针对JavaScript语言的特点做专项优化。
V8 | SpiderMonkey | Chakra | Nitro | Nashorn | |
|---|---|---|---|---|---|
实现语言 | C++/汇编 | C++ | C++ | C++/汇编 | Java |
执行模式 | 纯编译: 两层编译 | 解释/编译混合式: 3层执行模式 | 解释/编译混合: 2层执行模式,后台编译 | 解释/编译混合: 3层执行模式 | 纯编译 |
解释器 | 无 | 字节码解释器 | 字节码解释器:基于寄存器的字节码 | 字节码解释器 LLInt:基于寄存器的字节码 | 无 |
动态编译器 | 初级编译器 + 优化编译器 | 初级编译器 Baseline + 优化编译器 IonMonkey | 有 | 初级编译器 method JIT + 优化编译器 DFG JIT | 有 |
自动内存管理 | 分代式GC: 初生代: copying收集器; 年老代: 增量式mark-and-sweep, 可选compact | 分代式GC | 分代式GC: 初生代: copying收集; 年老代: 并发式mark-and-sweep | 分代式GC | 依赖于底层JVM的GC |
对象布局 | 紧凑+隐藏类 Map | 紧凑+隐藏类 Shape | 紧凑+隐藏类 | 紧凑+隐藏类 Structure | 紧凑+隐藏类 PropertyMap |
针对密集数组的优化 | 有 | 有 | 有 | 有 | 有 |
Inline-cache | MIC/PIC | PIC | PIC | PIC | MIC/PIC |
值表现形式 | tagged-pointer / IEEE 754 double / integer | pun-boxing | tagged-value | NaN-boxing | 堆对象 / integer |
正则表达式 | 编译 Irregexp | 编译 | 编译 | 编译 WREC | 混合 |
Function. prototype. toString() | 保留源码原文 | (2012年7月前) 从字节码反编译; (761723后) 保留源码原文 | ? | ? | 保留源码原文 |
当代JavaScript引擎之间有许多共通的实现技巧。多数优化会对JavaScript程序的行为做一定猜测(speculate),并基于猜测做激进优化(speculative optimization)。下面挑几个简单介绍一下。
也叫做编译器的“前端”。
递归下降式语法分析器(recursive-descent parser)
运算符优先级式语法分析器(operator precedence parser)
deferred parser / diet parser(延迟语法分析)
也叫做编译器的“后端”。但因为这部分编译器经常被叫做“JIT”编译器,所以单独拿出来写
JIT style compiler: “just-in-time编译”狭义的定义是“即时编译”,也就是在某段代码即将第一次被执行时才对其编译。太早或太迟都不符合这个狭义版定义。所谓“JIT风格的编译器”通常意味着“编译是同步进行的”。这就自然的引出几个特征:
上面介绍的JavaScript引擎实现技巧也影响了“如何写出更高效的JavaScript代码”:尽量让代码的行为符合JavaScript引擎的猜测,效率就会高。
参考内容:
各JavaScript引擎的简介,及相关资料/博客收集帖 https://hllvm-group.iteye.com/group/topic/37596
转载本站文章《JS引擎(1):JS引擎擂台赛,JavaScript引擎的特征比较及术语科普》, 请注明出处:https://www.zhoulujun.cn/html/webfront/browser/webkit/2020_0718_8522.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。