LLVM 互操作性(如 JVM 或 .Net)- 有可能吗?
Posted
技术标签:
【中文标题】LLVM 互操作性(如 JVM 或 .Net)- 有可能吗?【英文标题】:LLVM Interoperability (Like JVM or .Net) - Is it possible to do? 【发布时间】:2017-07-21 08:25:24 【问题描述】:我最近玩了一些不同的 LLVM 前端,比如 Clang (C Familiy)、LDC2 (D)、Terra,...
所有这些语言都可以编译成 LLVM IR(有点可读)和 LLVM IR Bitcode。所以在这个阶段他们都在同一个“水平”上吧?
我的问题是:是否有某种语言互操作性方式,例如“语言级别”上的 .NET 语言或 JVM 语言,还是只能通过在 IR 中进行编辑来实现?
我已经在 Google 中查找过这个问题,但没有找到要查找的内容。
如果是,我该怎么做?我可以使用所有前端还是只使用某些特定的前端?
【问题讨论】:
【参考方案1】:要让语言 X 能够调用语言 Y,它必须具备以下能力
调用 Y 函数(知道 Y 的调用约定) 将传递给 Y 的数据转换为它期望的形式(称为编组)这主要应该在前端级别完成(而不是 LLVM 是中端)。 C 语言可以作为互操作的共同基础,因此如果两种语言可以调用 C 并将它们自己的函数导出到 C 中,它们就可以相互交谈。
Haskell 和 C++ 可以作为示例。 C++ 可以将代码导出为 C 使用
extern "C"
block,Haskell 也可以用foreign export ccall
关键字导出它的函数。它还具有将 Haskell 字符串转换为 C 字符串并返回的编组函数。
如您所见,LLVM 在这里扮演的角色次要,但您说得对,理论上,您可以通过手动编辑生成的 IR 来互操作任何编译为 LLVM 的语言。
【讨论】:
以上是关于LLVM 互操作性(如 JVM 或 .Net)- 有可能吗?的主要内容,如果未能解决你的问题,请参考以下文章
听说Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python!
将 MFC Gui 应用程序包装到 .NET 互操作的 DLL(或其他东西)中
Blazor University (38)JavaScript 互操作 —— 从 .NET 调用 JavaScript