v8如何执行一段代码

步骤

  • 根据源代码生成抽象语法树(AST)和执行上下文。
  • 根据AST生成字节码。
  • 执行代码。

生成AST

根据代码生成一个树形数据结构。比如

var myName = "极客时间"
function foo(){
  return 23;
}
myName = "geektime"
foo()

上段代码会生成如下的AST


生成的AST

生成AST需经历两个阶段:词法分析和语法分析。

词法分析

将代码拆分成不可继续拆分的最小单位,如变量名、操作符、字符串等。这些小的单位也被称为token。

语法分析

  • 将之前所得token根据js的语法生成AST。
  • 代码语法正确时会顺利生成AST,语法有误时会报错。
  • 有了AST就可生成执行上下文。

生成字节码

  • 通过解释器Ignition根据AST生成字节码。
  • 字节码是介于AST和机器码之间的一种代码,与平台无关,需经解释器转换为机器码后才能被执行。
  • 字节码存储在v8实例的堆内存中。

执行

生成字节码后进入执行阶段。

  • 第一次执行字节码时,解释器会逐条解释执行。
  • 执行过程发现有热点代码(被多次执行的代码)时,会调用编译器生成该部分字节码所对应的高效的机器码。
  • 在后续再次执行热点代码时,直接执行机器码。提升代码的执行效率。
  • 以上用到了即时编译(JIT)技术。

JS性能优化

  • 提升单次脚本的执行速度,避免 JavaScript 的长任务霸占主线程,这样可以使得页面快速响应交互。
  • 避免大的内联脚本,因为在解析 HTML 的过程中,解析和编译也会占用主线程。
  • 减少 JavaScript 文件的容量,因为更小的文件会提升下载速度,并且占用更低的内存。

来源:极客时间-浏览器工作原理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容