原文地址 www.quora.com/How-does-th…
v8是google的开源高性能js和WebAssembly引擎,用c++编写。 v8是一个c++程序,它接收js代码,编译并执行它。
功能
- 编译并执行js代码
- 处理调用栈-某种顺序运行js函数
- 管理对象的内存分配-内存堆
- 垃圾收集-不再使用的对象
- 提供所有数据类型,运算符、对象和函数
但是V8不能了解文档对象模型BOM,因为这是由浏览器提供和Nodejs没有关系。
V8是单线程执行引擎,构建为每个js执行上下文只运行一个线程。实际上,你可以在同一个进程中运行两个v8引擎(web-workers)但是不会像真正的线程那样子共享任何变量或上下文。这并不意味这v8在单个线程上运行,但是确实意味着它提供了单个线程的js流

v8和其他现代js引擎在执行之前通过just-in-time compilation 脚本编译到本机机器代码来决定速度。代码最初由基线编译器编译,可以快速生成非优化的机器代码。编译后的代码在运行时进行分析,并可选择使用更高级的优化编译器动态地重新编译,以实现最佳性能。在v8中,此脚本执行通道具有各种特殊和条件,这些特殊情况和条件需要复杂的机制才能在基线编译器和两个优化编译器Crankshaft和TurboFan之间切换。
这种方法的一个问题(除了架构复杂性)是JITed机器代码可能消耗大量内存,即使代码只执行一次。 为了减轻这种开销,V8团队构建了一个名为Ignition的新JavaScript解释器,它可以取代V8的基线编译器,以更少的内存开销执行代码,并为更简单的脚本执行管道铺平道路。 通过Ignition,V8将JavaScript函数编译为简洁的字节码,该字节码的大小为等效基线机器代码的50%到25%。 然后,该字节码由高性能解释器执行,该解释器在真实世界的网站上产生接近V8现有基线编译器生成的代码的执行速度。 在Chrome 53中,将为具有有限RAM(512 MB或更低)的Android设备启用Ignition,从而最需要节省内存。 现场早期实验的结果显示,Ignition可将每个Chrome标签的内存减少约5%。
在构建Ignition的字节码解释器时,该团队考虑了许多潜在的实现方法。 用C ++编写的传统解释器无法与V8生成的其余代码高效交互。 另一种方法是在汇编代码中手动编写解释器代码,但是如果V8支持9个架构端口,这将需要大量的工程开销。 相反,我们选择了一种利用TurboFan强度的方法,TurboFan是我们新的优化编译器,已经针对与V8运行时和其他生成代码的最佳交互进行了调整。 Ignition解释器使用TurboFan的低级,与体系结构无关的宏汇编指令为每个操作码生成字节码处理程序。 TurboFan将这些指令编译到目标体系结构,在此过程中执行低级指令选择和机器寄存器分配。 这导致高度优化的解释器代码,该代码可以执行字节码指令并以低开销方式与V8虚拟机的其余部分进行交互,并且在代码库中添加了最少量的新机器。 Ignition是一个寄存器机器,每个字节码将其输入和输出指定为显式寄存器操作数,而不是堆栈机器,其中每个字节码将消耗输入并在隐式堆栈上推送输出。 特殊累加器寄存器是许多字节码的隐式输入和输出寄存器。这通过避免指定特定寄存器操作数的需要来减小字节码的大小。 由于许多JavaScript表达式涉及从左到右计算的操作链,因此这些操作的临时结果通常可以在表达式的评估过程中保留在累加器中,从而最大限度地减少了加载和存储到显式寄存器的操作的需要。 生成字节码时,它会通过一系列内联优化阶段。 这些阶段对字节码流执行简单分析,用更快的序列替换常见模式,删除一些冗余操作,并最小化不必要的寄存器加载和传输的数量。 优化一起进一步减小了字节码的大小并提高了性能。