【问题标题】:Intermediate code from C++来自 C++ 的中间代码
【发布时间】:2016-10-02 15:33:44
【问题描述】:

我想将 C++ 程序编译为中间代码。然后,我想用当前处理器的所有资源编译中间代码。

第一步是使用优化 (-O2) 编译 C++ 程序,运行链接器并完成大部分编译过程。此步骤必须独立于操作系统和架构。

第二步是针对当前计算机的操作系统和处理器编译第一步的结果,没有原始源代码,带有处理器的优化和特殊指令(-march=native)。第二步应该很快并且对软件的要求最少。

我可以吗?怎么做?

编辑
我想这样做,因为我想分发一个独立于平台的程序,它可以使用处理器的所有资源,而不需要原始源代码,而不是为每个平台和操作系统分发一个编译。如果第二步又快又简单就好了。

相同架构的处理器可能具有不同的功能。 X86 处理器可能有 SSE1、SSE2 或其他,它们可以是 32 位或 64 位。如果我为通用 X86 编译,它将缺少 SSE 优化。多年后,处理器将具有新功能,并且需要针对新处理器编译程序。

【问题讨论】:

  • 听起来像是 clang/LLVM 的工作?
  • 我们需要更多的输入来提供有用的建议。我们在谈论哪些处理器和操作系统?为什么要延迟最后一个编译步骤?
  • 如果你想发布平台无关的程序,看看java虚拟机。如果要支持不同版本的 x86,请为每个版本编译二进制文件。 (或者,您可以只提供对时间最关键的函数的不同版本。)今天为明天的 x86 扩展提供代码是不可能的。您将不得不为此更新您的代码。如果您关心您未来的程序性能,请忘记 sse,并确保您的代码可以使用尽可能多的处理器内核。

标签: c++ optimization compiler-construction cross-platform intermediate-language


【解决方案1】:

只是一个建议 - google clang 和 LLVM。

【讨论】:

  • 其实他们做了很多优化。
  • @Jerry 大多数优化是由 JIT 在运行时完成的。
  • 直接表示“LLVM”可以进行 JIT 编译,但您不必这样做。您还可以使用普通后端并获取本机代码。也就是说,JIT 编译器和本机后端都会做一些自己的优化,但大多数昂贵的优化都是在 IR 上完成的,独立于后端(因此它们只需要编写一次)。 LLVM 实际上是一个可重用的前端、后端和优化框架,所有这些都以一个通用的 IR 为中心。您可以通过多种方式组合它们。
  • 也就是说,LLVM 理论上应该能够做这样的事情。它甚至在功能页面上列为“安装时/运行时/离线”-优化(这些都是目标系统上优化的变体)。但是,我不确定需要多少额外的工作才能让类似的东西正常工作。我知道,您可以从命令行分别运行前端、后端和优化(如果安装了 LLVM)。
【解决方案2】:

您对编译器了解多少?您似乎将“-O2”视为某种神奇的标志。

例如,寄存器分配是一种典型的优化。您现在肯定需要有多少寄存器可用。将foo 分配给寄存器 16,然后在第 2 阶段发现您的目标是 x86 是没有意义的。

而那些依赖于架构的优化可能非常复杂。内联主要取决于调用成本,而这又取决于架构。

【讨论】:

    【解决方案3】:

    一旦您进行“特定于处理器”的优化,事情就会变得非常棘手。对于特定于平台的编译器而言,在其生成对象或适当“级别”的“中间”代码时真正“通用”是非常困难的:除非它类似于“IL”(中间语言)代码(如 C#-IL代码或 Java 字节码),给定的编译器很难知道“在哪里停止”(因为当目标平台知识存在时,优化会在不同的编译级别发生)。

    另一个想法:如何编译成“预处理”的源代码,通常带有“*.i”扩展名,然后在不同的架构上以分布式方式编译?

    例如,大多数(所有)C 和 C++ 编译器都支持以下内容:

    cc /P MyFile.cpp
    gcc -E MyFile.cpp
    

    ...每个生成MyFile.i,这是预处理文件。现在该文件已包含ALL 标头和其他#defines,您可以在将*.i 文件分发到其他系统后将其编译为目标对象文件(或可执行文件)。 (如果您的预处理器宏是特定于目标平台的,您可能需要变得聪明,但它应该与您的构建系统非常直接,它应该生成命令行来执行此预处理。)

    这是distcc 用来在本地预处理文件的方法,因此远程“构建农场”不需要安装任何 标头或其他包。 (无论构建场中的机器如何配置,都可以保证获得相同的构建产品。)

    因此,它同样具有为单台机器集中“配置/预处理”的效果,但以分布式方式提供交叉编译、特定于平台的编译或构建农场支持。

    仅供参考——我真的很喜欢distcc 的概念,但该特定项目的最后一次更新是在 2008 年。所以,如果你找到其他类似的工具/产品,我会很感兴趣。 (与此同时,我正在编写一个类似的工具。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多