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(或其他东西)中

64 到 32 位互操作 - 如何?

Blazor University (38)JavaScript 互操作 —— 从 .NET 调用 JavaScript

如何在vb6中注册一个不能用作com互操作的.net DLL?

揭秘 .NET 5 和Java 互操作