10

Emscripten 可以从 C/C++ 生成比手工编写的 JS 代码更快的代码,这是否意味着我们应该用 C/C++ 编写新代码并编译它们以在 Web 上运行?

我阅读了 Emscripten 常见问题解答,上面写着“无论如何都要编写新的 JavaScript 代码。”,这是为什么呢?

4

1 回答 1

12

asm.js 不是执行 Javascript-esque 代码的更快方法。这是一种更快的运行代码的方法,已经降低到机器代码的抽象级别。您似乎大大高估了收益:

  • 如果您让 JS 开发人员像编写 JS 一样编写 C++,那么您最终会得到的代码并不像 C++ 那样快,并且在其他方​​面也存在缺陷。
  • 许多潜在的瓶颈,例如 DOM 操作和网络延迟,根本不受代码运行速度的影响。
  • 对于许多程序来说,更快的语言实现的速度与高级优化的速度相比相形见绌。换句话说,更快地完成工作是件好事,但根本不做会更快。

走这条路也有很大的缺点:

  • 您必须丢弃您的工作代码,并用您团队中的大多数人几乎不知道的语言重新编写它(包括错误),如果有的话。
  • 截至目前,该技术仍处于起步阶段。你不会把你的公司,甚至是重要的产品押在上面。即使成功了,与 JavaScript 相比,它也永远是一个小众技术。这不会取消它从事专业工作的资格,但它会使许多事情变得更加困难。
  • IIUC,除了处理数字之外,您不能直接做 JS 可以做的大多数事情,您只能调用显式提供给 asm.js 模块的 JS 函数。也就是说,你总是需要至少一堆 Javascript 中的胶水代码,并且(如上所述)如果这包括你的瓶颈,你实际上并没有获得任何东西。

我希望从 asm.js 中获得足够使用的唯一类型的代码是:

  • 尚未用 JavaScript 编写的现有代码。唯一的原因是为您节省大部分移植麻烦。
  • 繁重的数字运算不与浏览器交互。(想一想:你多久这样做一次?你真的想用 C/C++ 编写它并用 JS 连接它吗?)
  • 本质上,在 asm.js 支持的抽象级别上的东西,例如发出机器代码式指令的编译器。
于 2013-05-13T18:52:37.317 回答