一段 JS 代码是如何被 V8 引擎执行的?
程序中的一段源码在执行前都会经历三个步骤:分词/词法分析 、解析/语法分析、代码生成
分词/词法分析:这个过程讲由字符串组成的字符串分解成代码块,这些代码块称为 词法单元(token),比如 var a = 1; 通常分解成 var、a、=、2、;。空格是否会被当做词法单元取绝于空格在这个语言中是否具有意义。
解析/语法分析:这个过程是将词法单元流 转换成 一个由 元素逐级嵌套所组成的代表程序语法结果的树,这个树称为 抽象语法树(AST)。
代码生成:将 AST 转换成为可 执行代码的过程 称为 代码生成。
关于 AST 可以看我的另一篇文章 AST
编译器 和 解释器
机器不能读懂我们写的代码,所以需要通过 翻译将代码 翻译成机器语言,按照语言的执行流程,可以把语言划分为 编译型语言 和 解释型语言。
编译型语言 在执行之前,需要经过编译器的编译过程,并且编译之后会直接保留机器能读懂的二进制文件,这样每次运行程序时,都可以直接运行该二进制文件,就不需要再次重新编译了,比如 GO、C/C++ 等都是编译型语言。
解释型语言 在每次运行时都需要通过解释器对程序进行动态解释和执行,比如 Python、JS 等都是解释型语言。
![](https://img.haomeiwen.com/i10825669/5ebb99495155277c.png)
V8 是如何执行一段 JS 代码的
1 生成抽象语法树(AST)和 执行上下文
2 生成字节码
3 执行代码
JS 性能优化
1.提升单次脚本的执行速度,避免 JavaScript 的长任务霸占主线程,这样可以使得页⾯快速响应交互;
2.避免大的内联脚本,因为在解析 HTML 的过程中,解析和编译也会占用主线程;
3.减少 JavaScript 文件的容量,因为更小的文件会提升下载速度,并且占用更低的内存
网友评论