プログラミング
extern "fil-C" が欲しい
I want extern "fil-C" (domenkozar.com)
要約
RustのC FFIは既存の豊富なソフトウェア資産へのアクセスを提供するが、メモリ安全性の保証はRust側で行われ、Cライブラリとの境界で安全性が失われるという課題がある。Fil-CはC/C++をメモリ安全性を高めた形で再コンパイルするアプローチであり、Rustがコンパイル時の安全性、Fil-Cが実行時の安全性を提供するような、より良い相互運用性(extern "fil-C" ABI)を提案している。この実現には、Rust、Fil-C、Zig、Nixといったコミュニティ間の協力が必要である。
全文翻訳
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はすでに承諾しています。他に誰が参加しますか?