用于独立于系统的程序分发的即时C ++编译器

时间:2017-04-12 07:57:53

标签: java c++ compilation

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

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

现在我想知道为什么在某种意义上没有一些像Java JIT编译器那样的软件:

  1. 执行编译,直到intermediate representation,例如LLVM IR
  2. 将打包的中间表示分发给客户端计算机
  3. 在本地计算机上编译一次
  4. 执行
  5. 这将结合Java和C ++的几个好处:

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

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

1 个答案:

答案 0 :(得分:4)

没有为高性能应用程序做到这一点的主要原因是最后一点性能是以相当高的价格出现的。现代JIT是编译时延迟和生成的代码质量之间的妥协。

相反,现代C ++编译器(包括Intel和GCC)可以静态编译多个替代架构变体,并在加载程序时选择正确的变体。事实证明,无论如何你都没有那么多的变种。实际上,你正在寻找AVX(无/ 1/2)。

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

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