编译(Compilation)

JavaScript 通常被视为一种解释性语言,但是现代的JS引擎不仅仅解释JavaScript,而且会编译它。

编译分为三个步骤:

  1. 符号化/词法分析
  2. 生成抽象语法树(AST,Abstract Syntax Tree)
  3. 代码生成。将抽象语法树转换为真正可执行的机器指令。

自从2009年,火狐将SpiderMokeyjs编译器添加到Firefox 3.5中后,所有人纷纷效仿这个idea。

JavaScript 代码由内置JIT编译(即时编译或者动态编译)的V8引擎编译,从而提升了代码执行的速度。

按照通常理解,代码是在运行之前进行编译(如JavaC),对于JS的编译,其在解析和代码生成过程中,也存在一些步骤去优化执行的性能(例如,折叠冗余元素),然而JS引擎没有充裕的事件来执行充分的优化,它必须在代码执行的前几毫秒(甚至更短)发生,为了确保在约束下获得最快的性能,JS引擎使用了各种规则(比如JIT,从而可以实现热编译),以至于,代码甚至可以在执行过程中重新编译和重新优化。

虽然这看起来有点不直观,但是自从2004年谷歌地图引入(上述编译方式)之后,JavaScript 已经由一个只能执行少数几个lines的语言进化为可以完成 运行在浏览器上拥有数百甚至上千lines的应用。(这段话没有完全理解,参照谷歌地图)

现今,我们的应用可以在浏览器中运行数个小时,而不是仅仅完成一些表单校验或者简单的脚本。

在新世界中,编译 JavaScript 拥有巨大的意义,因为它让JavaScript准备的更加充分,一旦完成(编译型的)相比单纯的解释性代码更具表现力。

编译vs解释