持续创作,加速成长!这是我参与「掘金日新计划 · 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不仅仅是个名词,需要不断的一层层的深入了解,从而对优化代码运行时的性能有更多方面的考量。