port-c-module について
CモジュールをRustへ移植する開発者向けのスキルです。コード分析や計画から、FFI統合とテストまでの手順を扱います。
主な機能
- 01C API、依存関係、テストの分析
- 02モジュール移植計画の作成
- 03RustクレートとFFIラッパーの作成
- 04RustコードをCコードベースに接続
- 05CとRustの統合テスト
活用シーン
- 01CモジュールのRust移行計画
- 02Cインターフェースを持つRustモジュールの実装
- 03移植手順と統合テストの確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ redisearch/ redisearch --skill port-c-moduleインストール後、Claude Code で/port-c-moduleを入力して読み込まれたか確認します。
詳細
モジュールの移植スキル
C モジュールを Rust に移植するためのガイドです。
引数
移植するモジュール名を引数として指定してください(例:/port-module triemap)。
移植するモジュール:$ARGUMENTS
使用方法
C モジュールを Rust に移植し始める際に、このスキルを使用してください。
手順
1. C コードを分析する
まず、移植する C モジュールを理解してください(src/ 内の $ARGUMENTS.c と $ARGUMENTS.h を探します)。
src/内の.cファイルと.hファイルを読みます- ヘッダーファイルで公開されている内容を特定します:
- コードベースのほかの部分から、このモジュールで定義されているデータ構造の内部フィールドにアクセスできますか?
- 型は常に値渡し、または参照渡しですか?それとも混在していますか?
- 対応する Rust の型を FFI 境界を越えて渡せますか?
- データ構造とそのライフタイムを理解します
- このモジュールがほかのモジュールからインポートする型と関数を特定します:
- それらの型が Rust と C のどちらで実装されているかを確認します
- Rust で実装されている場合、関連する Rust クレートを特定します
- C で実装されている場合、先に Rust に移植するべきか、あるいは FFI 経由で Rust から C の実装を呼び出すほうがよいかを検討します
- グローバル状態や Redis モジュールとのやり取りがあるかを確認します
tests/内でこのモジュールに関連するテストを特定します
2. 移植計画を立てる
モジュールの移植手順と判断事項をまとめた $ARGUMENTS_plan.md ファイルを作成します。
この段階で、移植を容易にするために C コードを変更すべきかどうかを判断します。
例:
- このモジュールで定義されているデータ構造の内部フィールドを公開しないように、ゲッターとセッターを導入する
- モジュールをより小さく、扱いやすい部分に分割する
3. Rust クレートを作成する
cd src/redisearch_rs
cargo new $ARGUMENTS --lib
4. 純粋な Rust のロジックを実装する
- 慣用的な Rust コードを作成します
- 包括的なテストを追加します
- すべての C/C++ テストに相当する Rust テストがあることを確認します
- 公開 API をドキュメントコメントで説明します
- パフォーマンスが重要なコードには、
criterionを使ってマイクロベンチマークを作成します - 適切な場合は、プロパティベーステストに
proptestを使用します - テストコードも、本番コードと同じ注意を払って記述します
5. Rust API と C API を比較する
- 新しい Rust モジュールの公開 API を、ヘッダーファイルにある C API と照らし合わせて確認します
- 適切なラッパーやアダプターを追加すれば差異を橋渡しできることを確認します
- 再設計なしでは差異を橋渡しできないことが判明した場合は、手順 1 に戻ります
6. FFI ラッパーを作成する
新しい Rust モジュールを C コードベースに公開する FFI クレートを作成します:
cd src/redisearch_rs/c_entrypoint
cargo new ${ARGUMENTS}_ffi --lib
FFI クレートでは、以下を行う必要があります:
#[unsafe(no_mangle)] pub extern "C" fn関数を公開します- null ポインターとエラーケースを処理します
- C の型と Rust の型を安全に変換します
- すべての unsafe ブロックに
// SAFETY:コメントを付けます
7. C コードを接続する
- C ヘッダーファイルとその実装を削除します
- 古い C ヘッダーが使われていた箇所で、新しい Rust ヘッダーをインポートするように、C コードベースの残りの部分を更新します
Rust FFI クレートの C ヘッダーファイルは自動生成されます。インポートで完全なパスを使う必要はありません。
名前だけを使ってください(例:${ARGUMENTS}_ffi の場合は #include $ARGUMENTS.h;)。
8. 統合をテストする
./build.sh RUN_UNIT_TESTS # C/C++ unit tests
./build.sh RUN_PYTEST # Integration tests
例:適切に移植されたモジュール
高品質な例については、src/redisearch_rs/trie_rs/ を参照してください:
- 包括的なドキュメントを備えた純粋な Rust の実装
- 幅広いテストカバレッジ
c_entrypoint/trie_ffi/にある明確な FFI 境界
コメント
Markdown 対応