【问题标题】:What's the purpose of writing bindings for C libraries for Rust?为 Rust 编写 C 库绑定的目的是什么?
【发布时间】:2016-03-22 12:58:00
【问题描述】:

我的印象是绑定是您编写的中间层,因此您可以在以另一种语言编写的应用程序中使用以一种语言编写的库。看来 Rust 可能会call C with zero overhead

举个具体的例子,Vulkan 是一个 C API,但人们正在开发 Vulkan 的绑定(123)。

如果可以直接从 Rust 调用 C,为什么要创建绑定?我是不是误会了什么?

【问题讨论】:

  • 以零运行时开销调用 C 并不意味着能够立即调用任何 C 函数。由于 Rust 不能自动导入 C 标头(与 Swift 不同),因此必须手动重写 Rust 中每个函数的声明,以使其可从 Rust 调用。
  • @Shepmaster 这里有一点。也许您可以将问题更改为“以 Vulkan 为例,Rust 中 C 绑定的目的是什么”...
  • @hamstergene 或使用 vk.xml 生成函数签名。
  • @hamstergene 嗯,这很简单。我猜在这种情况下,绑定根本不是一个中间层,而只是一个可以调用的声明。

标签: rust


【解决方案1】:

虽然 Rust 可以无开销地调用 C 函数,但 Rust 编译器仍然需要知道这些函数的存在。要告诉编译器,您必须在 extern "C" { .. } 块中声明这些函数。您可以在FFI chapter of the Rust book 中阅读有关该主题的更多信息。对于许多人使用的 C 函数(例如 Vulkan),将所有这些声明放入其他人可以使用的 Rust 库中是有意义的,而不是自己编写绑定。

通过上面提到的绑定,我们简单地将原始 C 接口暴露给 Rust 程序员。但是大多数 Rust 程序员更愿意使用 Rust 中惯用的 API(我们称之为“生锈”)。那就是:使用 Rust 的高级概念,例如特征和闭包,并且是“安全的”。

您链接的 Vulkan 库:

  • second 链接只是使用工具 (rust-bindgen) 生成的原始绑定。

  • tomaka's library 的目的是创建一个生锈的 API,因此它不仅仅是函数声明的集合。 tomaka 选择引入很少的开销,以便创建一个大多数 Rust 程序员比 C 接口更容易使用的库。 (顺便说一句:tomaka 也这样做了for OpenGL)。

  • 我不太了解您链接的第一个库,但我认为它介于上述两种方法之间。

【讨论】:

  • 这个答案和 hamstergene 的评论一起解决了问题。如果首先使用原始绑定的原因是声明可用函数而不包含标头,那么这是否会导致零开销,因为我们不必执行封送处理,不像许多其他绑定(例如 C#)?跨度>
  • 请注意,Rust 生态系统中正在制定一个约定:简单地重新导出 C API(未更改)的 crate 应命名为 xxx-sys,其中 xxx 是 C 库的名称。然后,可以在上面构建多个更高级别的 crate,从极简的(只是强制内存安全)到更高级别的。
  • 我总是将惯用的 Rust 代码称为“质朴”,而不是“生锈”。我认为它有更多积极的内涵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多