编译原理实战课
宫文学
北京原点代码 CEO
26066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
真实编译器解析篇 (19讲)
编译原理实战课
15
15
1.0x
00:00/00:00
登录|注册

21 | JavaScript编译器(二):V8的解释器和优化编译器

逃逸分析
内联
内联缓存
Hidden Class
优化算法
IR图形化工具
Sea of Nodes
标记指针技术
汇编代码生成
类型推断
字节码优化
内置函数实现
隐藏类和内联缓存
IR和优化算法
基于推理的优化
提升Ignition的速度
TurboFan优化编译器
Ignition解释器
解析器优化
参考资料
一课一思
思维导图
运行速度
编译速度
V8
JavaScript编译器

该思维导图由 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
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • coder
    请教龚老师一个私人问题,龚老师作为自己公司的CEO,通常理解应该是比较忙的,您是如何规划自己的时间的,还有时间在极客时间写专栏?👍👍👍

    作者回复: 首先是个人兴趣,自己有兴趣的事情,总是会挤出时间来的。 第二,是我目前正在设计和实现一门新语言,所以兴趣和工作方向是结合起来的。在做我自己的工作的时候,我也必须跟踪当前主要的编译器的技术动态,这样才能做出正确的技术决策。所以基于这些工作来写专栏内容是比较自然的。 第三,我们的公司还是个小公司,没有那么多需要处理的事情。而且,我们未来的方向,是围绕基础技术创新的,所以研发是当前阶段关注的核心。

    2020-07-29
    2
    7
  • 维李设论
    宫老师,对于 0 && 1 === null; 这个语句,后边的===是否走了呢?从运算符优先级上来说,应该先处理===再处理&&,但是对于0 && 这样开头的语句,V8的Ignition是否会先优化掉直接处理吗?不需要再读取后边的内容呢?谢谢

    作者回复: 通常的编译器都会有短路逻辑,直接优化掉,从而不必处理“1===null”。 在优化的时机上,可以很早就做这个优化,就像javac编译器那样。

    2020-10-12
  • myrfy
    python里的字典初始化语法和js类似,也可以用隐藏类 因为同样是动态语言,也可以基于统计特征推断类型然后做jit优化。另外python有一个强类型约束的子集,叫RPython,没记错的话pypy解释器就是用rpython写的。另外也可以借鉴Cython为类似python的语法加类型注解,从而帮助编译器推断类型。 指针压缩好像不太适合,因为Python的一大特点就是作为胶水语言,很多高性能的工作都是第三方c库实现的,c-ffi调用很频繁,所以采用大家通用的指针表达方式会好一些
    2020-07-20
    2
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部