MMLC Runtime 1.0.0
English

MMLF 1.0

文件本身就是程式。

MMLF 是一份具型別的 YAML 或 JSON 文件,它同時是輸入、是程式、也是被稽核的對象。v1.0 凍結了它的表面與計算語意。

穩定性規則

MMLF 1.0 凍結 Runtime 0.9 所實作的文件表面與計算語意。Runtime 1.x 可以新增選用的向後相容欄位。不相容的語意變更必須進到 MMLF 2.0 並提供遷移路徑 —— 它沒有資格從一個 minor release 溜進來。

一份完整的文件

這就是 CI 每次 commit 都會跑的穩定範例。四個根欄位是必要的,其餘全部選用且只增不減。

yaml
format: MMLF
version: "1.0"
ledger_id: mmlf-v1-stable-demo
metadata:
  title: Stable MMLF 1.0 arithmetic demo
  authors: [Neo.K]
  license: Apache-2.0
objects:
  - id: source-three
    type: real
    value: 3
branches:
  - id: add
    source_id: source-three
    base: 3
    operator: add
    operand: 2
    expected_result: 5
  - id: multiply
    source_id: source-three
    base: 3
    operator: multiply
    operand: 2
    expected_result: 6
layout:
  - [add, multiply]
traversals:
  display: [left_to_right, right_to_left]
  execute: dependency_topological
audit_policy:
  local_required: true
  signed_global_cancellation_allowed: false
  numeric_tolerance: 1.0e-12

注意 traversals。顯示順序與執行順序是分開宣告的,因為「由左至右讀一個矩陣」和「依相依關係執行它」是關於同一個物件的兩個不同問題。

也注意 expected_result。文件自己說出它認為答案是什麼 —— 這正是局部稽核之所以可能的原因:Runtime 有一個可以跟它意見不同的對象。

選用區段

每一個都打開一層能力。一份全部省略的文件依然有效,並以「決定性算術+局部稽核」的方式執行。

區段打開什麼
metadata標題、作者、授權、遷移來源
objects分支可以取用的具型別來源
layout矩陣排列
traversals顯示與執行順序,分開宣告
audit_policy什麼算失敗、容忍度多少
evaluation_scenarios對符號值的代入情境
constraints列、欄、區塊與區域條件
fixed_point_groups帶收斂契約的疊代群組
corrections只追加的補帳,絕不就地修改
fdcs反事實干預、不確定性、決策
boundary_events模型邊界上宣告的事件

遷移

0.1 到 0.9 的文件依然載入得進來,也依然照它自己宣告的版本執行。遷移到 1.0 是一個獨立且經過驗證的操作。

bash
mmlc migrate examples/four_operations.yaml \
  --output migrated/four_operations_v1.yaml
  1. 以原始 Schema 驗證來源文件。
  2. 正規化舊語法。
  3. 寫出一份穩定的 MMLF 1.0 文件。
  4. 透過 metadata 保存原本的語意功能輪廓。
  5. 驗證遷移後的文件。
  6. 決定性地執行來源與目標,比對一份與版本無關的快照。

第四步才是關鍵。遷移後的文件會帶著 metadata.migrated_from,Runtime 依那個被記下來的輪廓執行它。

宣告值

migrated_from 是有作用的,不是裝飾。少了它,把一份 v0.5 文件遷到 1.0 表面就會默默啟用那份文件被寫下來時還不存在的執行語意。

在發布驗證中,40 個範例完成遷移、12 個遷移等價案例受檢,失敗數為零。

形狀與語意

跑的是兩種不同的檢查。把它們混為一談,就是一份文件「通過驗證卻什麼都沒表達」的由來。

JSON Schema
驗文件形狀。
Runtime 驗證
另外檢查 ID、版面、參照、運算子定義域、相依環、干預衝突、固定點契約,以及各功能專屬的不變式。

所有 Schema 都隨安裝後的 Python 套件放在 mmlc.schemas 底下,因此不論是 editable 安裝、wheel、source distribution 或一般安裝環境,驗證行為完全一致。

正規化數值

有支援的地方,MMLC 保留精確分數與符號值。輸出序列化使用正規化的帶標記表示,而不是安靜地把一切轉成浮點 —— 這就是「一本可稽核的帳」與「一本大致正確的帳」之間的差別。