JavaScript——不仅仅是解释性语言

编译(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准备的更加充分,一旦完成(编译型的)相比单纯的解释性代码更具表现力。

-------译自 node.js 官网教程

编译vs解释

相关知识点参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值