2016-03-22 8 views
6

私はバインディングが中間層であり、別の言語で書かれたアプリケーションである言語で書かれたライブラリを使うことができるという印象を受けました。錆具体的な例かもしれcall C with zero overheadRustのCライブラリのバインディングを作成する目的は何ですか?

は、バルカンはCのAPIであると思われ、まだの人はバルカン(123)のバインディングに取り組んでいます。

CをRustから直接呼び出すことができる場合は、なぜバインディングを作成する必要がありますか?私は何かを誤解したことがありますか?

+5

ランタイムオーバーヘッドがゼロのCをコールしても、すぐにC関数を呼び出すことはできません。 RustはCヘッダを自動的にインポートすることができないので(Swiftなどとは異なり)、Rustの各関数の宣言を手動で書き直してRustから呼び出し可能にする必要があります。 – hamstergene

+0

@Shepmasterはここにポイントがあります。たぶんあなたは、質問を「Vulkanの例のCustinのCustバインディングの目的は何ですか?」というように変更することができます。 –

+0

@hamstergeneまたはvk.xmlを使用して関数シグネチャを生成します。 –

答えて

9

RustはオーバーヘッドなしでCの関数を呼び出すことができますが、Rustコンパイラはこれらの関数の存在を知る必要があります。コンパイラに指示するには、これらの関数をブロックextern "C" { .. }に宣言する必要があります。トピックについて詳しくは、FFI chapter of the Rust bookをご覧ください。多くの人(例えばVulkan)が使用するC関数の場合、バインディング自体を記述するのではなく、他の人がちょうど使用できるRustライブラリにすべての宣言を入れるのが理にかなっています。

上記のバインディングを使用すると、元のCインターフェイスがRustプログラマに公開されます。しかし、ほとんどのRustプログラマーは、Rustで慣用的なAPI(「錆びた」と呼んでいる)を使いたいと思っています。つまり、Rustの高水準の概念を使用して、特性やクロージャーを使い、「安全」であることです。

リンクされたバルカンライブラリ:

  • secondリンクはただのツール(さび-bindgen)で生成された生結合です。

  • tomaka's libraryの目的は、錆びたAPIを作成することであり、単なる関数宣言の集合ではありません。 tomakaは、ほとんどのRustプログラマがCインタフェースよりも使いやすいライブラリを作成するために、ほとんどオーバーヘッドを導入しないことを選択します。 (ところで:tomakaはこれをやったfor OpenGL)。

  • あなたがリンクした最初のライブラリについて実際には分かりませんが、私はそれが上記の2つのアプローチの間にあると思います。

+1

ハムステルゲンのコメントと一緒にこの答えは物事をクリアしました。ヘッダーを含まずに使用可能な関数を宣言するのが最初の生のバインディングを使用する理由であれば、他の多くのバインディング(C#など)とは異なり、マーシャリングを実行する必要がないためオーバーヘッドがゼロになります。 –

+2

Rustエコシステムでは、規約が発展しています.C APIを単純に再エクスポートする(変わらない)名前は 'xxx-sys'でなければなりません。ここで' xxx'はCライブラリの名前です。次に、複数の上位レベルのクレートを、最小限のもの(メモリの安全性を強制するだけ)から、より高いレベルのものまで、上に構築することができます。 –

+1

私はいつも「錆びない」という慣用錆コード「素朴」を呼んでいます。私はそれがより積極的な意味を持っていると思う。 – llogiq

関連する問題