HN 日本語サマリー

← 一覧へ戻る
プログラミング

extern "fil-C" が欲しい

I want extern "fil-C" (domenkozar.com)

18 pointsby ingve3 コメント

要約

この記事は、RustのC FFI(外部関数インターフェース)におけるメモリ安全性の課題と、Fil-Cという新しいアプローチを提案しています。Fil-CはC/C++コードを再コンパイルし、ランタイムチェックとガベージコレクタを導入することでメモリ安全性を保証しますが、実行時コストがかかります。著者は、Rustのコンパイル時安全性とFil-Cのランタイム安全性を組み合わせた新しいFFI(extern "fil-C")を提唱し、既存のCコードを安全に利用しつつ、将来的にRustへの移行を促進するインセンティブ設計を求めています。

全文翻訳

RustのC FFIは、数十年にわたる有用なソフトウェアへのアクセスを提供しますが、その取引は逆になっています。私たちはRustを使ってコンパイル時にメモリ安全性を証明します。その後、unsafeな境界を越え、どちらの言語も強制できない契約をCライブラリが尊重することを信頼します。レガシーコードは依然として安価な道であり、それを書き直すことは高価な道です。 Fil-Cは、より興味深い取引を提供します。それは、機能、ランタイムチェック、そして並行ガベージコレクタを備えてCとC++を再コンパイルします。メモリ安全性の違反は、エクスプロイトになる代わりにパニックを引き起こします。既存のソフトウェアは、ソースコードの変更がほとんどまたは全く必要ないことが多いですが、ランタイムで安全性の対価を支払います。 私は、Fil-C ABIと通信するRust FFIが欲しいです。最初のバージョンは、意図的に狭い範囲に限定される可能性があります。スカラ値、コピーされた文字列とスライス、そして不透明なハンドルです。それは安全なRustラッパーを生成し、Fil-Cで完全なC依存関係グラフをコンパイルし、通常のunsafeなCへのエスケープハッチを提供しないでしょう。共有メモリは、ブリッジがRustが確実に失効させることができる機能(capability)をFil-Cに与えることができるようになったら、後で追加されるかもしれません。 これはbindgenの新しいオプションではありません。Fil-CはCとソース互換ですが、ABI互換ではありません。そして、通常のRust extern "C"は、Fil-CがYolo-Cと呼ぶABIと通信します。ブリッジを構築することは、Rust、Fil-C、または生成されたスタブのペアに、Fil-Cの保証を失うことなく値を交換する方法を教えることを意味します。もしそれが簡単なら、それはすでに存在していたでしょう。 このスタックの重要な部分はすでに形になりつつあります。filnixはFil-CをNixクロスコンパイルプラットフォームとしてパッケージ化しており、100以上のnixpkgsパッケージのポートがあります。Fil-Cをプラットフォームとして扱うということは、Nixが通常のCを誤ってリンクする代わりに、Fil-C ABIのために推移的な依存関係の閉包を再構築することを意味します。filnixはまだRustブリッジではありませんが、それらを構築できる再現可能なツールチェーン、パッケージユニバース、およびテストベッドを提供します。 Zigは別の方向から同じ問題に取り組んでいます。Andrew KelleyはFil-Cに触発されたオプションのFil ABIを提案しました。それはZigコンパイラと標準ライブラリにおける独立した実装であり、ZigプログラムとそのCおよびC++の依存関係ツリー全体をランタイムメモリ安全性でコンパイルすることを意図しています。これは、Rustブリッジが参入する必要がある世界に驚くほど近いです。 しかし、その結果は私たちにまさに正しいインセンティブを与えるでしょう。私たちはコンパイル時安全性にRustを使用し、その後Cを使用するためのパフォーマンスペナルティを支払うことができます。レガシーライブラリを保持すれば、それはメモリ安全性を保ちますが、すべてのポインタ操作はチェックされ、そのメモリはガベージコレクションに参加します。ホットパスをRustで書き直せば、それらのチェックは静的になり、税金は消えます。Cは、永続的な高速パスではなく、安全な互換性パスになります。 ここで言う「100%安全」とは、サポートされている境界全体でメモリ安全であることを意味し、論理バグ、デッドロック、または悪いAPIがないことではありません。その境界が難しい部分です。Fil-Cは現在、プログラム全体とその依存関係がそのABIを使用することを要求しています。プロジェクトはまた、通常のCとの相互運用性を目標外として扱っています。Rustブリッジは、その全体世界の保証を維持する必要があり、それを静かにYolo型の穴を開けるのではなく、それを保つ必要があります。 私はextern "fil-c"が欲しいです。高速パスはRust、安全なパスは古いC、そして移行を完了するためのパフォーマンス上の理由が必要です。また、いくつかのほぼ互換性のある島々ではなく、クロスエコシステム間の協力を目にしたいです。 Fil-Cは機能モデルと動作するランタイムを持っています。Rustはコンパイル時安全性を持っています。ZigはFil-Cに触発されたABIを模索しています。Nixとfilnixは完全な依存関係グラフを再構築し、テストできます。この問題は、4つのコミュニティすべてから最高の頭脳が同じ部屋に集まる価値があります。 そこで、招待状をお送りします。来年ランサローテで開催されるOceanSprintで、一緒にそれを構築しましょう。filnixを構築しているMikael Brockmanはすでに承諾しています。他に誰が参加しますか?