Abstract
同じ判定ロジックを複数の言語で動かしたい。 素直にやれば各言語で書き直すことになりますが、実装が二つに分かれた時点から仕様は少しずつずれ始めてしまいます。では、どうすれば一つに保てるのか。これがこのトークのテーマです。
我々は店舗ごとの条件を「式木」として保存し、評価する仕組みを Python で用意していました。 そこへ、同じ判定をブラウザでも動かしたいニーズが発生しましたが、現状は当該式木を使わず JavaScript で実装した独自ロジックで評価しています。 とはいえ、この選択を続ける限り同じ判定は二箇所で育ちます。 数値の比較、真偽値への強制、NULL の扱い… 一つひとつは些細でも別々に育った実装はいつか必ず食い違います。
そこで、判定条件を「言語中立な式木 IR」として定義し直し、評価エンジンを Rust で一度だけ書く方式を取りました。Rust の core を PyO3 で Python 拡張として、wasm-bindgen でブラウザ向け WASM として配布する。実装を一つに寄せることで評価ロジックそのものが分岐する余地を大きく削減できます。
トークの中心は PyO3 です。Python と Rust のあいだで値をどう変換するか、Rust の Result をどう Python の例外へ橋渡しするか、maturin での配布をどうするか。さらに二つの実装が同じ答えを返すか確かめるテスト手法も共有できればと思います。
なお、本トークでは Rust や WebAssembly の予備知識は前提にしません。どこまで Python のままでよくて、どこから Rust + PyO3 に踏み込むのか、その見極めを一緒に考えられたらうれしいです。
About the speaker
Yuki Furukawa
Recustomer 株式会社の Platform Team に所属し、主に認証・認可等の共通モジュール化、デプロイメントの自動化、開発環境の標準化などの抽象基盤の開発に従事しています。