你不知道的JS系列 ( 1 ) - 编译原理

JavaScript 是一门编译语言,它不是提前编译的,这是与传统的编译语言不同的地方。但是其编译步骤和传统的编译语言非常相似

 

编译:程序中的一段源代码在执行之前会经历三个步骤,统称为“编译”
 
1、分词/词法分析
  将字符串 分解成 代码块(词法单元)
  var a = 2; 分解成 var、a、=、2、; (空格是否被当作词法单元,取决于空格是否具有意义)
  词法分析:词法单元生成器在判断 a 是一个独立的词法单元还是其他词法单元的一部分时,调用的是有状态的解析规则,这个过程被称为词法分析

 

2、解析/语法分析
  将词法单元流(数组),转换成 “抽象语法树”(AST) 的过程
    

 

 

 
3、代码生成
  将 AST 转换为 可执行代码的过程 被称为 代码生成
  举个例子,var a = 2 的 AST 转换为一组机器指令,用来创建一个叫做 a 的变量(包括分配内存等),并将一个值存储在 a 中

 

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

 

但是,JavaScript 引擎不会有大量的时间用来进行优化,因为它等编译过程不是发生在构建之前的。大部分情况编译发生在代码执行前的几微妙,因此 JavaScript 编译器首先会对程序进行编译,然后做好执行它的准备,通常马上就会执行它



posted @ 2020-02-10 09:33  wzndkj  阅读(224)  评论(0编辑  收藏  举报