首页 > 编程语言 >V8是如何执行一段JavaScript代码的?

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

时间:2023-01-03 21:34:08浏览次数:41  
标签:解释器 字节 AST 代码 JavaScript 生成 V8 执行

JavaScript 属于解释型语言,解释型语言编写的程序,在每次运行时都需要通过解释器对程序进行动态解释和执行。

  1. 解释器对源代码进行词法分析、语法分析,并生成抽象语法树(AST)和执行上下文。
  2. 根据 AST 生成字节码,并解释执行字节码。
  3. 生成字节码之后,接下来就要进入执行阶段了。

生成抽象语法树(AST)和执行上下文

什么是 AST

AST是能被编译器或者解释器理解的语言,AST 的结构和代码的结构非常相似,可以把 AST 看成代码的结构化的表示。

AST 的一些应用

Babel 的工作原理就是先将 ES6 源码转换为 AST,然后再将 ES6 语法的 AST 转换为 ES5 语法的 AST,最后利用 ES5 的 AST 生成 JavaScript 源代码。

ESLint 是一个用来检查 JavaScript 编写规范的插件,其检测流程也是需要将源码转换为 AST,然后再利用 AST 来检查代码规范化的问题。

AST 的生成过程是怎样的

先分词,再解析。

分词(tokenize),又称为词法分析。将一行行的源码拆解成一个个 token。所谓 token,指的是语法上不可能再分的、最小的单个字符或字符串。

解析(parse),又称为语法分析。其作用是将上一步生成的 token 数据,根据语法规则转为 AST。如果源码符合语法规则,这一步就会顺利完成。但如果源码存在语法错误,这一步就会终止,并抛出一个“语法错误”。

生成字节码

解释器 Ignition 就登场了,它会根据 AST 生成字节码,并解释执行字节码。字节码就是介于 AST 和机器码之间的一种代码。但是与特定类型的机器码无关,字节码需要通过解释器将其转换为机器码后才能执行。

执行代码

在 Ignition 执行字节码的过程中,如果发现有热点代码(HotSpot),比如一段代码被重复执行多次,这种就称为热点代码,那么后台的编译器 TurboFan 就会把该段热点的字节码编译为高效的机器码,然后当再次执行这段被优化的代码时,只需要执行编译后的机器码就可以了,这样就大大提升了代码的执行效率。

这种字节码配合解释器和编译器的技术叫做即时编译(JIT)

 

标签:解释器,字节,AST,代码,JavaScript,生成,V8,执行
From: https://www.cnblogs.com/superlizhao/p/17023418.html

相关文章

  • 使用YAKINDU STATECHART TOOLS的TypeScript代码生成
    https://blogs.itemis.com/en/typescript-code-generation-with-yakindu-statechart-tools作者DennisvanderVlugt现代web应用越来越复杂,模型驱动开发有助于应对复杂性......
  • 为什么汽车行业有必要从基于代码的开发转到基于模型的开发(待续)
    [2018/9/5]https://www.embitel.com/blog/embedded-blog/transition-from-code-based-development-to-model-based-development转向基于模型的开发的需要主要来源于手工编码......
  • C++实现线性表-顺序表的合并操作代码
    #include<iostream>#include<cstdlib>//C++动态分配存储空间usingnamespacestd;#defineOK1#defineERROR0#defineMAXSIZE100typedefintElemtype;typedefintStat......
  • JavaScript条件语句
    JavaScript条件语句之break1<!DOCTYPEhtml>2<html>3<head>4<metacharset="utf-8">5<title>JavaScriptbreak语句啊</title>6......
  • git统计项目开发代码量
    年终终结了,代码量和提交次数,是很关键的数字,接下来就来查一下吧。1、年度个人代码量gitlog--since="2022-01-01"--before="2022-12-31"--author="username"--pretty......
  • JavaScript 的数据是如何回收的
    因为数据是存储在栈和堆两种内存空间中的,所以接下来我们就来分别介绍“栈中的垃圾数据”和“堆中的垃圾数据”是如何回收的。调用栈中的数据是如何回收的当一个函数执行......
  • 功德+N!Python敲击木鱼积累功德代码
    时下,电子木鱼已经成为年轻人之间流行的“电子拜佛“的方式赛博佛法之敲电子木鱼可以说得上是打工人的解压利器了。那,要如何利用python来实现敲木鱼,让我们的”功德“达到最大......
  • tb.trade.get接口,巨量引擎订单数据回调接口对接代码
    前言​taobao.trade.get(获取单笔交易的部分信息(性能高),该接口用于巨量引擎就是抖音头条的信息流广告,推广店铺下单,下单算作一个转化,头条和淘宝不互通。taobao.trade.full......
  • 提升代码编辑效率的小Tips——看过来!
    对于需要编写代码的程序员来说,拥有一款好用的代码编译器是十分重要的,适合自己的编辑器往往能够让代码的编辑更加流畅。3568开发板linux代码编写查看环境搭建手册。为大家介......
  • 阮一峰JavaScript教程(上2)
    目录3.语法专题数据类型的转换概述强制转换Number()String()Boolean()自动转换自动转换为布尔值自动转换为字符串自动转换为数值参考链接错误处理机制Error实例对象原生错......