LLVM 互操作性(如 JVM 或 .Net)——有可能吗?
LLVM Interoperability (Like JVM or .Net) - Is it possible to do?
我最近尝试了一些不同的 LLVM 前端,例如 Clang(C 系列)、LDC2 (D)、Terra,...
所有这些语言都可以编译成 LLVM IR(有点可读)和 LLVM IR Bitcode。所以在这个阶段他们都在同一个 "level" 对吧?
我的问题是:"language level" 上是否有某种语言互操作性方式,如 .NET 语言或 JVM 语言,或者是否只能通过在 IR 中编辑来实现?
我已经在 Google 中查找过这个问题,但没有找到要查找的内容。
如果是,我该怎么做,我可以用所有前端还是只用一些特定的前端?
要使语言 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 的语言。
我最近尝试了一些不同的 LLVM 前端,例如 Clang(C 系列)、LDC2 (D)、Terra,...
所有这些语言都可以编译成 LLVM IR(有点可读)和 LLVM IR Bitcode。所以在这个阶段他们都在同一个 "level" 对吧?
我的问题是:"language level" 上是否有某种语言互操作性方式,如 .NET 语言或 JVM 语言,或者是否只能通过在 IR 中编辑来实现?
我已经在 Google 中查找过这个问题,但没有找到要查找的内容。
如果是,我该怎么做,我可以用所有前端还是只用一些特定的前端?
要使语言 X 能够调用语言 Y,它必须具备
- 调用 Y 函数(了解 Y 的调用约定)
- 将传递给 Y 的数据转换成它期望的形式(称为编组)
这主要应该在前端级别完成(而不是 LLVM 是中间端)。 C语言可以作为互操作的共同点,所以如果两种语言可以调用C并将自己的函数导出到C,它们就可以互相交谈。
Haskell和C++可以作为例子。 C++ 可以使用
将代码导出为 Cextern "C" {
}
块,Haskell也可以用foreign export ccall
关键字导出其功能。它还具有编组功能,可将 Haskell 字符串转换为 C 字符串并返回。
如您所见,LLVM 在这里起着次要作用,但您提到的是正确的,理论上,您可以使用 LLVM 互操作任何通过手动编辑生成的 IR 编译为 LLVM 的语言。