直接将代码翻译为LLVM IR,或通过C/Clang进行翻译。

3
假设有人想使用LLVM静态编译某种语言,使用CLang将其先翻译为C然后再进行IR翻译,与直接进行IR翻译相比,最大的区别(优点和缺点)是什么?
显而易见的答案是,通过使用了解源语言的前端,可以更轻松地生成优化的IR表示形式,而不是期望CLang能够很好地处理生成的C代码。
这里还需要补充什么吗?

1
你可能也想看看https://dev59.com/UGkv5IYBdhLWcg3w6k9Q#10267898。 - Richard Pennington
1个回答

1

使用通用的C后端的优点:

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

缺点包括:

  • 如果您的语言是增量编译的(例如,没有明确定义的模块,或复杂的宏系统等),则在单个模块中通过LLVM IR进行即时JIT编译比生成数百个小型C模块更有意义。换句话说,C强制进行分离编译。
  • 如果您的源语言语义与C相距太远,则将其直接编译为较低级别可能更容易。
  • 并非所有LLVM功能都可以直接从C访问。例如,内部函数、替代调用约定、用于更高级别语言的调试元数据等。
  • Clang很大,排除它将改善您的内存占用
  • Clang不易维护,它依赖于头文件的存在和确切位置,依赖于某些部分的gcc等。没有它,裸的LLVM可以自行使用,依赖项可以保持自包含。

在大多数情况下,优化不是问题。Clang故意生成非常不优化的LLVM IR。LLVM应该处理所有优化,而不是前端。当然,除非您可以进行一些高级优化,但这些优化不会取决于您选择的后端。


Clang 依赖于 gcc 的部分?这对我来说是新的。你能详细说明一下你所说的哪些部分吗? - user395760
@delnan,Clang需要从gcc获取crtbegin.ocrtend.o等文件,以及一些头文件。 - SK-logic
LLVM会占用编译器的空间,如果你直接生成IR,或者它(或其等效物)会占用C编译器的空间。由你决定。 - vonbrand
@delnan,请查看您的Linux系统中clang软件包的依赖关系,它在这里引用了gcc及其一些内部库(Fedora 18)。但我也会看看MacOS,苹果对GPL过敏,因此可能有一种无需GCC的构建方式。 - vonbrand
1
@SK-logic,是的,我知道Clang的依赖关系是一个问题,但是我想到的更抽象的问题就像你在你的回答中提到的一些。您有没有简单的例子,演示一种语言特性,在C中很难翻译,但在LLVM IR中却相对容易? - Rhangaun
另一个巨大的优势是:您可以免费获得C交互操作,并且编码并不容易:https://github.com/llvm-mirror/clang/blob/master/lib/CodeGen/TargetInfo.cpp - user519179

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接