第一篇《Google V8 原理》之编译原理

388 阅读2分钟

什么是V8?

V8是一台解释机器,将代码解释给机器听得懂可执行的语言

image.png

V8是如何执行一段JavaScript代码的?

有两种方式执行编程语言

  • 第一种是解释执行,需要先将输入的源代码通过解析器编译成中间代码,之后直接使用解释器解释执行中间代码,然后直接输出结果。具体流程如下图所示:

    image.png

  • 第二种是编译执行。采用这种方式时,也需要先将源代码转换为中间代码,然后我们的编译器再将中间代码编译成机器代码。通常编译成的机器代码是以二进制文件形式存储的,需要执行这段程序的时候直接执行二进制文件就可以了。还可以使用虚拟机将编译后的机器代码保存在内存中,然后直接执行内存中的二进制代码。

    image.png

JS函数特点

JavaScript 是一门基于对象的语言,可以说 JavaScript 中大部分的内容都是由对象构成的,诸如函数、数组,也可以说 JavaScript是建立在对象之上的语言。而这些对象在运行时可以动态修改其内容,这造就了 JavaScript 的超级灵活特性

虽然 JavaScript 是基于对象设计的,但是它却不是一门面向对象的语言。因为面向对象语言天生支持封装、继承、多态

 JavaScript 中实现继承的方式却非常简单清爽,只是在对象中添加了一个称为原型的属性,把继承的对象通过原型链接起来,就实现了继承,我们把这种继承方式称为基于原型链继承。

对象的类型

  1. 原始类型:主要包括 null、undefined、boolean、number、string、bigint、symbol 这七种。
  2. 对象类型:Object
  3. 函数类型:Function

image.png

V8访问对象属性的速度如何优化?

两种属性:常规属性 排序属性

	this[100]='test-100'
	this[1]='test-1'
	this["B"]='barB'
	this[50]='test-50'
	this[9]='test-9'
	this[8]='test-8'
	this[3]='test-3'
	this[5]='test-5'
	this["A"]='bar-A'
	this["C"]='bar-C'
}
var bar = new Foo();
for(key in bar){console.log(key, bar[key])}

输出的结果:

image.png

结论:

  1. 数字属性应该按照索引值大小升序排列,字符串属性根据创建时的顺序升序排
  2. 对象中的数字属性称为排序属性,在 V8 中被称为elements,字符串属性就被称为常规属性,在 V8 中被称为properties。

image.png

为了提升查找效率,V8 在对象中添加了两个隐藏属性,排序属性和常规属性,指向了elements 对象,在 elements 对象中,会按照顺序存放排序属性。properties 属性则指向了 properties 对象,在 properties 对象中,会按照创建时的顺序保存常规属性。