【发布时间】:2011-02-27 01:54:39
【问题描述】:
真的有可能使用 Google 的 V8 引擎将 JavaScript 编译为 Native Code,将其保存为二进制文件,然后通过我的软件环境在任何机器上随时执行它吗?
【问题讨论】:
标签: javascript c++ v8 native-code
真的有可能使用 Google 的 V8 引擎将 JavaScript 编译为 Native Code,将其保存为二进制文件,然后通过我的软件环境在任何机器上随时执行它吗?
【问题讨论】:
标签: javascript c++ v8 native-code
您可以使用 V8 快照功能来预编译代码。这仍然意味着您必须运行完整版本的 V8 才能加载快照(即,您没有获得独立的本机代码,它需要在 V8 虚拟机中运行),因此您节省的只是编译时间. 此外,快照代码的质量不一定与 JIT 代码一样好,因为 JIT 代码可以使用,例如 SSE2/SSE3(如果可用),这是快照无法假设的。
【讨论】:
据我所知,V8 纯粹是一个just-in-time 编译器,没有ahead-of-time 选项。
正如我在链接的文章中所讨论的,JIT 允许更好、更灵活的优化。
【讨论】:
相反,可以使用 .NET JavaScript/JScript 编译器创建 .NET exe,然后使用 Mono ahead-of-time compiler 将 .NET exe 转换为本机 .exe。
【讨论】:
最接近实现目标的方法是创建一个自执行的 Javascript 字节码包装器。
执行此操作的项目是pkg
它以某种方式从 Javascript 创建一个独立的二进制可执行文件,包括模块依赖项和资产文件,并生成一个独立的可执行文件。
安装使用简单:
$ npm install -g pkg
$ pkg index.js -o my-program
$ ./my-program
我的理解是这个二进制文件包含 nodejs 字节码。看来你也可以交叉编译。
注意:我也尝试过ncc 和nexe,但我没有发现它们同样有用。 ncc 只是创建了一个自包含的 Javascript 文件,nexe 在我尝试使用时遇到了 Python 错误。
【讨论】: