编译器输出语言 - LLVM IR与C.

时间:2012-04-22 02:08:28

标签: compiler-construction code-generation llvm llvm-ir

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

5 个答案:

答案 0 :(得分:7)

我已经将LLVM IR用于一些编译器后端,并与使用C作为后端的编译器一起工作。我发现给LLVM IR带来优势的一件事就是它是打字的。如果没有从LLVM库中获取错误,很难完全形成错误的输出。

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

另外,您可以使用所有酷炫的LLVM命令行工具来分析和处理前端发出的IR。

答案 1 :(得分:2)

我怀疑您在定位C时可以为您的语言实现正确的调试支持。

答案 2 :(得分:2)

LLVM优势:

  1. JIT - 您可以动态编译和运行代码。当然可以使用C(例如,使用嵌入式tcc),但它是一个不太健壮和便携的选项。
  2. 您可以在生成的IR上运行自己的优化传递。
  3. 免费反思 - 使用LLVM检查生成的代码要容易得多。
  4. LLVM库没有大多数C编译器那么大(当然不包括tcc)。
  5. LLVM缺点:

    1. 代码不可移植,您必须根据目标略微更改。 LLVM有一个可移植的子集,但它仍然是一种狡猾的做法。
    2. 对C ++库的运行时依赖性可能有点问题。

答案 3 :(得分: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(There is as of 2020 some support for this)也更加容易。在C的情况下也是可行的,并且有一些垃圾收集器,例如Boehm GC。但是,C并非设计为中间语言。

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

  4. 尽管C是弱类型语言。 LLVM IR是强类型的。因此,可以认为以LLVM IR为目标更为安全。

答案 4 :(得分:0)

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

C被广泛接受,但LLVM IR允许您为LLVM引擎提供数据。并非IR的所有路径都相同。