【问题标题】:Compile JavaScript to Native Code with V8使用 V8 将 JavaScript 编译为原生代码
【发布时间】:2011-02-27 01:54:39
【问题描述】:

真的有可能使用 Google 的 V8 引擎将 JavaScript 编译为 Native Code,将其保存为二进制文件,然后通过我的软件环境在任何机器上随时执行它吗?

【问题讨论】:

标签: javascript c++ v8 native-code


【解决方案1】:

您可以使用 V8 快照功能来预编译代码。这仍然意味着您必须运行完整版本的 V8 才能加载快照(即,您没有获得独立的本机代码,它需要在 V8 虚拟机中运行),因此您节省的只是编译时间. 此外,快照代码的质量不一定与 JIT 代码一样好,因为 JIT 代码可以使用,例如 SSE2/SSE3(如果可用),这是快照无法假设的。

【讨论】:

    【解决方案2】:

    据我所知,V8 纯粹是一个just-in-time 编译器,没有ahead-of-time 选项。

    正如我在链接的文章中所讨论的,JIT 允许更好、更灵活的优化。

    【讨论】:

    • 但是 JIT 必须及时完成任务。因此,他们必须避免代价高昂(时间和资源,如内存)的操作。
    【解决方案3】:

    相反,可以使用 .NET JavaScript/JScript 编译器创建 .NET exe,然后使用 Mono ahead-of-time compiler 将 .NET exe 转换为本机 .exe。

    【讨论】:

    • 就像给那些还没有尝试过 Mono AOT 并且像我一样大肆宣传的人的说明:它不支持 Windows。它确实可以在任何 Linux 上运行,所以谁知道呢,也许这会改变。
    【解决方案4】:

    最接近实现目标的方法是创建一个自执行的 Javascript 字节码包装器。

    执行此操作的项目是pkg

    它以某种方式从 Javascript 创建一个独立的二进制可执行文件,包括模块依赖项和资产文件,并生成一个独立的可执行文件。

    安装使用简单:

    $ npm install -g pkg
    $ pkg index.js -o my-program
    $ ./my-program
    

    我的理解是这个二进制文件包含 nodejs 字节码。看来你也可以交叉编译。

    注意:我也尝试过nccnexe,但我没有发现它们同样有用。 ncc 只是创建了一个自包含的 Javascript 文件,nexe 在我尝试使用时遇到了 Python 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-21
      • 2019-10-12
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2015-08-20
      • 1970-01-01
      相关资源
      最近更新 更多