Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2021/01/30 - v8引擎执行js代码的过程简析 #40

Open
lxinr opened this issue Jan 30, 2021 · 0 comments
Open

2021/01/30 - v8引擎执行js代码的过程简析 #40

lxinr opened this issue Jan 30, 2021 · 0 comments
Labels

Comments

@lxinr
Copy link
Owner

lxinr commented Jan 30, 2021

分析过程:

  1. 通过词法分析和语法分析生成 AST(抽象语法树)
  2. 将 AST 转换为字节码
  3. 由解释器逐行执行字节码,遇到热点代码启动编译器进行编译,生成对应的机器码, 以优化执行效率

1、生成AST

1、词法分析

词法分析即分词,意思就是将一行行的代码分解成一个个token

const msg = '词词词'
// 词法分析将该语句分成四个部分
// const -> 关键字 msg -> 变量名 = -> 赋值 '词词词' -> 字符串
2、语法分析

语法分析阶段,将生成的这些 token 数据,根据一定的语法规则转化为AST

babel的工作原理就是将es6+的代码解析成es6的AST,再将es6的AST转成es5的AST,最后再将es5的AST反解析成es5的代码

2、生成字节码

字节码是介于AST 和 机器码之间的一种代码,但是与特定类型的机器码无关,字节码需要通过解释器将其转换为机器码然后执行

3、执行代码

在执行过程中,如果发现有某一部分代码重复出现,那么V8会将其记做热点代码,然后将其编译成机器码保存下来,这个用来编译的工具就是V8的编译器(也叫做TurboFan), 因此,假如代码执行时间越久,效率就会越高,因为会有越来越多的字节码被标记,然后直接使用其对应的机器码,不需要再执行转换过程。
这种字节码跟编译器和解释器结合的技术,我们称之为即时编译, 也就是我们经常听到的JIT

@lxinr lxinr added the JS基础 label Jan 30, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant