前端问题清单——什么是V8

169 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

什么是V8?

V8是谷歌开发的开源JavaScript引擎,用在Chrome浏览器和Nodejs中,是JavaScript的虚拟机,把JavaScript语言翻译成机器语言。

V8执行JavaScript

高级语言的执行

  • 解释执行:(1)源代码通过解析器编译成中间代码。(2)解释器解释执行中间代码,直接输出结果。
  • 编译执行:(1)源代码通过解析器转换为中间代码 (2)编译器将中间代码编译为机器代码。编译好的机器代码是二进制文件形式存储,执行程序的时候直接执行二进制文件就可以。

V8没有采用某种单一的执行方式,采用了JIT(Just In Time)技术。 因为编译器启动速度慢,执行速度快,而解释器启动速度快,执行速度慢。JIT集合了编译执行和解释执行两种方式的优点。

V8的执行过程

  • V8启动初期,会初始化执行环境,包括栈和堆、全局上下文、全局作用于、事件循环系统等
  • 一般的js代码经过解析器生成中间代码
  • 解释器直接执行中间代码,同时设置一个监控
  • 如果监控到代码被重复执行,那这段代码会被标记为热点代码
  • 编译器编译热点代码后生成二进制文件,执行二进制文件从而提升代码的运行效率

关于热点代码

  • 因为JavaScript支持在运行时修改属性,而经过编译后的代码只能针对某种固定的结构,这个时候编译器需要执行反编译操作,把代码回退到解释器执行的状态,因此会降低运行效率。但从这个方面来说,使用typeScript编程会一定程度提高运行效率。

关于编译

  • 编译时不会编译所有的代码,如果编译所有的代码会严重影响执行速度,对用户不友好。同时编译后的中间代码和机器代码都会放在内存中,如果编译了所有的代码,就会大量占用内存。
  • 因此,在编译JavaScript的时候,如果遇到函数声明,会跳过函数内部的代码,不会生成函数的AST和中间代码,仅生成顶层的AST和中间代码。

总结

V8不仅仅是个名词,需要不断的一层层的深入了解,从而对优化代码运行时的性能有更多方面的考量。