【问题标题】:Creating FFI between C and my language在 C 和我的语言之间创建 FFI
【发布时间】:2015-04-04 18:12:31
【问题描述】:

假设我已经实现了一种编程语言(我们暂时称它为 A)。 A 与 C 非常相似。

我希望我的用户能够访问现有 C 库中的函数和数据结构。这可能吗?如果是,那么幼稚的实现会是什么样子?

一个

  • 用 C++ 实现
  • 编译成机器码
  • 需要访问闭源 C 库

【问题讨论】:

  • 一种天真的方法是从A代码生成C代码
  • @Alex Shesterov:这不是一个选项。首先,因为 A 编译为机器码。其次,因为并非所有库都是开源的。我会更新问题。无论如何感谢您的回复。
  • 对于A 支持的每个平台,您都需要一份ABI 副本,并且您需要生成C 链接器可以理解的目标文件。在 SO 中搜索 [c] ABI 会发现一些可能感兴趣的线程,例如this post
  • @user3386109 感谢您的链接。

标签: c++ c ffi language-implementation language-binding


【解决方案1】:

这在很大程度上取决于 A 是哪种语言。

如果它是一种编译语言,那么您需要生成适当的汇编代码(查找“调用约定”,特别是 C 调用约定)来调用适当的 C 函数。如果您使用的是 LLVM,则可以使用 declarecall 语句轻松完成此操作。完成此操作后,您需要将可执行文件与相关 C 库链接。

但是,如果它是一种解释型语言,那么您需要动态加载该库。如何做到这一点因平台而异:例如,在 unix 类型的系统上,这可以通过 dlopen 函数来实现。

【讨论】:

  • 那么,LLVM 是否具有访问内置的已编译 C 库的功能?
  • @Dundee:是的,请参阅llvm.org/docs/LangRef.html#call-instruction - 我推荐 LLVM,因为它为您实现了一个不错的优化器。
  • 无论如何我都想使用 LLVM,但是我不知道这个方便的功能。我一定会用这个。非常感谢。
猜你喜欢
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2017-09-19
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
相关资源
最近更新 更多