13

对于编写编译器,将 LLVM IR 与 C 用于目标语言的优缺点是什么?我知道两者都被使用了,我想如果我使用 clang 编译 C,最终的机器代码会是相似的。那么还有什么其他的事情需要考虑呢?

4

5 回答 5

10

我已经将 LLVM IR 用于一些编译器后端,并使用过使用 C 作为后端的编译器。我发现给 LLVM IR 带来优势的一件事是它是有类型的。在不从 LLVM 库中获取错误的情况下,很难做出完全格式错误的输出。

在我看来,保持源代码和 IR 之间的密切关联以进行调试也更容易。

此外,您还可以获得所有很酷的 LLVM 命令行工具来分析和处理前端发出的 IR。

于 2012-04-22T12:24:30.557 回答
3

我怀疑您在以 C 为目标时能否为您的语言实现适当的调试支持。

于 2012-04-22T13:19:51.123 回答
3

LLVM 优势:

  1. JIT - 您可以动态编译和运行代码。当然,C 语言也可以(例如,使用嵌入式tcc),但它的健壮性和可移植性要差得多。
  2. 您可以在生成的 IR 上运行自己的优化过程。
  3. 免费反射 - 使用 LLVM 检查生成的代码要容易得多。
  4. LLVM 库不像大多数 C 编译器那么大(tcc当然不算在内)。

LLVM 的缺点:

  1. 代码不可移植,你必须根据你的目标稍微改变它。LLVM 有一个可移植的子集,但它仍然是一种狡猾的做法。
  2. 对 C++ 库的运行时依赖可能有点问题。
于 2012-04-23T11:43:41.727 回答
1

明显没有 CLANG 或处于实验状态的架构和操作系统。

C 被更广泛地接受,但 LLVM IR 允许你用勺子喂 LLVM 引擎。并非所有通向 IR 的路径都是平等的。

于 2012-04-22T09:51:23.970 回答
1

我将使用 LLVM 来指代框架,并使用 LLVM IR 来指代目标语言。

C 优势

  1. 跨平台
  2. 调试(请阅读下文。部分与第 4 点有关。)
  3. 互操作性
  4. 便于使用

LLVM IR 优势

  1. 表现
  2. 自定义选项
  3. 内存占用
  4. 强打字/安全

C

  1. 尽管 LLVM 最近获得了更多目标,但存在适用于各种嵌入式系统的 C 编译器。可以说,在这个类别中,C 比 LLVM IR(中间表示)略有优势。

  2. 针对 C 而不是 LLVM 的主要优点是生成的代码与 LLVM 相比处于更高级别。使用诸如 GDB 之类的标准化调试器,可以说更容易推理生成代码的行为。使用 GDB 等调试器也更容易为编译为 C 的语言构建调试器。

  3. 第三点。互操作性更麻烦。但是,C 具有标准化的应用程序二进制接口。因此更容易编写库并将这些库与用 C 和/或 C+ 编写的其他程序接口。尽管如此,许多语言(例如 Java)仍为 C 提供标准化接口。

  4. 可以说,通过以 C 为目标更容易上手并获得一些工作

LLVM

  1. C 是一种相当高级的语言,如果不编写它,按照惯用方式,性能可能会降低(取决于目标编译器,以及所述编译器所做的假设)。有一些论文,例如An llVM backend for GHC ,说明了 C 的一些缺点和 LLVM IR 作为目标语言的优点。

  2. 由于 LLVM(框架)是作为可重用单元的集合构建的,因此很容易为您的特定目标语言编写特定于目标语言的传递。编写自定义 GC 也更容易(截至 2020 年,对此有一些支持)。在 C 的情况下也是可能的,并且有一些垃圾收集器,例如Boehm GC。但是,C 并非设计为中间语言。

  3. 内存占用。与 LLVM 位码相比,生成的 C 代码具有更大的内存占用。如果您正在编译和链接一个大型系统,您可能会获得针对 LLVM 的编译时间优势。

  4. 而 C 是弱类型语言。LLVM IR 是一种强类型。因此,可以说以 LLVM IR 为目标更安全。

于 2020-07-22T13:24:47.280 回答