3

假设有人想使用 LLVM 静态编译给定语言,最大的区别(优点和缺点)是先将其翻译成 C 然后使用 CLang 而不是处理直接的 IR 翻译。

我想显而易见的答案是,通过使用了解源语言的前端,与期望 CLang 在生成的 C 中表现良好相比,更容易提出优化的 IR 表示。

我在这里遗漏了什么?

4

1 回答 1

1

使用通用 C 后端的优点:

  • 您可以使用任何 C 编译器(不仅仅是 Clang)
  • 如果使用如此高级的语言,则更容易调试中间代码
  • 根据您的源语言语义,通过 C 翻译它可能更容易(但不一定)

缺点是:

  • 如果您的语言是增量编译的(例如,没有明确分离的模块,或复杂的宏系统,或其他任何东西),通过 LLVM IR 在单个模块中进行编译并立即进行 JIT 编译比生成数百个微小的 C 模块更有意义。换句话说,C 正在强制执行单独的编译。
  • 如果您的源语言语义与 C 相差太远,直接将其编译到较低级别会更容易。
  • 并非所有 LLVM 功能都可以从 CEg、内在函数、替代调用约定、高级语言的调试元数据直接访问。
  • Clang 很大,排除它会改善你的内存占用
  • Clang 不容易维护,它依赖于头文件的存在和确切位置,依赖于gcc.

在大多数情况下,优化不是问题。Clang 故意生成一个极其非最优的 LLVM IR。LLVM 应该关注所有优化,而不是前端。当然,除非您可以进行一些高级别的优化,但它们不会取决于您的后端选择。

于 2013-03-01T09:25:17.337 回答