LLVM互操作性(如JVM或.Net) - 是否可以这样做?

时间:2017-07-21 08:25:25

标签: interop llvm llvm-ir language-interoperability

我最近玩过不同的LLVM前端,如Clang(C Familiy),LDC2(D),Terra,......

所有这些语言都可以编译成LLVM IR(有些可读)和LLVM IR Bitcode。那么在这个阶段他们都处于同一“水平”的权利吗?

我的问题是:在语言级别上是否存在某种语言互操作性方式,如.NET语言或JVM语言,还是只能通过在IR中编辑来实现?

我已经在谷歌看过这个问题,但没找到想要的东西。

如果是,我怎么能这样做,我可以与所有前端或仅某些特定的一起做吗?

1 个答案:

答案 0 :(得分:1)

对于语言X能够调用语言Y,它必须具备

的能力
  • 调用Y函数(知道Y的呼叫对话)
  • 将传递给Y的数据转换为预期的形式(称为编组)

这主要应该在前端级别(不是LLVM的中端)完成。 C语言可以作为互操作的共同基础,因此如果两种语言可以调用C并将它们自己的函数导出到C,它们可以相互通信。

Haskell和C ++可以作为例子。 C ++可以使用

将代码导出为C.
extern "C" {
}

阻止,Haskell也可以使用foreign export ccall关键字导出其函数。它还具有编组功能,可将Haskell字符串转换为C字符串并返回。

正如您所看到的,LLVM在这里扮演次要角色,但您正确地提到使用LLVM,理论上,您可以通过手动编辑生成的IR来互换任何编译为LLVM的语言。