QBE与LLVM

2020-12-04 20:28:12

QBE和LLVM都是使用SSArepresentation的编译器后端。本文将解释为什么LLVM不会使QBE成为冗余项目。显然,由于我写的东西,所以后面的一切都是有偏见的。

它不能解决构思行业级语言时面临的所有问题。如果您想了解一些语言方面的想法,则使用LLVM就像用卡车拖运背包,而使用QBE则更像是骑自行车。

它试图在极其庞大的编译文献中找到优化方法,这些优化方法可以用完整编译器代码的10%获得70%的性能。

例如,在QBE!中用160行代码实现SSA格式的复制传播!

首先,它是并且将继续是一个小项目(少于8 kloc)。其次,它是在没有任何花哨的C99上编程的。第三,它能够在每次通过后以统一格式转储IL和调试信息。

LLVM绝对具有更多功能,但是QBE中提供了一些要考虑的事项。

用更多的技术术语来说,任何提供良好C兼容性并使用LLVM作为后端的语言都需要在其前端重新实现ABI的大块内容! LLVM社区中这个众所周知的问题导致大量重复和错误。

实现一个完整的C ABI(带有struct参数和返回值)是非常棘手的,并不是很有趣。 QBE为您提供IL操作,使您可以轻松地调用C(并被C调用)。此外,QBE中的ABI实施已通过模糊测试和手动测试进行了全面测试。

实施SSA建设很困难。为了使用户不必实施它,LLVM提供了堆栈插槽。这意味着变量v的一个增量将由三个LLVM指令组成:一个加载,一个加法和一个存储。

QBE提供了简单的非SSA临时对象,因此,v的增加仅需通过一条指令%v = w加上%v,1即可完成。

这看起来很漂亮,但是将IL的大小除以三可以使前端编写者更容易发现生成的代码中的错误。

为了进行高级优化和正确性,LLVM具有复杂的IL类型。但是,实际上只有少数类型是一流的,并且源语言的许多操作都需要强制类型转换。

由于QBE大大简化了类型的使用,因此IL更具可读性且更短。当然可以反驳QBE的正确性,但是要记住,实际上,LLVM IL中必需的大量强制转换会损害类型系统的整体有效性。