【问题标题】:On-the-fly C++ compiler for system-independent program distribution用于独立于系统的程序分发的即时 C++ 编译器
【发布时间】:2017-09-07 21:13:34
【问题描述】:

我公司内部软件项目大多使用 Java 完成的主要原因是 Java 程序独立于主机架构,这为将应用程序分发到国际部门提供了很大的灵活性。

我们需要启动一个新的应用程序,它会进行大量的数字运算,我想使用我们可用的 C++ 库和代码(我也更喜欢 C++)。

现在我想知道为什么没有一些软件在以下意义上像 Java JIT 编译器一样工作:

  1. 执行编译直到intermediate representation,例如 LLVM IR
  2. 将打包的中间表示分发到客户端计算机
  3. 在本地机器上编译一次
  4. 执行

这将结合 Java 和 C++ 的几个优点:

  • 本地机器架构的优化(就像 JIT 所做的那样)
  • 分发独立于操作系统的软件版本 (Java)
  • 在中间没有虚拟机的情况下执行程序 (C++)

这样的事情没有完成的原因是什么?

【问题讨论】:

  • 性能,主要是。直接在目标平台上编译的 C++ 通常比依赖中间语言的语言(如 Java 和 .NET 系列)要快得多,因为编译效率更高,并且在运行时不需要任何解释。这是课程的马 - 人们将 C++ 用于 O/S 级别的东西和对性能至关重要的东西,如游戏,他们将 Java/.NET 用于 LOB 应用程序等,因为内存管理更容易一些,有更多的语言特性,你可以针对多个平台。换句话说,您使用正确的工具来完成这项工作。
  • @ADyson 的想法是在目标平台上进行编译。
  • 我对编译器了解不多,但我强烈怀疑中间编译步骤仍会以性能为代价。针对特定目标进行编译允许编译器对源代码进行优化,从而利用目标平台的特性。如果你编译到一些通用的中介,很有可能会丢失微妙之处。

标签: java c++ compilation


【解决方案1】:

这不适用于高性能应用程序的主要原因是,最后一点性能需要付出相当高的代价。现代 JIT 是编译时延迟和生成的代码质量之间的一个不错的折衷方案。

相反,现代 C++ 编译器(包括 Intel 和 GCC)可以针对多种替代架构变体进行静态编译,并在加载程序时选择正确的变体。事实证明,无论如何您都不需要考虑那么多变体。实际上,您正在查看 AVX (none/1/2)。

如果您的编译器不这样做,一个廉价的手动替代方法是将替代变体放入一组动态加载的库中,并在加载时选择正确的库。使用 MSVC 的延迟加载库,这可以同样透明。您只需挂钩实际的库负载以选择 MathAVX.DLL 而不是 MathSSE.DLL

当然,对于真正的高性能应用程序,您可以只说“64 位,AVX2”或“CUDA,计算能力 6+”。对于此类应用程序,软件定义硬件,反之亦然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多