[Show HN] Hsrs:Rust 向け类型安全な Haskell バインディング生成ツール
## Japanese Translation:
**hsrs** クレイトは、手動の FFI グループコードの必要性を排除し、Haskell から Rust への安全で型安全な呼び出しを、自動的に生成されるバインディングを通じて可能にします。特定の Rust アノテーション——`#[hsrs::module]`, `#[hsrs::function]`, `#[hsrs::data_type]`, `#[hsrs::value_type]`, および `#[hsrs::enumeration]`——を使用することで、開発者はコードジェネレーター(`cargo install hsrs-codegen` を介してインストール)をトリガーし、慣用的な Haskellラッパーを生成します。システムは不透明型には`ForeignPtr`を使用してメモリ管理を透明に行い、FFI 境界を越える構文、コレクション、および_enum_については **Borsh** シリアライゼーションプロトコルを活用します。標準的な Rust タイプ(`Result<T, E>` は `Either` へ、`Option<T>` は `Maybe` へ、`Vec<T>` は `[T]` へ)は自動的により安全な Haskell 同等物に変換され、Haskell 側で追加の依存関係なしにシリアライゼーションを担当するのは Borsh です(これは `build-depends: hsrs >= 0.1 && < 0.2` を必要とします)。このアーキテクチャは x86_64 および aarch64 などの 64 ビットプラットフォームでは堅牢ですが、32 ビットシステムでは注意が必要です。32 ビットシステムでは基本データサイズのマップが `Word64`/`Int64` となり、結果として截断(truncation)を招く可能性があります。セットアップには、`Cargo.toml` にクレイトを追加し、`crate-type` を `["lib", "staticlib"]` に設定する、および Haskell で生成されたバインディングを取り込むことが含まれます。得られるエコシステムは、Rust のパフォーマンスと Haskell の安全性を組み合わせ、MIT OR Apache-2.0 ライセンスの下で、複雑なデータ構造の取り扱いとエラーハンドリングに特化した統合エコシステムを提供します。
**概要:**
**hsrs** クレイトは、自動的に生成されたバインディングを使用して Haskell から直接 Rust への安全な呼び出しを可能にし、クロスラングージープログラミングを革新します。その最も重要な利点は、メモリ管理やデータシリアライゼーションといった複雑な技術的課題を透明に処理し、開発者を誤り易い手動のグルーコードの記述から解放することです。システムは `#[hsrs::module]` などの特定の Rust アノテーションを通じてこの機能を達成し、これによりコードジェネレーターが慣用的な Haskell ラッパーを作成します。重要な点は、**Borsh** プロトコル——シリアライゼーションの標準規格——を利用して構造体やコレクションが境界を跨ぐ方法を管理しており、明示的なメモリ処理なしでデータの整合性を確保することです。`Result` などの標準的な Rust タイプは自動的にそのより安全な Haskell 同等物(例:`Either`)に変換され、全体を通して型安全性を維持します。このアプローチは x86_64 および aarch64 などの 64 ビットアーキテクチャでシームレスに動作します。始めるには、開発者は単に**hsrs-codegen**ツールをインストールして、アノテーションされた Rust ファイルからバインディングを生成すればよいです。最終的に、このクレイトは企業の開発者が効率性の高い Rust と堅牢な Haskell を組み合わせてハイパフォーマンスなアプリケーションを構築することを可能にし、安全性を犠牲にすることなく低レベルの FFI 専門知識を深めることなく、複雑なデータ構造とエラーハンドリングのための統合エコシステムを創造します。
**主要ポイント一覧:**
- **タイトル**: `hsrs` クレイトを使用して、型安全で自動的に生成された FFI バインディングを通じて Haskell から Rust を呼び出します。
- **コア機能**: Rust のタイプと関数をアノテーションし、コードジェネレーターを実行して慣用的な Haskell を入手し、メモリ管理(`ForeignPtr` 経由)、シリアライゼーション(`Borsh` 経由)、および型変換を処理します。
- **クイックスタート ステップ 1**: `#[hsrs::module]`, `#[hsrs::value_type]`, `#[hsrs::data_type]`, `#[hsrs::enumeration]`, および `#[hsrs::function]` などの属性を使用して Rust コードをアノテーションします。
- **クイックスタート ステップ 2**: ツールをインストール (`cargo install hsrs-codegen`) し、`hsrs-codegen src/lib.rs -o Bindings.hs` を実行して Haskell バインディングを生成します。
- **クイックスタート ステップ 3**: 生成されたバインディング(`import Bindings`)を取り込んで Haskell で Rust 関数を使用し、メモリは自動的に管理され、タイプは Borsh を介してシリアライゼーションされます。
- **Rust 側のセットアップ**: `hsrs = "0.1"` を依存関係として追加し、`crate-type` を `["lib", "staticlib"]` に設定します。
- **Haskell 側のセットアップ**: `build-depends: hsrs >= 0.1 && < 0.2` でランタイムパッケージを追加し、これは Borsh シリアライゼーションを自動的に引き寄せ、追加の依存関係なしに処理します。
- **アノテーションテーブルマッピング:**
- `#[hsrs::data_type]`: ポインタ経由で渡される不透明な構造体を `ForeignPtr` 新規タイプとして生成し、自動クリーンアップ機能を備えます。
- `#[hsrs::enumeration]`: C と互換のある_enum_(repr(u8))を `Word8` 新規タイプとして生成し、パターン同義語を備えます。
- `#[hsrs::value_type]`: Borsh を介して値として構造体を渡り、`data record` および Borsh デリブリングの結果となります。
- `#[hsrs::function]`: FFI 上でメソッドをエクスポートし、型安全な Haskell ラッパーを作成します。
- `#[hsrs::module]`: データタイプとそのメソッドをグループ化し、型のすべての FFI グループコードを生成します。
- **型変換の詳細:** `Result<T, E>` は `Either E T` へ、`Option<T>` は `Maybe T` へ、`Vec<T>` は `[T]` へ、`String` は `Text` へ変換され、すべて Borsh を介して透明にシリアライゼーションされます。
- **サポートされているタイプテーブル:**
- 基本型(`i8` から `u64`, `bool`, `usize`/`isize`)はダイレクト(C FFI)転送を通じて Haskell 同等物に対応します。
- Enum, 構造体、文字列、およびコレクション(`Vec`, `Option`, `Result`)については、境界を跨るシリアライゼーションに Borsh を利用します。
- **プラットフォーム注記:** `usize` および `isize` はそれぞれ `Word64` および `Int64` に対応し、64 ビットプラットフォーム(x86_64, aarch64)に一致します;32 ビットプラットフォームでは値の截断が発生する可能性があります。
- **完全な例:** Enum, 値タイプ、`Result`, および `Option` の使用をデモンストレーションする小さな VM (`quecto_vm`) が提供されており、生成された Haskell バインディングは `new :: IO QuectoVm` および `Either VmError Int64` を返す `safeDiv` などの符号を示しています。
- **ライセンス**: MIT OR Apache-2.0。