22. 外部言語がいぶげんごの追加ついかとrepository分離条件ぶんりじょうけん
1. 目的もくてきと境界きょうかい
NEPL3のfoundationを、個別言語こべつげんごの追加ついかで変更へんこうしないことをアーキテクチャの不変条件ふへんじょうけんとする。これは既存きそんの公開契約こうかいけいやくを使つかう拡張かくちょうについての条件じょうけんであり、共通機能きょうつうきのうの欠陥修正けっかんしゅうせいや、理由りゆうを記録きろくした互換性変更ごかんせいへんこうを永久えいきゅうに禁止きんしするものではない。現時点げんじてんではmonorepoを維持いじする。実際じっさいのrepository作成さくせい、crate公開こうかい、権限変更けんげんへんこうはこの仕様しようだけで実施じっししない。
責務せきむは次つぎの五層ごそうに分わける。
| 層そう | 所有しょゆうするもの |
|---|---|
| Foundation | source、Origin、診断しんだん、schema、値あたい、予算よさん、言語中立げんごちゅうりつの交換境界こうかんきょうかい |
| Language infrastructure | reader、prefix engine、共通きょうつうエディタ機構きこう |
| Domain / Language package | Grammar、Doc、Math、Circuitおよび外部言語がいぶげんごの意味いみ・構文定義こうぶんていぎ |
| Backend / Adapter | HTML・MathML・SVG等とうの出力しゅつりょく、任意にんいのdomain間接続かんせつぞく |
| Composition | suite、CLI、provider host、LSP、Web製品せいひんの構成こうせい |
Foundationとreader/engineのproduction・build依存いぞんからdomain、出力しゅつりょくbackend、apps、toolsへの逆依存ぎゃくいぞんを禁止きんしする。Doc・Math・Circuit core間かんの依存禁止いぞんきんしと、no_std + alloc、hostへのI/O集約しゅうやくを維持いじする。markupはDoc固有こゆうの意味いみを持もたず、複数ふくすうbackendが共有きょうゆうする検査済けんさずみ出力契約しゅつりょくけいやくを所有しょゆうする。
新あたらしい構文こうぶんを既存きそんの意味いみモデルへlowerすることと、新あたらしい意味領域いみりょういきを作つくることを分わける。別べつfrontendやbackendの接続可能性せつぞくかのうせいは、Markdown frontendやPDF backendの実装済じっそうずみ宣言せんげんではない。
2. 拡張単位かくちょうたんい
共通基盤きょうつうきばんへ言語名げんごめいを列挙れっきょするenumや、全言語ぜんげんごへcompile・evaluate・render等とうを強制きょうせいする巨大きょだいtraitを設もうけない。各かくpackageがschemaと必要ひつような操作そうさを所有しょゆうし、hostが明示登録めいじとうろくしたpackage・provider・資源しげんからProfileを解決かいけつする。公式四言語こうしきよんげんごも同おなじ公開契約こうかいけいやくを使つかうreference extensionとし、言語名げんごめいによる特例とくれいをfoundationへ入いれない。操作そうさの意味いみ、能力不足のうりょくぶそく、署名違反しょめいいはん、Invalid、Stopped、Awaitを区別くべつする。任意にんいの未知みちoperationを成功せいこうとして扱あつかわず、要求ようきゅうと登録済とうろくずみschema/signatureを照合しょうごうする。
Rust内ないの型付かたつき直接呼出ちょくせつよびだしと、NDFを使つかうportable provider境界きょうかいを維持いじする。Rustのpointer、allocator、メモリ上じょうのenum配置はいち、trait vtableを外部がいぶABIにしない。optionalなDoc/Math/Circuit連携れんけいはadapterまたはsuiteが接続せつぞくし、構文こうぶんを埋うめ込こんだだけではguestを評価ひょうかしない。
現在げんざいの実じつコードにはLanguagePackage、SchemaRegistry、ParseProfile/RuntimeCatalog、reader providerとtyped adapterがある。これだけから、LanguagePackage/Profileの完全かんぜんな交換こうかん・動的どうてきロードや、Invoke/Resume/Reply/Cancel/Closeを通とおす汎用はんようprocess providerの完成かんせいを推定すいていしない。未実装経路みじっそうけいろはT26の未達範囲みたつはんいとして実装じっそうする。
3. 二ふたつの互換性境界ごかんせいきょうかい
Cargoのpackage versionはRust source APIの互換性ごかんせいを表あらわす。schemaのpackage/revision/digestはportable契約けいやくの識別しきべつに使つかう。Rust APIだけの非互換変更ひごかんへんこうとwire/schemaの非互換変更ひごかんへんこうを別々べつべつに検出けんしゅつする。すべての変更へんこうで両方りょうほうの版はんを上あげる規則きそくにはしない。両方りょうほうへ影響えいきょうする変更へんこうでは両方りょうほうの移行条件いこうじょうけんを記録きろくする。digest不一致ふいっちは同一どういつでないことの検出けんしゅつであり、変更へんこうの互換性ごかんせいや意味いみの正ただしさの証明しょうめいではない。schemaを変かえない挙動きょどうの回帰かいきもconformanceで検査けんさする。
抽出前ちゅうしゅつまえに、固定旧版こていきゅうはんconsumerのcompile試験しけん、変更へんこうしたschema/signatureの拒否試験きょひしけん、互換更新ごかんこうしんの正例せいれいを用意よういする。path依存いぞんや固定こていGit commitでの成功せいこうを、独立どくりつSemVerリリースの互換性検証ごかんせいけんしょうに読よみ替かえない。
4. 段階だんかいと分離ぶんりの判定はんてい
T26はT01〜T05とT12の成果物せいかぶつを使つかう横断的おうだんてきな実装じっそう・受入うけいれタスクとする。T01等とうの個別こべつタスク完了かんりょうをT26完了かんりょうに依存いぞんさせず、foundationの抽出可能性ちゅうしゅつかのうせいと最終さいしゅうT16の条件じょうけんにT26を置おく。Doc移行いこう・HTML・Pagesの先行作業せんこうさぎょうをT26へ依存いぞんさせない。
最初さいしょの実装段階じっそうだんかいでは conformance/extensions/hello/ の独立どくりつCargo workspaceをリポジトリ外がいへコピーし、公開こうかいfoundation APIだけで動うごかす。hello <name> のschema・reader設定せってい・formはconsumerが定義ていぎする。解析結果かいせきけっかの独立どくりつした期待値きたいち、UTF-8 byte位置いち、source revision、Origin、診断しんだん、未知みちhead、NeedMore、停止ていし、不正ふせいNDF拒否きょひを検査けんさする。typed ParseTreeをproduction wireで交換こうかんし、canonicalな意味値いみちの一致いっちを比較ひかくする。これは別べつprocess providerの比較ひかくではない。
python tools/extensions/run.py は固定こていtoolchainとconsumerのCargo.lockを使つかい、外部がいぶworkspaceのmember、foundation依存いぞんの実じつpath、実行前後じっこうぜんごのfoundation内容ないようを検査けんさする。format・Clippy・production API試験しけんを実行じっこうし、source hash、consumer hash、版はん、command、結果けっか、生なまlogを保存ほぞんする。現段階げんだんかいでは依存先いぞんさきのfoundationはmonorepoのpathであり、親おやworkspaceから切きり離はなした配布物はいふぶつのbuildを証明しょうめいしない。
実際じっさいのrepository分離ぶんりには、次つぎの全条件ぜんじょうけんを必要ひつようとする。
foundation四よんcrateだけの配布はいふ・build/test/conformanceが成立せいりつし、親おやmonorepoの生成器せいせいき・domain・私有しゆうfixtureを要求ようきゅうしない。
別べつworkspaceおよび独立どくりつrepositoryにある新言語しんげんごが公開契約こうかいけいやくだけでparse・schema・source/Origin・診断しんだん・providerを提供ていきょうする。追加時ついかじにfoundation sourceを変更へんこうしない。
Rust直接呼出ちょくせつよびだし、NDF loopback、実際じっさいの別べつprocess providerで、意味結果いみけっか・位置いち・診断しんだん・失敗しっぱい・停止ていしが一致いっちする。
schema/package/Profileの交換こうかんと解決かいけつ、署名しょめい/版はん/digest不一致ふいっち、未知みちoperation、資源しげん・取消とりけし・継続けいぞくの境界きょうかいを検証けんしょうする。
Rust APIとportable契約けいやくの互換性検査ごかんせいけんさが別々べつべつに機能きのうする。
正式せいしきcatalogのX01とX02に実行じっこう・独立どくりつレビュー証拠しょうこがある。
条件成立後じょうけんせいりつごの最初さいしょの抽出対象ちゅうしゅつたいしょうをDocとし、その経験けいけんで契約不足けいやくぶそくを確認かくにんする。Circuitは条件じょうけんが整ととのった時点じてんで別べつrepositoryで開始かいしする計画けいかくとするが、条件待じょうけんまちを理由りゆうに既存きそんのCircuit実装目標じっそうもくひょうを放棄ほうきしない。四言語よんげんご、CLI/WASI、provider、エディタ、TEA Playground、Pages、Doc文書移行ぶんしょいこうの最終範囲さいしゅうはんいは維持いじする。