Reader locales
Reader locale#
讀者語系是 Faber 用來以讀者的人類語言呈現原始碼、編譯器診斷與語言關鍵字的系統,不會分叉語意。泰語程式設計師可以使用泰語讀寫 Faber 原始碼、接收泰語編譯器錯誤,並透過與拉丁文或中文使用者相同的 HIR 協作。將程式碼從拉丁文在地化為泰語的機制,與將程式碼輸出為 Rust 的機制相同:HIR → surface,兩者都不具特權。
問題#
大型語言模型已將程式設計周遭的對話在地化——泰國電腦科學家可以用泰語向 LLM 尋求協助——但持久存在的成品仍未被在地化。產生的程式碼、API、編譯器錯誤與文件仍然以英文為形狀。英文能力因此成為進入電腦科學的門檻,而不只是對話的門檻。
讀者語系是對此問題的設計回應:人類用來理解 Faber 的語言——原始碼、診斷,以及可選的標準函式庫拼寫——不以英文為前提。它不是應用程式國際化(完整的字串矩陣涵蓋),而是讀者方言支援:可選用、部分涵蓋的套件,建立在不分叉的語意核心之上。
產品論點: 英文不應成為審查軟體意圖時的必要語言。LLM 已將程式設計周遭的對話在地化;讀者語系則將持久存在的成品在地化。
運作方式#
讀者語系套件會將 Faber 關鍵字、原始型別拼寫與診斷範本對映到目標語言。套件是包含三個表格的 TOML 檔案:
[keywords]— 將關鍵字名稱對映為其在地化拼寫[types]— 將原始型別名稱對映為其在地化拼寫[diagnostics.*]— 將診斷碼對映為在地化訊息範本[llm]— 用於 LLM 產生程式碼的系統提示片段與範例
編譯器會根據產生的拉丁文基準檢查套件——每個關鍵字與型別都必須有定義的拼寫,或明確繼承自拉丁文。缺少的列會產生可見的回退,而不是靜默遺漏。
在命令列或 faber.toml 中選取語系:
faber check --reader-locale th-TH program.fab# faber.toml
[reader]
locale = "zh-Hans"哪些內容會在地化,哪些不會#
| 層級 | 位於 HIR 中? | 行為 |
|---|---|---|
| 關鍵字、型別、成對片語 | 是 | 在所有呈現形式之間無損轉換 |
符號 ← → ∴ ≡ ∪ ⇥ | 是(不變) | 在每種呈現形式中都相同 |
| 型別優先結構 | 是 | 在每種呈現形式中都相同 |
| 數字 | — | 所有語系一律只接受 ASCII |
| 註解 | 否 | 不在編譯器範圍內;由 LLM 媒介處理,可選用 |
| 識別碼名稱 | 否 | 逐位元組保留 |
| 標準函式庫拼寫 | 否 | 每個語系各自覆寫 |
關鍵的架構保證是:任何語系表面形式都可以隨時轉換為其他形式,包括拉丁文。已在地化的 Faber 檔案永遠不是陷阱,因為程式碼永遠不只存在一種形式。faber format --canonical 與 faber format --reader-locale=la 完全相同。
已提供的套件#
Radix 目前隨附七個套件:
| 代碼 | 語言 | 文字系統 | 狀態 |
|---|---|---|---|
la | 拉丁文 | 拉丁字母 | 規範形式 |
th-TH | 泰語 | 泰文 | 參考驗證 |
zh-Hans | 簡體中文 | 簡化漢字 | 覆蓋驗證 |
zh-Hant | 繁體中文 | 繁體漢字 | 覆蓋驗證 |
ar | 阿拉伯文 | 阿拉伯字母 | 覆蓋驗證 |
hi | 印地語 | 天城文 | 覆蓋驗證 |
vi | 越南語 | 越南文(拉丁字母) | 覆蓋驗證 |
五個參考語系是依據集體架構壓力選定的——它們共同迫使基礎層處理所有必須承受的 Unicode 與輸出問題。四個語系使用非拉丁文字;越南語則是拉丁文字控制案例:
| 語系 | 取用程度 | 架構壓力 |
|---|---|---|
th-TH | 高 | 無空格文字——分詞器壓力測試 |
zh-Hans / zh-Hant | 非常高 | 成對關鍵字;同級套件繼承;NFKC 寬度折疊 |
ar | 高 | 由右至左;診斷中的雙向隔離 |
hi | 非常高 | 母音符號/隱形母音叢集;印度文字數字 |
vi | 高 | 拉丁文字上的大量附加符號;NFKC 邊界案例 |
參考集合是為架構覆蓋率而選定,而不是依人口選定。單靠人口無法證明基礎層尚未處理的任何事項。
在地化原始碼範例#
六個非規範語系各自在 examples/reader-locale/ 下提供完整的 Faber 套件,包含在地化原始碼、診斷測試案例與 faber.toml 清單。同一個 greet 程式會在所有已提供的語系中呈現:
拉丁文 la — 規範形式
函式 salve(文字 nomen) → 文字 {
定值 文字 msg ← "Salve, §!"(nomen)
傳回 msg
}
入口 {
定值 文字 m ← salve("munde")
註記 m
}規範呈現形式。faber format --canonical 與 faber format --reader-locale=la 完全相同。拉丁文關鍵字對映到自身;型別名稱使用規範拼寫。
泰語 th-TH — 參考驗證
ฟังก์ชัน salve(ข้อความ nomen) → ข้อความ {
ค่าคงที่ ข้อความ msg ← "Salve, §!"(nomen)
คืนค่า msg
}
เริ่มต้น {
ค่าคงที่ ข้อความ m ← salve("มุนเด")
แจ้ง m
}存取楔形驗證。泰語是無空格文字——詞語之間沒有空格邊界——因此成為分詞器壓力測試,也是讀者語系系統最初的架構驅動因素。詞法分析器必須僅透過關鍵字比對來解析每個 token 邊界。
簡體中文 zh-Hans
函数 问候(文本 名字) → 文本 {
常量 文本 问候语 ← "你好,§!"(名字)
返回 问候语
}
入口 {
常量 文本 消息 ← 问候("世界")
显示 消息
}成對關鍵字(如果/否則 對應 si/secus),需要套件關鍵字群組;全形/半形標點;在詞法進入點進行 NFKC 寬度折疊。由於 CJK 分詞器的邊界問題,這是最困難的 LLM 輸出案例。繁體中文(zh-Hant)的同級套件會繼承並覆寫 zh-Hans 的詞根。
阿拉伯文 ar
دالة salve(نص nomen) → نص {
ثابت نص msg ← "مرحبا، §!"(nomen)
أعد msg
}
بداية {
ثابت نص m ← salve("عالم")
اعرض m
}由右至左的文字嵌入邏輯順序的由左至右程式碼區塊中。編譯器的 HTML 診斷輸出會以 <bdi> 包覆關鍵字,進行雙向隔離,以防止 RFO(右側跟隨左側)扭曲。原始來源以邏輯順序使用阿拉伯文字;顯示層負責雙向文字呈現。
印地語 hi
फलन salve(पाठ nomen) → पाठ {
स्थिर पाठ msg ← "Salve, §!"(nomen)
लौटा msg
}
आरंभ {
स्थिर पाठ m ← salve("जगत")
दिखा m
}使用母音符號/隱形母音子音叢集的天城文字。這證明了更廣泛印度文字家族的路徑——孟加拉文、泰米爾文與泰盧固文都繼承相同的字形塑造基礎設施——但各自的套件編寫仍是獨立工作。印度文字數字符號(०-९)不接受於數字常值中;所有語系都保留 ASCII 數字。
越南語 vi
hàm chào(vănbản tên) → vănbản {
hằng vănbản lời_chào ← "Xin chào, §!"(tên)
trả lời_chào
}
bắtđầu {
hằng vănbản thông_điệp ← chào("thế giới")
in thông_điệp
}控制案例:使用拉丁文字但不是英文。大量附加符號(ế、ệ、ả)會對詞法分析器中的 NFKC 邊界案例施加壓力。這可避免建立只在特殊文字系統上運作、卻未經拉丁附加符號驗證的架構。識別碼使用越南語詞彙(chào、tên、lời_chào、thông_điệp),並由編譯器逐位元組保留。
符號(
← → ∴ ≡ ∪ ⇥)、 結構位置與識別碼名稱在上述六種呈現形式中都完全相同。只有關鍵字與型別名稱會改變。HIR 正是同一個程式——編譯器將六者視為等價。將 Faber 呈現為泰語,與呈現為 Rust 是相同的編譯器操作:HIR → surface,兩者都不具特權。
在地化診斷#
診斷首先是結構化事實,其次才是散文。每個診斷都包含穩定的代碼(LEX###、PARSE###、SEM###、WARN###)與具名引數;套件負責擁有呈現後的範本文字。這表示診斷呈現器可以在不變更診斷基礎設施的情況下,以任何語系輸出訊息。
讀者語系範例套件包含診斷測試案例——型別不相容、未定義變數、非 ASCII 數字——以證明整條流程都具備語系感知能力:
examples/reader-locale/vi/src/type-mismatch.fabexamples/reader-locale/vi/src/undefined-variable.fabexamples/reader-locale/vi/src/non-ascii-number.fabexamples/reader-locale/vi/src/keyword-suggestion.fabexamples/reader-locale/vi/src/keyword-edit-distance.fab
系統內建雙向隔離:邏輯順序的由左至右程式碼區塊中的阿拉伯文關鍵字,會在 HTML 輸出中包覆於 <bdi> 元素內,以防止 RFO(右側跟隨左側)扭曲,否則由右至左文字執行序會難以閱讀。
狀態#
| 層級 | 狀態 |
|---|---|
| 套件結構描述、別名、繼承、驗證、診斷、LLM 成品 | 已提供 |
| 套件感知詞法分析、型別解析、清單/CLI 選取、可見回退 | 已提供 |
套件擁有的診斷呈現、faber explain、雙向隔離顯示 | 已提供 |
| 規範 Faber 格式化 | 已提供 |
在地化 Faber 重新輸出(format --reader-locale) | 部分完成 |
| 標準函式庫術語覆寫、可測量的 LLM 輸出正確度、完整語系覆蓋 | 延後 |
| 多語言文件產生 | 提議中 |
基礎層的先決條件——在詞法進入點進行 NFKC 正規化——已經完成。關鍵字表、診斷具名引數、呈現器與套件交付都已提供。北極星層級(在地化重新輸出、標準函式庫術語、LLM 輸出基準測試、產生多語言文件)仍明確處於部分完成或延後狀態。
參考資料#
radix/docs/design/reader-locale.md— 完整設計文件(69 KB)examples/reader-locale/— 6 個包含在地化原始碼的語系套件stdlib/reader/*/pack.toml— 7 個已安裝的套件定義radix/crates/radix/src/reader_locale.rs— 執行階段實作radix/docs/design/faber-canonical-surface.md— 規範模式與faber formatradix/docs/factory/lex-nfkc-normalization/— NFKC 先決條件交付
Reader-locale packages#
每個非拉丁字母讀者地區都在
examples/reader-locale/ 下擁有完整的 Faber 套件,其中包含在地化原始碼、診斷測試案例,以及 faber.toml manifest。
可用套件#
| 地區 | 路徑 | 原始碼範例 |
|---|---|---|
| th-TH | examples/reader-locale/th-TH/ | ฟังก์ชัน salve(ข้อความ nomen) → ข้อความ |
| zh-Hans | examples/reader-locale/zh-Hans/ | 函数 问候(文本 名字) → 文本 |
| zh-Hant | examples/reader-locale/zh-Hant/ | 函式 問候(文字 名字) → 文字 |
| ar | examples/reader-locale/ar/ | دالة تحية(نص اسم) → نص |
| hi | examples/reader-locale/hi/ | फलन नमस्कार(पाठ नाम) → पाठ |
| vi | examples/reader-locale/vi/ | hàm chào(vănbản tên) → vănbản |
診斷測試案例#
每個套件都包含測試案例,用來證明完整的編譯器管線具備地區感知能力:
type-mismatch.fab— 在地化的型別錯誤診斷undefined-variable.fab— 在地化的名稱解析錯誤non-ascii-number.fab— NFKC 處理keyword-suggestion.fab— 在地化的「你是不是要找?」提示