最近在极客时间学习
<图解 Google V8>
一课的一些笔记
宏观视角
开篇词
V8 是 JavaScript 虚拟机的一种。我们可以简单地把 JavaScript 虚拟机理解成是一个翻译程序,将人类能够理解的编程语言 JavaScript,翻译成机器能够理解的机器语言。
- V8执行代码流水线使用到的技术
- 隐藏类:将 JavaScript 中动态类型转换为静态类型的一种技术,可以消除动态类型的语言执行速度过慢的问题
- 惰性解析:为了加速代码的启动速度,通过对惰性解析机制的学习,你可以优化你的代码更加适应这个机制,从而提高程序性能。
- 事件循环系统和垃圾回收机制。
V8如何执行一段JS代码
V8 是一个由 Google 开发的开源 JavaScript 引擎,目前用在 Chrome 浏览器和 Node.js 中,其核心功能是执行易于人类理解的 JavaScript 代码。
很多浏览器有自己的 JavaScript 引擎,如苹果公司在 Safari 中就是用 JavaScriptCore 虚拟机,Firefox 使用了 TraceMonkey 虚拟机,而 Chrome 则使用了 V8 虚拟机。
- 什么是V8
- V8是一个虚拟计算机,也称虚拟机。虚拟机通过模拟实际计算机的各种功能来实现代码的执行。如CPU、堆栈、寄存器等。
- 高级代码为什么需要先编译再执行?CPU无法识别高级语言所输出的代码。
- CPU是如何识别代码的
- CPU执行操作是根据指令集来的
- 与CPU沟通是通过二进制代码实现的
- 指令集就是机器语言
- 高级语言无法直接与CPU交流,因此需要解析执行。
- 解释执行
- 源代码被解析器编译为中间代码
- 中间代码被解释器解释
- 输出结果
- 编译执行
- 源代码被解析器编译为中间代码
- 中间代码被编译器编译为机器代码
- 机器执行机器代码
- 输出结果
- 解释执行
- CPU是如何识别代码的
- V8是如何执行JavaScript代码的? 通过混合编译执行和解释执行两种手段执行的(JIT)
- 准备执行JavaScript的基础环境
- JavaScript 全局执行上下文就包含了执行过程中的全局信息,比如一些内置函数,全局变量等信息;
- 全局作用域包含了一些全局变量,在执行过程中的数据都需要存放在内存中;
- 而 V8 是采用了经典的堆和栈的内存管理模式,所以 V8 还需要初始化内存中的堆和栈结构;
- 另外,想要我们的 V8 系统活起来,还需要初始化消息循环系统,消息循环系统包含了消息驱动器和消息队列,它如同 V8 的心脏,不断接受消息并决策如何处理消息。
- 结构化代码字符串,结构化:词法分析。
- 抽象语法树(AST),便于V8理解的结构。
- 生成字节码。字节码:介于AST与机器代码间的代码。
- 解释器按照字节码顺序解释字节码。
- 准备执行JavaScript的基础环境
JavaScript设计思想
函数即对象
JavaScript 中的函数就是一种特殊的对象,我们把 JavaScript 中的函数称为一等公民 (First Class Function)。
- 什么是JavaScript对象
- 原始类型:string,number,boolean,undefined,null,symbol,bigInt
- 对象类型:object
- 函数类型:对象的方法,如,a.speak()
- 函数的本质
- name属性记录函数名
- code属性记录函数体
- 函数是一等公民
__END__