编写编译器时,使用LLVM IR vs C作为目标语言有哪些优缺点?我知道两者都被使用了,我想如果我使用clang来编译C,那么最终的机器代码会是相似的。那么还有什么需要考虑的事情呢?
答案 0 :(得分:7)
我已经将LLVM IR用于一些编译器后端,并与使用C作为后端的编译器一起工作。我发现给LLVM IR带来优势的一件事就是它是打字的。如果没有从LLVM库中获取错误,很难完全形成错误的输出。
在我看来,更容易在源代码和IR之间保持密切关联以进行调试。
另外,您可以使用所有酷炫的LLVM命令行工具来分析和处理前端发出的IR。
答案 1 :(得分:2)
我怀疑您在定位C时可以为您的语言实现正确的调试支持。
答案 2 :(得分:2)
LLVM优势:
tcc
),但它是一个不太健壮和便携的选项。tcc
)。LLVM缺点:
答案 3 :(得分:1)
我将使用LLVM来指代框架,并使用LLVM IR来指代目标语言。
C优势
LLVM IR优势
C
尽管LLVM最近获得了更多的目标,但仍存在用于各种嵌入式系统的C编译器。可以说,C在此类别中比LLVM IR(中间表示)略有优势。
使用C而不是LLVM的主要优点是,与LLVM相比,生成的代码处于更高的级别。使用诸如GDB之类的标准化调试器,可以认为,更容易对生成的代码的行为进行推理。利用GDB之类的调试器为编译为C的语言构造调试器也更加容易。
第三点。互操作性比较麻烦。但是,C具有标准化的应用程序二进制接口。因此,更容易编写库并将这些库与用C和/或C +编写的其他程序连接。尽管如此,许多语言(例如Java)仍提供了到C的标准化接口。
可以说,通过定位C来更轻松地开始工作吧!
LLVM
C是一种相当高级的语言,如果没有习惯地编写它,性能可能会下降(取决于目标编译器以及编译器所做的假设)。 有一些论文,例如An llVM backend for GHC 这说明了C语言的一些缺点以及LLVM IR作为目标语言的优点。
由于LLVM(框架)是作为可重用单元的集合而构建的,因此很容易为特定目标语言编写特定于目标语言的过程。编写自定义GC(There is as of 2020 some support for this)也更加容易。在C的情况下也是可行的,并且有一些垃圾收集器,例如Boehm GC。但是,C并非设计为中间语言。
内存占用量。与LLVM位代码相比,生成的C代码具有更大的内存占用量。如果要编译和链接大型系统,则针对LLVM可能会获得编译时的优势。
尽管C是弱类型语言。 LLVM IR是强类型的。因此,可以认为以LLVM IR为目标更为安全。
答案 4 :(得分:0)
明显没有CLANG或者处于实验状态的架构和操作系统。
C被广泛接受,但LLVM IR允许您为LLVM引擎提供数据。并非IR的所有路径都相同。