我最近玩过不同的LLVM前端,如Clang(C Familiy),LDC2(D),Terra,......
所有这些语言都可以编译成LLVM IR(有些可读)和LLVM IR Bitcode。那么在这个阶段他们都处于同一“水平”的权利吗?
我的问题是:在语言级别上是否存在某种语言互操作性方式,如.NET语言或JVM语言,还是只能通过在IR中编辑来实现?
我已经在谷歌看过这个问题,但没找到想要的东西。
如果是,我怎么能这样做,我可以与所有前端或仅某些特定的一起做吗?
答案 0 :(得分:1)
对于语言X能够调用语言Y,它必须具备
的能力这主要应该在前端级别(不是LLVM的中端)完成。 C语言可以作为互操作的共同基础,因此如果两种语言可以调用C并将它们自己的函数导出到C,它们可以相互通信。
Haskell和C ++可以作为例子。 C ++可以使用
将代码导出为C.extern "C" {
}
阻止,Haskell也可以使用foreign export ccall
关键字导出其函数。它还具有编组功能,可将Haskell字符串转换为C字符串并返回。
正如您所看到的,LLVM在这里扮演次要角色,但您正确地提到使用LLVM,理论上,您可以通过手动编辑生成的IR来互换任何编译为LLVM的语言。