V8是什么?
V8是谷歌在德国研发中心开发的一个JavaScript引擎。开源并且用C++实现。可以用于运行于客户端和服务端的Javascript程序。
V8设计的初衷是为了提高浏览器上JavaScript脚本的执行效率。为了提高速度,V8把JavaScript代码转换成更有效率的机器代码执行,而不像以往是通过解释器执行。像现在大多数的JavaScript引擎一样,比如SpiderMonkey 或者 Rhino (Mozilla),V8实现了一个JIT (Just-In-Time) 编译器,可以在执行JavaScript代码的时候把代码编译成机器代码,但是V8的主要不同点在于它不回产生字节码或者任何的中间代码。
通过本文可以了解到V8为了编译出更优化的代码是如何工作的。如果你之前有问你自己”我是否应该担心JavaScript的效率?”那么我可以借用Daniel Clifford (V8团队的头)的话回答你:“V8不仅仅让你的程序运行的更快,也能做到一些以前没法做到的事情”。
隐藏类
JavaScript是一种基于protoptye的语言:运行的时候没有类和对象产生。同时JavaScript也是一种动态语言:类型和类型的信息是不明确的。因此如何有效的访问类型和属性是V8面临的一个重大挑战。对于以往大多数的JavaScript引擎而言,处理办法是通过一个类似于字典的数据结构来存储对象属性并通过动态的查询来确定属性的位置,但是V8不一样,V8在运行时创建了隐式类。
如下示例包含一个”Point”方法并且创建了两个”Point”对象:
如果布局是一样的,如上图这种情况,那么p 和 q 属于 v8 引擎创建的相同的隐藏类。这突出显示使用隐藏的类的另一个优点 ︰ 可以让V8把属性一样的对象聚集在一起。比如上图中的”p”和”q”对象会使用相同的优化代码。
现在假如要给”q”对象添加一个”z”属性,V8会怎么处理这种情况呢?实际上,每当忘函数里面新定义一个属性,V8都会创建一个新的隐藏类,并且会跟踪隐藏类的结构变化。
每当一个新的隐藏类被创建,前一个隐藏累就会被取代。