【问题标题】:Is there a native machine code compiler for JavaScript? [closed]是否有 JavaScript 的本机机器代码编译器? [关闭]
【发布时间】:2010-11-10 05:28:32
【问题描述】:

是否有 JavaScript 的本地机器代码编译器? 我不是在谈论虚拟机。 如果不存在可以做吗?
由于语言的动态特性,我想知道它是否可以编译为二进制。

【问题讨论】:

  • 你说的是 JScript.NET 吗?
  • 我想澄清一下:“本机机器代码编译器”是指接受 Javascript 程序并生成可执行文件(静态编译)的编译器,还是只是指全部完全可以将 javascript 代码转换为机器代码(例如,Tracemonkey(Firefox)和 V8(Chrome)中的 JIT 编译器将从当前执行的 javascript 生成本机机器代码,因此不必多次解释它们。)
  • 我要求静态编译。
  • @Shimmy:不。它不是静态编译的。

标签: javascript compilation native native-code


【解决方案1】:

据我所知,JavaScript 没有静态编译器。这在理论上当然是可能的;然而,JavaScript 的静态编译需要一个非常重量级的运行时来支持它的所有特性(例如动态类型和 eval)。顺便说一句,当需要静态编译 Python(另一种动态语言)时,PyPy 开发人员最终创建了一种语言,它是 Python 的一个非常受限的子集(称为 RPython),没有一些 Python 更动态的语言可以静态编译的功能。

如果你问这个是为了从 JavaScript 代码创建一个独立的可执行文件,我确信必须有包装器,它本质上会创建一个包含你的脚本和嵌入式 JavaScript VM 的可执行文件(遗憾的是,我没有知道任何副手)。

【讨论】:

  • 第一个基于浏览器的 JIT 与 FF 3.5 一起发布,大约在回答这个问题前一个月。
  • +1 用于 PyPy。 RPython 本身不是静态编译的,而是RPython 程序以常规CPython 启动,并拍摄当前内存中所有对象的快照。这确保了所有类型的专业化等都已经完成。这也意味着 RPython 程序输入受到严格限制,例如不可能通过json.load 即时获取类型。
  • 有几个JavaScript-to-C compilers,但它们通常只适用于 JavaScript 的静态类型子集。
【解决方案2】:

这绝对是可行的,虽然我目前知道的唯一方法是两步过程......

  1. 使用 Mozilla Rhino JSC 将 javascript 编译为 Java。
  2. 使用 GNU's GCJ 之类的东西将生成的 java 类文件编译为可执行文件。

但是,您为什么要这样做?您希望找到什么优势?

【讨论】:

  • 只是出于好奇。我非常喜欢javascript。
【解决方案3】:

Google V8 引擎将 JavaScript 编译为本机机器码。我为 node.js 和 io.js 项目编写的 EncloseJS 编译器中使用了此功能。

【讨论】:

  • (Meta) 它不会也不应该是突兀的,但是在正确的位置放置一个简单的 my 就足够了。我继续在这里编辑您的答案。请记住这一点,以便将来得到答案。
【解决方案4】:

请注意,所有这些解决方案都是DOMless,所以没有像angular.jsjquery 这样的库,只有underscore.js/lodash

跟进Falaina的回答, PyPy 确实有JavaScript的dist

另外,Appcelerator Titanium 有一个 js > JavaBit > android

最后,node.js 可以使用nexe 在这个其他answer中解释了

【讨论】:

    【解决方案5】:

    理论上是可行的,但会涉及很多运行时支持包(甚至是支持eval 的完整 Javascript 编译器或解释器)。

    您是在寻找真正的本机代码编译器,还是在寻找可以将 Javascript 代码与运行时捆绑到单个可执行二进制文件中的东西?

    【讨论】:

    • 我正在寻找一个真正的本机代码编译器
    【解决方案6】:

    我确信微软有一个可下载的 Jscript(“微软的 javascript”)编译器

    如果您有窗户: 如果您编写一个 javascript 文本文件,您可以通过以下方式编译它: 打开命令提示符 使用 cd 进入文本文件目录 (如果你有 Windows)输入:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\jsc.exe textfile.js

    否则: 下载一个 jscript 编译器 输入 jscript 编译器的目录,然后输入 javascript 文本文件的名称

    如果您不想将整个目录名称输入到编译器,可以添加环境变量。

    这个人解释得更好: http://www.phpied.com/make-your-javascript-a-windows-exe/

    我个人认为这真的很酷。我只是希望有更多的文档。

    我很确定这就是你要找的东西,但我有点新。

    【讨论】:

    • 编译成 .net IL 代码不是编译成本地语言,正如所质疑的那样,IL 代码实际上也是一种解释型(及时)。只是让你知道;)
    • @Remco:IL 在执行之前总是编译为机器代码指令。与 Java 字节码不同,IL 永远不会被解释。
    【解决方案7】:

    TraceMonkey 在 FF3.5 中对 javascript 代码的某些部分执行此操作。你也许可以从那里得到一些方向!

    【讨论】:

    • 并非如此。我在那里没有发现任何有用的东西。
    • 这无济于事,因为 Tracemonkey 无法对代码的所有部分执行此操作。
    【解决方案8】:

    Adobe AIR 的 iOS 版 AOT 编译器静态编译 JavaScript 超集 Actionscript 3.0 到 ABC 字节码,然后通过 LLVM 编译机器码。如果您要编写没有类和类型注释的 AS3 代码,那么它本质上就是 JavaScript,然后编译器会很乐意将其编译为机器代码。遗憾的是,这不是开源软件,而且您无法访问任何 DOM(很多人在想到 JavaScript 时会想到),因为它本质上是在 Flash Player 实例中运行的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 2019-03-24
      • 2010-09-13
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多