JavaScript 是一门编译语言,它不是提前编译的,这是与传统的编译语言不同的地方。但是其编译步骤和传统的编译语言非常相似
编译:程序中的一段源代码在执行之前会经历三个步骤,统称为“编译”
1、分词/词法分析
将字符串 分解成 代码块(词法单元)
var a = 2; 分解成 var、a、=、2、; (空格是否被当作词法单元,取决于空格是否具有意义)
词法分析:词法单元生成器在判断 a 是一个独立的词法单元还是其他词法单元的一部分时,调用的是有状态的解析规则,这个过程被称为词法分析
2、解析/语法分析
将词法单元流(数组),转换成 “抽象语法树”(AST) 的过程
3、代码生成
将 AST 转换为 可执行代码的过程 被称为 代码生成
举个例子,var a = 2 的 AST 转换为一组机器指令,用来创建一个叫做 a 的变量(包括分配内存等),并将一个值存储在 a 中
比起那些编译过程只有以上三个步骤等编译器。JavaScript引擎要复杂等多,例如,在语法分析和代码生成阶段有特定的步骤来进行性能优化,包括冗余元素优化等
但是,JavaScript 引擎不会有大量的时间用来进行优化,因为它等编译过程不是发生在构建之前的。大部分情况编译发生在代码执行前的几微妙,因此 JavaScript 编译器首先会对程序进行编译,然后做好执行它的准备,通常马上就会执行它