【问题标题】:Compile Javascript [duplicate]编译Javascript [重复]
【发布时间】:2014-01-08 20:25:49
【问题描述】:

是否可以编写一个编译器,将 javascript 编译为流畅的程序,使其更高效?

我知道即时编译,但我所说的是获取 javascript 并以类似于编译 OS 应用程序的方式对其进行编译。

只是一个实验问题。

【问题讨论】:

  • 如何将编译后的代码传递给浏览器?
  • @JanDvorak:OP 没有专门讨论浏览器环境。
  • @bergi et al this is not 与所引用的问题相同。这个问题询问“原则上是否可行”,而引用的问题是“可以用 V8 完成吗”。不同的范围产生不同的问题。
  • @miraculixx:是的,也许(我已经投票支持重新开放,因为也有一个很好的答案)。不过,我认为另一个问题回答了基本问题(这是可能的,但您需要一些方法来处理动态方面)。另见Is there a native machine code compiler for JavaScript?
  • 您可能会发现this answer 很有用。

标签: javascript compiler-construction compilation


【解决方案1】:

这个问题之前已经在herehere 讨论过(大概在许多其他地方)。

它的要点是这样的:

  • JavaScript 的语言规范并未声称它是一种解释型语言。它仅仅定义了语言的语法和语义。

  • 大多数解释语言首先被解析并翻译成中间形式,即Byte Code。这个过程通常被称为“编译”,这是编译器的工作 *)

  • JavaScript 的一些解释器实际上是编译器/字节码执行器,例如Google's V8(“V8 编译并执行 JavaScript 源代码,...”)。另一方面,Microsoft's Jurassic 将 .NET 编译为 CLI 字节码声称只是一个编译器。

  • 程序的后续执行使用字节码,并且不引用程序的 JavaScript 源代码。 Jurasic 声称分发 .NET CLI 程序集。

您的问题的答案是,具体取决于您要定位的具体平台:

  • 是的,JavaScript 代码可以编译成中间形式,然后可以由知道处理这种特定形式的字节码的引擎执行。

  • 不,没有普遍接受的字节码,也没有此类字节码的通用解释器(又名Virtual Machine)。

话虽如此,“编译”v.s.的问题“解释性”语言通常看起来被夸大了。重要的是要认识到编译后的“二进制”与其相应的“源代码”之间的差异只有逐渐的差异。最后,源代码和二进制文件在不同形式下是相同的东西,或者解释一下:它是symbols all the way down

*) 维基百科有这个definition of a compiler:

编译器是一个计算机程序(或一组程序),它可以转换 用编程语言编写的源代码(源语言) 转换成另一种计算机语言(目标语言,通常具有 二进制形式称为目标代码)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2018-09-11
  • 1970-01-01
  • 2014-10-04
  • 2014-08-28
  • 2014-09-09
相关资源
最近更新 更多