21 | JavaScript编译器(二):V8的解释器和优化编译器
宫文学
该思维导图由 AI 生成,仅供参考
你好,我是宫文学。通过前一讲的学习,我们已经了解了 V8 的整个编译过程,并重点探讨了一个问题,就是 V8 的编译速度为什么那么快。
V8 把解析过程做了重点的优化,解析完毕以后就可以马上通过 Ignition 解释执行了。这就让 JavaScript 可以快速运行起来。
今天这一讲呢,我们重点来讨论一下,V8 的运行速度为什么也这么快,一起来看看 V8 所采用的优化技术。
上一讲我也提及过,V8 在 2008 年刚推出的时候,它提供了一个快速编译成机器码的编译器,虽然没做太多优化,但性能已经是当时其他 JavaScript 引擎的 10 倍了。而现在,V8 的速度又是 2008 年刚发布时候的 10 倍。那么,是什么技术造成了这么大的性能优化的呢?
这其中,一方面原因,是 TurboFan 这个优化编译器,采用了很多的优化技术。那么,它采用了什么优化算法?采用了什么 IR?其优化思路跟 Java 的 JIT 编译器有什么相同点和不同点?
另一方面,最新的 Ignition 解释器,虽然只是做解释执行的功能,但竟然也比一个基础的编译器生成的代码慢不了多少。这又是什么原因呢?
所以今天,我们就一起把这些问题都搞清楚,这样你就能全面了解 V8 所采用的编译技术的特点了,你对动态类型语言的编译,也就能有更深入的了解,并且这也有助于你编写更高效的 JavaScript 程序。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
V8是一款JavaScript引擎,采用了TurboFan优化编译器和Ignition解释器,通过类型推理进行优化,提高了JavaScript程序的性能。V8还采用了标记指针技术,降低了内存占用并提高了运行效率。隐藏类和内联缓存机制帮助V8优化对象属性的访问速度。Ignition采用了TurboFan来编译内置函数,这种技术非常聪明,既省了工作量,又简化了系统的结构。文章还介绍了V8的字节码优化算法,减少对临时变量的使用,提高运行效率。总的来说,V8在TurboFan和Ignition上所采用的优化技术能够帮助读者更高效地运行JavaScript程序。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理实战课》,新⼈⾸单¥59
《编译原理实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(3)
- 最新
- 精选
- coder请教龚老师一个私人问题,龚老师作为自己公司的CEO,通常理解应该是比较忙的,您是如何规划自己的时间的,还有时间在极客时间写专栏?👍👍👍
作者回复: 首先是个人兴趣,自己有兴趣的事情,总是会挤出时间来的。 第二,是我目前正在设计和实现一门新语言,所以兴趣和工作方向是结合起来的。在做我自己的工作的时候,我也必须跟踪当前主要的编译器的技术动态,这样才能做出正确的技术决策。所以基于这些工作来写专栏内容是比较自然的。 第三,我们的公司还是个小公司,没有那么多需要处理的事情。而且,我们未来的方向,是围绕基础技术创新的,所以研发是当前阶段关注的核心。
2020-07-2927 - 维李设论宫老师,对于 0 && 1 === null; 这个语句,后边的===是否走了呢?从运算符优先级上来说,应该先处理===再处理&&,但是对于0 && 这样开头的语句,V8的Ignition是否会先优化掉直接处理吗?不需要再读取后边的内容呢?谢谢
作者回复: 通常的编译器都会有短路逻辑,直接优化掉,从而不必处理“1===null”。 在优化的时机上,可以很早就做这个优化,就像javac编译器那样。
2020-10-12 - myrfypython里的字典初始化语法和js类似,也可以用隐藏类 因为同样是动态语言,也可以基于统计特征推断类型然后做jit优化。另外python有一个强类型约束的子集,叫RPython,没记错的话pypy解释器就是用rpython写的。另外也可以借鉴Cython为类似python的语法加类型注解,从而帮助编译器推断类型。 指针压缩好像不太适合,因为Python的一大特点就是作为胶水语言,很多高性能的工作都是第三方c库实现的,c-ffi调用很频繁,所以采用大家通用的指针表达方式会好一些2020-07-202
收起评论