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

问题描述:

我最近玩过不同的LLVM前端像Clang(C Familiy),LDC2(D),Terra,...LLVM互操作性(如JVM或.Net) - 是否可以这样做?

所有这些语言都可以编译到LLVM IR(有点可读)和LLVM IR位码。那么在这个阶段,他们都处于同一个“层面”上吗?

我的问题是:在“语言级别”上有没有像.NET语言或JVM语言那样的语言互操作性的方式,还是只能通过在IR中编辑来实现?

我已经在谷歌搜索了这个问题,但没有找到想找的东西。

如果是我该怎么做,我可以做所有的前端或只有一些具体的?

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

  • 呼叫Ÿ功能(知道Ÿ的呼唤convetions)
  • 转换传递给Y考虑形式的数据,预计(称为编组)

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

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

extern "C" { 
} 

块导出的代码如C,和Haskell也可以导出其功能与foreign export ccall关键字。它还具有将Haskell字符串转换为C字符串并返回的编组函数。你可以看到,LLVM在这里扮演着一个小角色,但你正确地提到,使用LLVM你可以在理论上通过手动编辑结果IR来互操作任何编译为LLVM的语言。