更新の核:SlimeJava は「振る舞い不変の証明書」を JDK バージョン対応に。SlimePython は動的構文も決定論的に lift。
SlimeNENC ファミリーのモダン言語側、SlimeJava と SlimePython を一段進めました。いずれも「意味を理解せず、構造を Rust へ射影する」設計はそのままに、bit-exact(同入力で 1 ビット違わぬ出力)を一層 honest に固めています。
SlimeJava — 証明書が JDK バージョンを知る
byte 完全一致を謳うとき、見落とされがちな落とし穴があります。例外メッセージの文面は JDK バージョンで変わるのです。たとえば配列の範囲外アクセスは、JDK 8 では 9(添字だけ)、JDK 11 以降は Index 9 out of bounds for length 3。NullPointerException の説明文は JDK 14/15 で導入され、StringIndexOutOfBounds は JDK 21 でさらに変わりました。
「JDK21 の文面そのまま」と固定してしまうと、JDK 8 で動かした瞬間に byte がズレます。SlimeJava はこれを 版別に正しく再現 し、検証に使った JDK メジャー(8 / 17 / 21)を証明書へ刻印 するようにしました。実機 OpenJDK 8 / 17 / 21 で、同一入力が対象 JDK の文面どおり byte 完全一致することを確認済みです。
「byte-diff 0」は無条件の主張ではなく、版スコープ付きの正直な保証 になりました。
SlimePython — 動的構文も、黙って訳さず lift する
Python の動的さ(getattr、属性フック、関数差し替え)は、素朴に Rust 化すると挙動がズレます。SlimePython は bit-exact に落とせる動的パターンだけを条件付きで静的化(lift) し、落とせないものは黙って訳さず明示的に reject します。
今回拡張した範囲:
- 属性ディスパッチ —
getattrの有限列挙(==チェーン /in (...)タプル)、selfや__init__依存も per-key メソッド化して lift - 関数差し替え — 引数つき関数の rebind、
time/random/uuidを決定論版へ置き換える blessed patch - 健全性 — 単一 Rust 型に落とせない型衝突(call-site 間で int と str が混在 等)は静的検出して reject。原関数(非決定)を観測するラッパも reject
すべて Python = native Rust = WASI Rust の三者で SHA-256 一致 することを実機検証しています。
なぜ「reject する」ことが価値なのか
bit-exact を本気で追うと、「訳せないものを正直に訳さない」ことが品質そのものになります。確率的に「だいたい合う」コードを吐くのではなく、1 ビット違わぬと証明できる範囲を明示し、できない所は境界として可視化する。SlimeNENC ファミリー共通の「机を honest にする」姿勢です。
詳細な検証データは各製品ページ(SlimeJava / SlimePython)とリソース・PoC deep-dive へどうぞ。
