【问题标题】:How to turn the V8 compiled javascript into an EXE?如何将 V8 编译的 javascript 变成 EXE?
【发布时间】:2009-07-20 08:37:06
【问题描述】:

我知道 google 的 v8 将 javascript 编译为本机(如果我理解正确,则为二进制)代码。
有没有办法把输出变成exe?

【问题讨论】:

    标签: javascript executable v8


    【解决方案1】:

    我不认为您可以使用 V8 直接将一段 JavaScript 转换为可执行文件,但您可以制作一个将 V8 引擎与 JavaScript 捆绑在一起并作为独立运行的应用程序。

    你可以在its project page找到所有关于V8的信息。

    另请注意,JavaScript 不能完全编译,因为它是一种动态语言。在 V8 中,它是 JIT 编译的(例如 .NET)。尽管如此(例如 .NET)仍然可以将其转换为独立的可执行文件。

    如果您想开发使用 HTML 进行渲染的独立应用程序,您也可以查看Adobe Air

    【讨论】:

    • 我正在尝试做其他事情。那么如何将 javascript 捆绑到 exe 中呢?
    • 查看 V8 项目页面的“嵌入”部分。
    • 您可以使用 Node-Webkit 项目非常轻松地将 JavaScript 捆绑到 .exe 中 -- github.com/rogerwang/node-webkit
    【解决方案2】:

    Javascript 不能只编译一次。该语言的 eval 被广泛使用。 (例如 JSON)你需要携带 JIT 和整个运行时。

    这里的JIT只是一种优化,并不是摆脱编译器/解释器的方式。

    【讨论】:

    • "V8 在第一次执行时将 JavaScript 源代码直接编译为机器码。没有中间字节码,没有解释器。属性访问由内联缓存代码处理,可能会用其他机器指令修补随着 V8 的执行。”
    • 是的,但请注意“首次执行时”部分。 JavaScript 不能完全编译为字节码,由于其动态特性,它必须在运行时进行编译。
    • @the_drow:问题在于,使用 'eval' 时,您一直在输入新的 JavaScript 代码。
    【解决方案3】:

    Node.js 嵌入 V8。这可能是一个值得学习的好例子。

    【讨论】:

      【解决方案4】:

      已经有一些尝试将 js 变成原生代码,这不是可以通过任何方式在生产中使用的东西,更多的是学术兴趣。 用于 java 的 Rhino 解释器可以选择将 js 转换为 (java) 字节码,因此一种方法是转换为字节码,然后使用 GCJ 从字节码转换为本机。有一些关于 Rhino 和 GCJ 的讨论,但我不知道是否有人曾经尝试过。 https://groups.google.com/forum/#!msg/netscape.public.mozilla.jseng/c3tqyLZ19fw/8V4HeuMtIXUJ

      另一种方法是使用 Python,特别是 Py-Py,它本身是用 Python 的一个非标准子集编写的,称为 rPython。 rPython 不适合人类消费,但它的好处是可以编译为本机。一个有趣(虽然古怪)的实验是将 Javascript 编译为 Python,然后在某些情况下,Python 恰好作为 rPython 有效,并且可以使用 rPython 编译器编译为本机。

      http://mozakai.blogspot.com/2010/07/experiments-with-static-javascript-as.html

      如果 .exe 文件真的很重要,我会将 V8 与您的应用程序捆绑在一起,因为即使您可以将 js 编译为本机,如果您使用任何 eval() 或类似文件,您仍然需要一个完整的解释器。只要您的用户不介意 8MB exe 或 8MB V8.dll 文件,编写将所有内容捆绑到 .exe 文件中的工具并不难。

      最后,Big G 已经开始允许基于 chrome 的“原生”应用(谷歌:“chrome packaged apps”)。它们具有低级别的系统访问权限,可以使用 WebKit 渲染器,允许您在 CSS 和 HTML 中创建 GUI,并且它们有自己的窗口和图标,因此它们在 chrome 中运行并不明显。这可能还为时过早,但在桌面应用程序领域值得关注。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-01
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 2012-04-17
        • 2016-01-11
        • 2016-06-07
        • 1970-01-01
        相关资源
        最近更新 更多