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

20 | JavaScript编译器(一):V8的解析和编译过程

汇编代码解读
示例程序
TurboFan即时编译器
Ignition特点
Ignition设计
字节码示例
Parser实现机制
懒解析技术
优化技术
词法分析和语法分析
V8编译过程图例
V8源代码结构
编译V8
下载V8源代码
编译技术潜力
JavaScript引擎
发布历史
参考资料
一课一思
课程小结
编译成机器码
编译成字节码
V8解析源代码
V8编译过程
V8编译器
JavaScript编译器(一):V8的解析和编译过程

该思维导图由 AI 生成,仅供参考

你好,我是宫文学。从这一讲开始,我们就进入另一个非常重要的编译器:V8 编译器。
V8 是谷歌公司在 2008 年推出的一款 JavaScript 编译器,它也可能是世界上使用最广泛的编译器。即使你不是编程人员,你每天也会运行很多次 V8,因为 JavaScript 是 Web 的语言,我们在电脑和手机上浏览的每个页面,几乎都会运行一点 JavaScript 脚本。
扩展:V8 这个词,原意是 8 缸的发动机,换算成排量,大约是 4.0 排量,属于相当强劲的发动机了。它的编译器,叫做 Ignition,是点火装置的意思。而它最新的 JIT 编译器,叫做 TurboFan,是涡轮风扇发动机的意思。
在浏览器诞生的早期,就开始支持 JavaScript 了。但在 V8 推出以后,它重新定义了 Web 应用可以胜任的工作。到今天,在浏览器里,我们可以运行很多高度复杂的应用,比如办公套件等,这些都得益于以 V8 为代表的 JavaScript 引擎的进步。2008 年 V8 发布时,就已经比当时的竞争对手快 10 倍了;到目前,它的速度又已经提升了 10 倍以上。从中你可以看到,编译技术有多大的潜力可挖掘!
对 JavaScript 编译器来说,它最大的挑战就在于,当我们打开一个页面的时候,源代码的下载、解析(Parse)、编译(Compile)和执行,都要在很短的时间内完成,否则就会影响到用户的体验。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

V8是谷歌公司于2008年推出的JavaScript编译器,被广泛应用于浏览器和Node.js等环境中。本文介绍了V8编译器的架构和编译过程,强调了其在提升JavaScript执行速度方面的重要性。文章首先介绍了V8的背景和重要性,随后详细解释了V8的编译过程,包括源代码的下载、解析、编译和执行等阶段。特别强调了V8编译器的挑战在于需要在短时间内完成这些过程,以保证用户体验。文章还提到了V8的编译器构成和与Java编译器的相似之处,并介绍了V8编译过程中的两个特色处理阶段:流处理节点和预解析器。V8解析源代码的速度必须要非常快才行。在语法分析方面,V8采用了“懒解析”技术,即在正式运行某个函数的时候,编译器才会按需解析这个函数。此外,文章还介绍了V8的解释器Ignition和即时编译器TurboFan的特性,以及它们在提高JavaScript执行效率方面的作用。总的来说,本文为读者提供了对V8编译器的初步了解,并为进一步深入学习V8编译技术奠定了基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • westfall
    “Ignition 是一个基于寄存器的解释器。它把函数的参数、变量等保存在寄存器里。不过,这里的寄存器并不是物理寄存器,而是指栈帧中的一个位置。”请问老师,这样的话它跟基于栈的解释器有多大区别呢?

    作者回复: 最大的差别,是指令的不同。栈机的指令不用后面跟操作数,因为操作数肯定在栈里,需要几个操作数就从栈里取几个。 实现细节上也会有不同。比如,Ignition还是尽量借助了物理寄存器的,比如它用了一个累加器,存放缺省的操作数。这样会提升性能。

    2020-08-04
    4
  • sugar
    "Preparser 粗略地解析一遍程序,在正式运行某个函数的时候,编译器才会按需解析这个函数。"——是否可以理解为,v8的懒解析是以js中的函数为原子粒度的?是否存在对较大的语法块,比如switch、某个if的条件内逻辑非常庞大等部分单独作为懒解析呢? 因为有可能说一个if判断条件很少为true,但内部代码行数达到几百行,一次性解析成AST比较浪费... 但如果按function的粒度,这种情况也都会被一次性完全解析成AST了

    作者回复: 以函数为颗粒度来管理,比较简单。 如果更细的颗粒度,收益和付出的代价相比,可能不够多。

    2020-07-22
    2
  • sugar
    宫老师,想请教下在自己的c++项目中 如果想引入v8,对js source code作AST-parse,甚至单独抽出v8当中的某一些部分来做些事情,这方面是否有什么好的资料可以参考?在v8.dev官网似乎并没找到很详细的这方面的guidance,我经常遇到的就是很多头文件的依赖需要手动处理,毕竟v8本身的编译是基于ninja的,而自己的一些c++项目通常在mac本地会用xcode(v8项目中似乎有个可以build出.xcodeproj工程目录的选项,但我build出来放进xcode里一大堆报错,根本跑不通>.<),或者在linux上用make方式,这会遇到很多坑需要踩,不知这方面有没有比较好的资料推荐?
    2020-07-20
    10
    2
  • 刘強
    有点奇怪,解释器也是一个程序,解释执行字节码,为什么能用上物理寄存器
    2023-11-04归属地:上海
  • VoiceWitness
    【你可以在终端测试一下懒解析和完整解析的区别。针对 foo.js 示例程序,你输入“./d8 – ast-print foo.js”命令。】 这里应该是 --print-ast
    2022-10-11归属地:浙江
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部