最近在极客时间学习<图解 Google V8>一课的一些笔记

宏观视角

开篇词

V8 是 JavaScript 虚拟机的一种。我们可以简单地把 JavaScript 虚拟机理解成是一个翻译程序,将人类能够理解的编程语言 JavaScript,翻译成机器能够理解的机器语言。

  1. V8执行代码流水线使用到的技术
    1. 隐藏类:将 JavaScript 中动态类型转换为静态类型的一种技术,可以消除动态类型的语言执行速度过慢的问题
    2. 惰性解析:为了加速代码的启动速度,通过对惰性解析机制的学习,你可以优化你的代码更加适应这个机制,从而提高程序性能。
    3. 事件循环系统和垃圾回收机制。

V8如何执行一段JS代码

V8 是一个由 Google 开发的开源 JavaScript 引擎,目前用在 Chrome 浏览器和 Node.js 中,其核心功能是执行易于人类理解的 JavaScript 代码。
很多浏览器有自己的 JavaScript 引擎,如苹果公司在 Safari 中就是用 JavaScriptCore 虚拟机,Firefox 使用了 TraceMonkey 虚拟机,而 Chrome 则使用了 V8 虚拟机。

  1. 什么是V8
    1. V8是一个虚拟计算机,也称虚拟机。虚拟机通过模拟实际计算机的各种功能来实现代码的执行。如CPU、堆栈、寄存器等。
  2. 高级代码为什么需要先编译再执行?CPU无法识别高级语言所输出的代码。
    1. CPU是如何识别代码的
      1. CPU执行操作是根据指令集来的
      2. 与CPU沟通是通过二进制代码实现的
      3. 指令集就是机器语言
    2. 高级语言无法直接与CPU交流,因此需要解析执行。
      1. 解释执行
        1. 源代码被解析器编译为中间代码
        2. 中间代码被解释器解释
        3. 输出结果
      2. 编译执行
        1. 源代码被解析器编译为中间代码
        2. 中间代码被编译器编译为机器代码
        3. 机器执行机器代码
        4. 输出结果
  3. V8是如何执行JavaScript代码的? 通过混合编译执行和解释执行两种手段执行的(JIT)
    1. 准备执行JavaScript的基础环境
      1. JavaScript 全局执行上下文就包含了执行过程中的全局信息,比如一些内置函数,全局变量等信息;
      2. 全局作用域包含了一些全局变量,在执行过程中的数据都需要存放在内存中;
      3. 而 V8 是采用了经典的堆和栈的内存管理模式,所以 V8 还需要初始化内存中的堆和栈结构;
      4. 另外,想要我们的 V8 系统活起来,还需要初始化消息循环系统,消息循环系统包含了消息驱动器和消息队列,它如同 V8 的心脏,不断接受消息并决策如何处理消息。
    2. 结构化代码字符串,结构化:词法分析。
    3. 抽象语法树(AST),便于V8理解的结构。
    4. 生成字节码。字节码:介于AST与机器代码间的代码。
    5. 解释器按照字节码顺序解释字节码。

JavaScript设计思想

函数即对象

JavaScript 中的函数就是一种特殊的对象,我们把 JavaScript 中的函数称为一等公民 (First Class Function)。

  1. 什么是JavaScript对象
    1. 原始类型:string,number,boolean,undefined,null,symbol,bigInt
    2. 对象类型:object
    3. 函数类型:对象的方法,如,a.speak()
  2. 函数的本质
    1. name属性记录函数名
    2. code属性记录函数体
  3. 函数是一等公民

__END__

o0Chivas0o
文章作者:o0Chivas0o
文章出处V8 引擎的学习
作者签名:Rich ? DoSomethingLike() : DoSomethingNeed()
版权声明:文章除特别声明外,均采用 BY-NC-SA 许可协议,转载请注明出处