20 | 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
《编译原理实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(5)
- 最新
- 精选
- westfall“Ignition 是一个基于寄存器的解释器。它把函数的参数、变量等保存在寄存器里。不过,这里的寄存器并不是物理寄存器,而是指栈帧中的一个位置。”请问老师,这样的话它跟基于栈的解释器有多大区别呢?
作者回复: 最大的差别,是指令的不同。栈机的指令不用后面跟操作数,因为操作数肯定在栈里,需要几个操作数就从栈里取几个。 实现细节上也会有不同。比如,Ignition还是尽量借助了物理寄存器的,比如它用了一个累加器,存放缺省的操作数。这样会提升性能。
2020-08-044 - sugar"Preparser 粗略地解析一遍程序,在正式运行某个函数的时候,编译器才会按需解析这个函数。"——是否可以理解为,v8的懒解析是以js中的函数为原子粒度的?是否存在对较大的语法块,比如switch、某个if的条件内逻辑非常庞大等部分单独作为懒解析呢? 因为有可能说一个if判断条件很少为true,但内部代码行数达到几百行,一次性解析成AST比较浪费... 但如果按function的粒度,这种情况也都会被一次性完全解析成AST了
作者回复: 以函数为颗粒度来管理,比较简单。 如果更细的颗粒度,收益和付出的代价相比,可能不够多。
2020-07-222 - 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-20102
- 刘強有点奇怪,解释器也是一个程序,解释执行字节码,为什么能用上物理寄存器2023-11-04归属地:上海
- VoiceWitness【你可以在终端测试一下懒解析和完整解析的区别。针对 foo.js 示例程序,你输入“./d8 – ast-print foo.js”命令。】 这里应该是 --print-ast2022-10-11归属地:浙江
收起评论