14 | 通过SparkPlug深入了解调用栈
石川
你好,我是石川。
在第 11 讲的时候,我们通过函数中的闭包了解了栈和堆这两种数据结构。在12 讲中,我们通过递归了解了函数在调用栈中的循环执行。那么今天,我们再通过 V8 的 Sparkplug 编译器来深入的了解下 JavaScript 引擎中的调用栈,其中栈帧(stack frame),栈指针(stack pointer)和帧指针(frame pointer)的概念。
这里,可能有不太了解 V8 的同学,我们来简单看一下 Sparkplug 的前世今生。最开始的时候啊,V8 用的是一个相对比较快的 Full-codegen 编译器生成未优化的代码,然后通过 Crankshaft 这个及时(JIT)编译器对代码进行优化和反优化。但是随着更多人浏览网页的习惯从 PC 端转向移动端,性能问题变得更加重要了。而这个流水线既没能对 ES6 之前的,也没能对 ES6 之后版本的 JS 做到理想的优化。
所以随之而来的,V8 就引入了 Ignition 解释器和 TurboFan 的优化编译器以移动优先为目的的流水线。它最大的特点呢,就是通过 Ignition 最终生成字节码,之后再通过 TurboFan 生成优化后的代码,和做相关的反优化。
可是这个时候,问题又来了,TurboFan 和 Crankshaft 比起来,有时也有不足。所以为了解决这个问题,V8 又创建了一个把 Full-codegen,Crankshaft,Ignition 和 TurboFan 整合起来的“全家桶”的流水线。这显然让问题显得更复杂了。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
V8引擎的Sparkplug编译器是一种快速编译器,通过对JavaScript字节码的直接编译,避免了重新解析源码和生成中间码的复杂过程。相比于其他编译器,Sparkplug的优化机会有限,但由于其简单快速的特点,代码易于移植,并且在工作流中与TurboFan相互补充,不需要大量优化。文章介绍了V8引擎的发展历程和性能优化方向,解释了Sparkplug编译器的出现原因和工作原理。通过深入了解调用栈的概念,读者可以更好地理解JavaScript引擎中的执行过程和优化编译器的作用。Sparkplug特意创建并维护与解释器相匹配的栈帧布局,简化了编译、加快了编译速度,并与系统其余部分的集成基本适配。尽管Sparkplug在很多方面与解释器做着相似的工作,但它消除了无法消除的解释器成本,对CPU优化也有着积极的影响。文章还提到了Sparkplug的窥孔优化原理,展示了V8引擎对性能极致优化的追求。通过对Sparkplug的讲解,读者可以更多地了解栈帧、栈针和帧指针的概念,以及JS的编译流水线。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《JavaScript 进阶实战课》,新⼈⾸单¥59
《JavaScript 进阶实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(7)
- 最新
- 精选
- WGH丶这节课对我来说太硬了 先放下 后面学学编译相关的知识
作者回复: 嗯嗯,了解下编译对深入理解JS是很有帮助的
2022-12-26归属地:海南 - 魏志鹏看不懂汗 流汗
作者回复: 有具体不清楚的点可以帮助你了解吗?要是系统性的,也建议参考极客时间上一些编译原理的课,增加对基础编译知识的了解。
2022-11-13归属地:北京 - 真嗣这节课过于硬核了...2023-01-12归属地:上海1
- 晴空万里这个差的东西有点多呀2023-11-01归属地:广东
- 神佑小鹿那个图的指针方向是不是错的???2023-03-17归属地:广东
- 度衡图里面的虚线'反优化'干啥呢?不应该只优化吗,怎么还反优化?2023-01-01归属地:北京
- 魏志鹏不懂啊2022-11-13归属地:陕西
收起评论