V8 是 JavaScript 虚拟机的一种。能够将编程语言 JavaScript 翻译成机器能够理解的机器语言。
JavaScript 虚拟机采用的都是解释执行的方式,这是 JavaScript 执行速度过慢的一个主要原因。
而 V8 率先引入了即时编译(JIT)的双轮驱动设计,这是一种权衡策略,混合了编译执行和解释执行两种手段,为 JavaScript 的执行速度带来了极大的提升。
另外,V8 也是最早引入惰性编译、内联缓存、隐藏类等机制,进一步优化 JavaSript 的编译执行效率。
如果对 V8 的工作原理有所了解,那么对平时遇到的项目内存占用过高、页面响应速度过慢、Node.js 任务阻塞等问题时,都会有一些系统性的思路去应对。
<aside> ✅ V8 的主要职责:用来执行 JavaScript 代码。
</aside>
JavaScript 是一门倍受历史遗留影响的语言,有很多错误的或不合理的设计沿用至今。如:使用 new 加构造函数来创建对象,容易增加代码出错概率,增加了学习成本;JavaScript 初期没有块级作用域,需要采取变量提升的策略,而变量提升又是很反人类的设计。
来自极客时间《图解 V8》开篇词
这套流程被称为 V8 的编译流水线。其中包含了很多技术,如:JIT、延迟解析、隐藏类、内联缓存等。这些技术决定着一段 JavaScript 代码能够正常执行,以及代码的执行效率。
比如:
隐藏类,这是将 JavaScript 中动态类型转换为静态类型的一种技术,可以消除动态类型的语言执行速度过慢的问题。
惰性解析,目的是为了加速代码的启动速度。
事件循环系统和 JavaScript 中的异步编程特性紧密相关。JavaScript 是单线程的,如何同一时间处理多个请求?
V8 的事件循环系统会调度这些排队任务,保证 JavaScript 代码被 V8 有序地执行。