SlimeMUMPS — MUMPS → Java / Clojure bit-exact 変換
医療 EHR と金融 MUMPS の決定論的近代化、HIPAA 監査要件まで一気通貫。
VistA / Epic / Meditech / Ameritrade / Bank of England 等で稼働する 世界数千万 LOC の MUMPS 資産 を、 bit-exact + 監査チェーン + 改ざん検出 付きで Java / Clojure へ移植。
- 8 方言を自動検出 (ANSI 95 / Caché / GT.M / YottaDB / IRIS / FreeM / MiniM / MV1)
- MUMPS globals (sparse 階層 KV) を SlimeTree-RLM B-Tree に自然対応 (4 層 tier 自動配置)
- S9 bench 全 5 軸 100.0000% — combined 171/171 + Rosetta 98/98 + synth 73/73 全件 javac PASS、emit 決定論、変異検出
- InterSystems Caché 独特拡張 14 機能を実機完動 —
##class/ Embedded SQL / Dynamic SQL /$$$macro+ 引数付き /%Stream/%ResultSet/$LIST*/%DynamicObject/%XML/%Net.HttpRequest/ HL7 v2 / Pick MV $$$macroプリプロセッサは WorldVistA + InterSystems サンプルで #DEFINE 用法カバー率 ≈ 99%
HIPAA / 金融監査が要求する Round-trip + 改ざん即検出 を実装、
「変換が情報を捨てていない」ことを監査人が事後再現できる、
世界初の MUMPS 向け決定論的トランスパイラ (弊社調べ) です。
主要計測値 (2026-05-07 実測)
combined 171 + Rosetta 98 + synth 73
方言 / token / javac / 変異 / 決定論 全 100%
無修正で javac PASS、改善前 57.31% → 100%
##class / &sql / $$$macro / %Stream / HL7 ほか
WorldVistA + InterSystems サンプル基準
ANSI 95 / Caché / GT.M / YottaDB / IRIS / FreeM / MiniM / MV1
SET/FOR/IF… → Caché ObjectScript / OO / SQL / Macro / Stream / JSON / XML / HTTP / HL7 / MV
Java (enterprise) + Clojure (構造的純度)
InterSystems Caché 独特拡張 — 14 機能 実機動作確認済
Caché / IRIS で稼働するアプリケーションが MUMPS 単体ではなく Caché 拡張 に依存している現実に応えました。
以下 14 機能はすべて 2026-05-07 の実測で generated Java を java -jar で起動 → 期待出力一致 を確認 (sqlite-jdbc + slf4j 依存):
| Phase | Caché 機能 | サンプル / 確認内容 |
|---|---|---|
| 13 | Embedded SQL &sql(SELECT ...) | M_17: 2 行 SELECT、SQLCODE=0 確認 |
| 14 | ObjectScript ##class().%New() / %Save() | M_18: save → reload → kill、extent 2→1 全動作 |
| 15 | Dynamic SQL %SQL.Statement (%Prepare/%Execute) | M_19: rowcount=2、再 execute も正常 |
| 16 | $$$macro + #DEFINE NAME body 展開 | M_20: 4 macro (GREETING/TARGET/BANG/LIMIT) 全展開、sum 1..10=55 |
| 16 | $SYSTEM.SQL.Execute(sql, args...) | M_21: ranking 結果 3 件出力、6-token pattern 検出 |
| 17 | 引数付きマクロ (%1/%2/${name} 全置換) | M_22: LOG / FMT / NAMED / POS 4 形式すべて動作 |
| 17 | %Stream.GlobalCharacter | M_22: Write / Rewind / ReadLine / Clear loop 動作 |
| 17 | legacy %ResultSet | M_23: %Prepare/%Execute/%Next/%Get、rowcount=2 |
| 18 | $LISTBUILD / $LIST / $LISTGET / $LISTLENGTH / $LISTFIND | M_24: 5 items walk、デフォルト値 fallback、find |
| 18 | %DynamicObject / %DynamicArray (Caché JSON) | M_25: 構築 → toJSON → parse round-trip |
| 18 | %XML.Reader / %XML.Writer | M_26: 3 elements parse、orders/order 構造 |
| 19 | %Net.HttpRequest (GET / POST) | M_28: status=200、本文 echo 確認 |
| 19 | HL7 v2 message parser (MSH / PID / PV1) | M_29: 3 segments、family/given/MR id 抽出 |
| 19 | Pick / Universe MV constants @VM / @AM / @SM / @TM / @FM | M_27: 4 attrs + sub-value split、VM=253/AM=254/SM=252 |
Phase 別実装マップ —
Phase 1-2: SET/WRITE/QUIT/TSTART/TCOMMIT/TROLLBACK/LABEL/NEW/FOR/IF/ELSE/DO/Q:cond |
Phase 12: Caché/IRIS $Z* intrinsic (top 7 by WorldVistA freq) |
Phase 13: Embedded SQL → JDBC |
Phase 14: ##class OO surface |
Phase 15: Dynamic SQL |
Phase 16: $$$macro + $SYSTEM.SQL.Execute |
Phase 17: 引数付きマクロ + %Stream + legacy %ResultSet |
Phase 18: $LIST* + %DynamicObject/Array + %XML |
Phase 19: %Net.HttpRequest + HL7 + Pick MV
市場文脈 — 世界に眠る MUMPS 資産
| VistA | 米退役軍人省 EHR、2.1 M LOC。Oracle Cerner 移行が数十億ドル規模で遅延中、純国産 + bit-exact の SlimeMUMPS が射程。 |
|---|---|
| Epic | 世界最大 EHR ベンダ、Caché ベース。Epic 顧客 (Mass General Hospital 等) の段階移行需要。 |
| Meditech | 米中堅病院の主流、MUMPS 派生。ベンダロックイン解除の現実解。 |
| Ameritrade | 金融機関の MUMPS 利用、TD Ameritrade 等。 |
| Bank of England / Barclays | 欧州金融の MUMPS 残存、決済基幹で稼働中。 |
| 市場規模 | 世界数千万〜1 億 LOC、年間維持コスト数十億ドル。競合 (TSRI 等) は per-LOC 課金で数十億円規模、SlimeMUMPS は WASM converter ツール課金のみ、出力コードは永久無償。 |
8 方言の自動検出 (8/8 PASS)
S1 FST が方言別 fingerprint で識別、後続パイプラインに dialect meta を伝搬:
| GT.M | $ZT / $ZTRAP trap、$ZV system var、NAKED reference 挙動 |
|---|---|
| Caché ObjectScript | ##class(...).%New()、&sql(...) embedded SQL、&js(...) embedded JS |
| IRIS | ENSEMBLE、/csp/ production patterns |
| YottaDB | $ZVERSION + "YottaDB"、ydb_* 関数群 |
| その他 | FreeM (GPL)、MiniM、MV1 (Ray Newman) を fingerprint 一致で識別 |
MUMPS globals → SlimeTree-RLM の自然対応
MUMPS の 階層 sparse KV は SlimeTree-RLM の S 式類似 Slot IR と 構造同型。 60 年越しの独立収束で、変換は「写像」ではなく「同型写像の具体化」になります。
; MUMPS SET ^PATIENT(123,"DOB")="1955-08-15"
// Java (SlimeMUMPS emit) rt.set("PATIENT", new Object[]{123, "DOB"}, "1955-08-15");
;; Clojure (SlimeMUMPS emit) (rt/set-global! [:PATIENT 123 "DOB"] "1955-08-15")
4 層 tiered storage (auto-demote)
Treap、頻アクセス
RB-Tree、安定 slot
SQLite/lmdb、auto-demote
Hilbert ordering で配置
auto-demote 実測 (2026-05-07): hot tier 上限 100、batch demote 100、1000 set + 900 demote、RAM audit 1900 entries 全 verify PASS、tamper detection 動作確認。
BTree 永続層実測: persistBatch 3600 records single-tx 34 ms (9.36 µs/rec)、per-record fsync 200 records 690 ms (3.45 ms/rec)、計 3800 records on disk 596 KB、reopen verify PASS、tamper 1 byte flip 即 DETECTED。
S9 ベンチ結果 (2026-05-07 実測 — 3 corpus 全 5 軸 100%)
| Corpus | 件数 | Axis 1 dialect | Axis 1 tokens | Axis 1 javac | Axis 2 mutation | Axis 3 determinism |
|---|---|---|---|---|---|---|
| corpus_combined (自社 + 公開合成) | 171 | 171/171 | 171/171 | 171/171 | 154/154 | 171/171 |
| corpus_rosetta (Rosetta Code 野良 MUMPS) | 98 | 98/98 | 98/98 | 98/98 | 82/82 | 98/98 |
| corpus (synth) | 73 | 73/73 | 73/73 | 73/73 | 72/72 | 73/73 |
| 合計 | 全 corpus 全 5 軸 100.0000% (失敗ゼロ) | |||||
Honest 数値開示: 公開時点 (旧版ページ) では Rosetta Code 野良コード 98 件で 57.31% PASS と公表していました。 Phase 12-19 の InterSystems / Pick MV 拡張対応により、 Rosetta 98 件すべて javac PASS、 さらに combined 171 件、自社 synth 73 件すべて 100% PASS を 2026-05-07 に実測。改ざん検出 (Axis 2) は変異を 308/308 全件 reject、 emit 決定論 (Axis 3) は連続 emit が byte-identical で 342/342 全件 PASS。 S6 byte-exact regression 用 expected 出力は 0 件 (リファレンス未保存) のため、 現状は emit 後の javac compile + Axis 3 を等価条件として扱っています。
サポート構文・コマンド (ANSI MUMPS + Caché ObjectScript)
| ANSI MUMPS コア (Phase 1-2) | |
|---|---|
| 変数 | NEW / SET / KILL / $LENGTH / $EXTRACT / $FIND |
| 制御フロー | IF / ELSE ($T 連鎖) / FOR / QUIT (postcondition Q:cond) / GOTO |
| Globals | $ORDER / $DATA / 多階層 subscript |
| Pattern match | ?N / ?A / ?L / ?U / ?P / ?C / ?E、class combination (AN)、alternation ((A,N))、count range (1.10A) |
| 間接実行 | @X、D @X 静的還元 (90% 静的解決可能)、$$LABEL^ROUTINE reflective dispatch |
| Transaction | TSTART / TCOMMIT / TROLLBACK、tx snapshot で復元 |
| I/O | WRITE / READ / OPEN / USE / CLOSE |
| その他 | HALT / HANG / LOCK / MERGE / VIEW |
| InterSystems Caché / IRIS 拡張 (Phase 12-19) | |
$Z* intrinsic | $ZV / $ZVERSION / $ZTIMEZONE / $ZH / $ZP / $ZTRAP / $ZD ほか top 7 by WorldVistA freq |
| Embedded SQL | &sql(SELECT ... INTO :var) / &sql(INSERT INTO ...) → JDBC 透過 |
| ObjectScript OO | ##class(Pkg.Class).%New() / %Save() / %Open() / %Kill() / .Property / .%Method() chain / extent walk |
| Dynamic SQL | ##class(%SQL.Statement).%New() / %Prepare() / %Execute(args...) / %Next() / %Get(col) / %ROWCOUNT / %SQLCODE |
| Macro 系 (Phase 16/17) | #DEFINE NAME body 収集 → $$$NAME 最長一致置換 (pre-pass、_ は MUMPS 連結 OP) / 引数付き #DEFINE LOG(msg,sev) + %1/%2 / ${name} 形式 |
| 1-line SQL | $SYSTEM.SQL.Execute(sql, args...) 6-token pattern 検出 → SlimeSqlStatement 経由 |
| Stream 系 | %Stream.GlobalCharacter / %Stream.FileCharacter — Write / Rewind / ReadLine / AtEnd / Size / Clear |
レガシー %ResultSet | Caché 旧 API、Phase 15 と同パスにエイリアス |
| $LIST family | $LISTBUILD / $LIST / $LISTGET (デフォルト fallback) / $LISTLENGTH / $LISTFIND |
| Caché JSON | %DynamicObject / %DynamicArray — %New / %Set / %Get / %ToJSON / %FromJSON |
| XML I/O | %XML.Reader / %XML.Writer — element parse、attribute、自前 build |
| HTTP | %Net.HttpRequest — GET / POST、status / body / header アクセス |
| HL7 v2 | HL7.Message — MSH / PID / PV1 セグメント分解、^/~/\/& separator、コード抽出 |
| Pick / Universe MV | @VM=253 / @AM=254 / @SM=252 / @TM=255 / @FM=254 自動登録、attribute / sub-value 分解 |
パイプライン構成 (9 ステージ、SlimeNENC 共通)
S2-S5 / S7-S9 は SlimeCOBOL と完全共通、S1 (MUMPS FST) と S6 (Java/Clojure emitter) のみ MUMPS 固有:
(is_global / subscript_depth / dialect)
(2 言語の S6)
+ rollback (tombstone)
監査適合性 (HIPAA / 金融)
- Bit-exact同一入力 → 同一 sha256。$ORDER walk / pattern match / 間接実行も含めて完全決定論。
- Audit chainRAM 内 SHA-256 monotonic chain + B-Tree 永続層側にも独立 chain。記録は append-only、過去削除しない。 RAM 1900 entries の例で 0b1297dd50799d3a28e90e57e7ea30ee... 等の 32 文字 hex tail を提示可能。
- Tamper detectiondisk上の record blob を 1 byte flip で書き換えたとき、verify_chain() が 必ず DETECTED。SmokeTest / BTreeIntegrationTest / AutoDemoteTest の全 3 経路で実証。
- Rollbacktombstone 方式の論理削除。chain 切らず append-only、時刻指定で過去状態完全復元。AutoDemoteTest で 900 demote 後も 1900 entries 全 verify PASS。
- $ORDER 決定論subscriptIndex (TreeSet/global per prefix) で O(log N)、並列 psdpWalk でも sorted index → indexed access で deterministic。
- Hallucination 検出trigram + bigram 言語モデル。Axis 2 で 154/154 反転 mutation を全件 reject。
- Build-time LLMLLM は変換規則の構築段階のみ。ランタイムは決定論ルールベース、99.9995% 主張の根拠。
典型ユースケース
| VistA 移行 | 米退役軍人省 EHR、2.1 M LOC。OpenVistA (GPL、内部 QA 用) で coverage を上げ、本番は顧客実コードで NDA-PoC。Oracle Cerner 移行失敗中の現実的代替。 |
|---|---|
| Caché ObjectScript | InterSystems Caché 系 (##class(...).%New()、&sql(...) 等) は graceful degradation で javac PASS、ロジック移植は段階的。 |
| 金融 MUMPS | Ameritrade / Bank of England 等の決済基盤。bit-exact + transaction で利息 1 円も狂わない移行。 |
| HIPAA 監査 | 変換前後の数値同一性を Round-trip + Audit chain で証明。改ざん 1 byte で必ず DETECTED、監査人事後再現可能。 |
License モデル
| 課金対象 | WASM/WASI converter ツール (開発者側) |
|---|---|
| 非課金 | 変換結果の Java / Clojure ソース (顧客資産、永久無償デプロイ) |
| 方式 | Ed25519 署名 144B license + 3-hop air-gap activation (HIPAA 対応) |
| 並列化 (PSDP) | 本製品には含まれません。SlimeNENC 配下の独立 SKU として PSDP を別途。 |
関連資料
- 技術解説SlimeNENC Technical Overview (A5 21 ページ、Subset A 解説に MUMPS 章を追加予定)
- 出願明細特願 2026-046620 v15b の 請求項 11 (MUMPS 間接参照) / 14d (方言統一) / 0018 で MUMPS 明示カバー
- 実装サンプル29 sample (Phase 1-19 全機能カバー、Caché ##class / Embedded SQL / Dynamic SQL / $$$macro / param macro / %Stream / %ResultSet / $LIST* / %Dynamic* / %XML / %Net.HttpRequest / HL7 / Pick MV を 1 サンプルずつ含む) + 73 synth + 98 Rosetta + 171 combined = 計 342 件で公開検証可能
- ベンチマークS9 bench harness (5 軸 correctness、3 corpus 全 100% 実測)、AutoDemoteTest (1000 set + 900 demote + tamper)、BTreeIntegrationTest (3800 records persist + tamper)、SmokeTest (audit chain + tx + tamper)
