JS系列(一):编译原理

2021-03-29  本文已影响0人  青叶小小

诸如 C / C++ / JAVA 等语言,都有对应的编译器,而编译器会将这些高级语言编译成目标机(目标系统,如Windows, Linux, Unix等)可执行程序。

这些语言的编译器工作流程如下:

注:

但是,JS通常被归为『动态』或『脚本』或『解释执行』语言,因此,JS不会提前编译,通常只有在代码执行前才会开始编译(几微秒甚至更短!),这也就是为什么JS可以跨平台运行(只要系统中有浏览器就行)。当然,JavaScript引擎非常复杂,想了解的话直接看源码吧。

那么,在短短的几微秒甚至更短的时间里,JS引擎对代码编译发生了哪些事呢?
JS引擎编译工作流程如下:

  1. 分词/词法分析;
  2. 解析/语法分析;
  3. 代码生成;
// 代码
var a = 2;
  1. 分词/词法分析的工作:
    var、a、=、2 、; 共5个词【又叫做:词法单元流(数组)】

  2. 解析/语法分析的工作:
    将词法单元流解析成一棵树,这个树叫做:AST(Abstract Syntax Tree 抽象语法树),这棵树可能如下图所示(对于这个例子来说)

js-ast.png
  1. 代码生成:
    JS引擎将AST转换为可执行的代码,这个过程与语言、目标平台相关;简单的说:就是创建一个变量a,分配内存,并将值(2)存储到变量a中。

比起那些编译过程只有三个步骤的语言的编译器,JavaScript 引擎要复杂得多。例如,在 语法分析和代码生成阶段有特定的步骤来对运行性能进行优化,包括对冗余元素进行优化等。

因此在这里只进行宏观、简单的介绍:

上一篇下一篇

猜你喜欢

热点阅读