我看到越来越多的人转向使用LLVM,特别是那些具有C或C ++背景的人,所以有一种模式可以让人们接近这个编译器,令我惊讶的是高度异构的技术集LLVM可以管理,我不知道这个虚拟机遵循的管道是什么,以及由此带来的好处。
我想强调的是,我专注于LLVM,而不是真正的铿锵。
百万分之一的例子是this one ( Youtube Video ),其中管道对我来说并不是很明显,或this other one,但显然有很多完全不同的解决方案,例如,使用LLVM与JIT解决方案结合使用。
简而言之,我看到不同的语法和语义,人们使用LLVM来生成GPU着色器或二进制对象,但我看不出共同点。
“基于LLVM的编译”是什么意思,将LLVM视为黑盒子,中间的输入,输出和业务逻辑是什么类型?
答案 0 :(得分:4)
我看不出共同点。
共同点是将一种语言的代码转换为另一种语言的代码。这正是编译器所做的。因此,如果您想将“源语言”中的一段代码转换为“目标语言”中的代码,您需要做的是:
就是这样。现在,您可以享受LLVM对其输入和输出之间的代码执行的优化,以及将代码“降低”到更接近机器代码的常用框架等等。
顺便说一句,GCC的行为相同,只是LLVM被许多人认为在某些方面更优越,特别是许可和易于修改。答案 1 :(得分:2)
LLVM相对于其他源代码编译器的优势在于它被设计为一组可重用的库。这意味着在某种程度上,您可以选择要在工具中包含的内容。并非每种语言工具都需要优化,并非每种语言工具都需要代码生成。 LLVM是一个非常灵活的语言处理系统。
通常,当人们说“基于LLVM的编译”时,他们意味着使用一个或多个LLVM库来实现他们的工具。他们可以利用LLVM中的所有工作来理解其IR并为多个目标生成代码。
LLVM IR是大多数LLVM库使用的通用表示形式。它是您需要写入的接口。对于机器代码等低级内容,您需要处理其他一些LLVM表示(MachineInstr,MC等)。
至于编写前端来生成LLVM IR,最棘手的部分是确保从源语言到LLVM IR的转换保留了源语言的语义。 LLVM IR对每条指令都有明确定义但低级别的语义集。如果您的源语言具有更高级别的语义,则必须将它们降低为LLVM IR指令序列以实现它。例如,没有LLVM指令处理C风格的位域访问,因此C语言前端必须使用一系列LLVM指令来实现功能(通常是移位和按位操作)。
只要您正确地在LLVM IR中实现源语言的语义,LLVM库就可以正确执行正确的代码转换。如果某些所需的转换需要比LLVM IR提供的更高级别的语义信息,则您必须在转换为LLVM IR之前在某个阶段进行转换(因此您将获得高级信息)或者您可以传递属性信息在LLVM IR中传达高级语义并编写自定义LLVM传递来实现转换。做前者通常比后者更清洁。