13. 再現性さいげんせい・schema識別しきべつ契約けいやく判定はんてい

方針ほうしん

共有きょうゆうする意味いみ実装固有じっそうこゆうのアルゴリズムをける。digestの自己参照じこさんしょう言語同士げんごどうし相互埋そうごうみによるhash循環じゅんかん、sourceじゅん識別子順しきべつしじゅん混同こんどうける。

1. digest

Bytes32のdigest関数かんすうはSHA-256に固定こていする。sourceとresourceのcontent digestはもとのbyteれつにそのまま適用てきようする。BOM、改行かいぎょう空白くうはく内容ないよう一部いちぶであり、Unicode正規化せいきかおこなわない。SourceContentのURIはhostがける論理的ろんりてき絶対ぜったいlocatorであり、SourceRefの同一性どういつせいとはべつ保持ほじする。coreはOS path canonicalizationをしない。

このlocatorの字句じくprofileはASCIIのscheme [A-Za-z][A-Za-z0-9+.-]*:からでない後続文字列こうぞくもじれつである。control・escapeの空白くうはく拒否きょひし、% は2けたのASCII hexがつづ場合ばあいだけゆるす。scheme以降いこうのUnicode文字もじ正規化せいきかしない。相対そうたいpath・空文字くうもじをabsolute locatorとしてけない。これはhost内部ないぶlocatorの境界きょうかいであり、HTTPのauthorityなどscheme固有こゆう妥当性だとうせい到達可能性とうたつかのうせい保証ほしょうしない。外部がいぶURLとして使用しようするadapterはその用途ようとのURI/IRI検査けんさおこなう。schemeの根拠こんきょRFC 3986 §3.1、Unicodeをふく識別子しきべつしとURIの区別くべつRFC 3987

SchemaRef.digestは、schemaの正規せいきdescriptorを対象たいしょうとする。正規せいきdescriptorはpackageめい、revision、kind/variant/field定義ていぎ意味上いみじょうのoperation署名しょめい局所制約識別きょくしょせいやくしきべつふくみ、source位置いち、documentation、cache、生成時刻せいせいじこくふくまない。自己参照じこさんしょうとforeign schemaは(package, revision, typeName)の記号的参照きごうてきさんしょうとし、このdescriptorない相互そうごのdigestを再帰的さいきてきまない。実際じっさい使用しようするforeign digestはProfileの解決済かいけつず一覧いちらん固定こていして検査けんさする。これによりDocとMathがたがいのかた参照さんしょうしてもhashの固定点こていてん計算けいさんする必要ひつようはない。

かたのconstraintsは実行順じっこうじゅんではなく、名前なまえ識別しきべつする局所制約きょくしょせいやく集合しゅうごうである。から重複ちょうふく識別子しきべつし拒否きょひし、canonical descriptorへ変換へんかんするときにUnicode scalarじゅんのarrayへならべる。fieldやordered-choiceの意味順いみじゅんつarrayとは区別くべつする。

descriptorの正規化せいきかデータはNull/Bool/非負ひふInteger/Text/Array/Objectだけを使つかう。JSONをdigest入力にゅうりょくとして使つか場合ばあい、object keyをUnicode scalarじゅんにsortし、arrayじゅん維持いじし、空白くうはくなし、UTF-8、引用符いんようふとbackslashをescapeし、U+0000..001Fは小文字こもじhexの\u00xxでescapeし、それ以外いがいのscalarは直接ちょくせつUTF-8とする。整数せいすう先頭せんとうzeroなし。float、負数ふすう、surrogate、重複ちょうふくkeyは禁止きんしhash入力にゅうりょくはASCII NEPL3-SCHEMA-1 + 1byte zero + このcanonical JSON。

Grammar packageの意味いみdigestはschema digestと、source位置いちのぞいたreader/binding/style/shape/provider要件ようけん正規せいきdescriptorにたいして、おな規則きそくでdomain separatorを NEPL3-PACKAGE-1 として計算けいさんする。局所きょくしょkind IDはkindめいのscalarじゅんてる。field・宣言せんげん・ordered-choiceの意味上いみじょう順序じゅんじょはarrayとして保存ほぞんする。名前なまえ識別しきべつするsum/union/variantsのmapじゅんには意味いみがなく、canonical JSONのkey sortで一致いっちさせる。variant payloadのfieldじゅんはarrayとして保存ほぞんする。fieldの順序交換じゅんじょこうかんはdigestをえ、variant mapのkeyじゅんだけの交換こうかんえない。seedとcompileのpackageは意味いみdigestを比較ひかくし、provenanceのちがいを意味不一致いみふいっちとしない。source artifactのdigestはべつ記録きろくする。

wireの操作要求そうさようきゅうは、解決済かいけつずみProfileのぜんSchemaRefとprovider revisionをふくめてcache keyをつくる。URIやsnapshot所属しょぞくのぞいてよいのは明示的めいじてき意味値いみちだけのcacheであり、診断しんだん/editor結果けっかのcacheにはsource identityとrevisionが必要ひつよう

Package意味正規形いみせいきけい

実装じっそうCheckedLanguagePackage::semantic_jsonはcategories、extensions、forms、leaves、modes、namespaces、payloadSchemas、reader、recovery、root、schemaのkeyをつcanonical JSONをかえす。Category/Mode/Namespace/Extensionは名前順なまえじゅん、Formはcategoryとspellingじゅん、Leafはcategoryとcanonical token-kind IDじゅん、payloadSchemasはpackage/revision/digestじゅんならべる。重複ちょうふくするpayload SchemaRefは拒否きょひする。かくレコードのpayload fieldじゅんinterfaces/engine.json対応型たいおうがたしたがう。ただしread/binding参照さんしょう下記かきしき展開てんかいし、provenanceとarenaそのものはふくめない。styleにはschema/nameにくわえてfallback roleもふくめる。

readとbindingのしきはvariantめい先頭せんとうとするarrayで、variantのpayloadはnative公開型こうかいがたのfieldじゅんとする。ListOfは["ListOf",cons,nil,element]、Builtinは["Builtin",reader,kind,tokenKind]とする。kindは[SchemaRef,localKind]、operationは[SchemaRef,name]、styleは[selector,SchemaRef,name,fallback]である。modeは[name,skipReaders,takePairs]、formは[category,spelling,kind,fields,binding,styles]、leafは[category,kind,tokenKind,payloadType,binding,styles]とする。field、skip/take、choice/seq、bindingの、styleの各列かくれつ意味順いみじゅん保存ほぞんする。

readerは全名前付ぜんなまえつきruleを名前順なまえじゅんにたどり、直接ちょくせつDAGの共有きょうゆう出現しゅつげんごとに展開てんかいしたpostorder arenaへ置換ちかんしたうえで、ReaderPlanの既存きそんcanonical descriptor形式けいしき使つかう。ruleめいでのRefは展開てんかいしない。名前付なまえつきruleは未使用みしようでも公開宣言こうかいせんげんとしてのこす。匿名とくめい未到達みとうたつarena entryは意味正規形いみせいきけいふくめないが、package検査けんさはその不正参照ふせいさんしょう・cycleも拒否きょひする。ReadSpec/Bindingも使用元しようもとから展開てんかいし、匿名とくめいentryの共有きょうゆう配置はいち未到達収納みとうたつしゅうのうのぞく。巨大きょだい展開てんかい共通予算きょうつうよさんでStoppedをかえし、recursive stackに依存いぞんしない。

この正規形せいきけい実行上じっこうじょう任意にんい等価性とうかせい証明しょうめいするものではない。たとえばことなるreaderしきへの代数的書換だいすうてきかきかえを同一視どういつししない。providerの要求署名ようきゅうしょめいはpackageへふくめるが、hostの実装じっそうartifact identityは下記かき解析かいせきProfileへふくめる。packageの出自しゅつじつeditor結果けっかはこの意味いみdigestだけでcacheしない。

recoveryは [defaultUnexpected,rules] とし、ruleはcategoryじゅん[category,unexpected,synchronization]同期列どうきれつ宣言順せんげんじゅん[ancestorCategory,kind,spellingOrNull] とする。回復方針かいふくほうしん実行挙動じっこうきょどうであり、順序じゅんじょやstrategyの変更へんこう意味いみidentityへ反映はんえいする。

具体実行ぐたいじっこうidentity

継続けいぞくのarena indexと出自しゅつじ参照先さんしょうさき固定こていするため、packageは意味いみidentityとはべつにexecutionDigestをつ。hashは NEPL3-PACKAGE-EXECUTION-1 + zero byte + 具体実行ぐたいじっこうcanonical JSON とする。意味正規形いみせいきけいくわえ、もとのReaderPlan descriptor、ReadSpec/Bindingのぜんarenaと直接参照ちょくせつさんしょうID、form/leafとう宣言配置せんげんはいち宣言せんげんのOrigin参照さんしょうぜんprovenance source identity/URI、Origin/sourceMap tableをふくめる。sourceのbytesは検査済けんさずみsnapshot digestで固定こていする。意味上等いみじょうひとしいarena再配置さいはいちやgrammar source位置いちだけの変更へんこうでも、ふるいframeや診断しんだんoriginを再利用さいりようしない。

EntryContextはpackage意味いみidentityにくわえてProfileないのaliasを保持ほじする。おなじpackageをことなるcategory-mode overrideで複数登録ふくすうとうろくできるため、packageから最初さいしょのaliasを逆引ぎゃくびきしてはならない。NodeSelectionのform/leaf/read/binding indexはそのaliasがすexecutionDigestのじつtableにぞくする。再開さいかいおよび後段こうだんでの利用時りようじ具体ぐたいdigestを照合しょうごうし、意味いみdigestが一致いっちする別配置べつはいち勝手かってえない。

2. nativeとwire

型名中かためいちゅうのU64/Bytes32とう有限ゆうげんprimitiveと、任意精度にんいせいどNatural/Integerを区別くべつする。wire sourceはopaque SourceId/revision/digestを使つかう。おなじIDをbundleない操作間そうさかん対応たいおうづけに使用しようし、URIやnative allocation addressへえない。おなじURI/revision/byteれつ独立文書どくりつぶんしょもSourceIdがことなればべつsnapshotである。r3のURI-based bijectionは、この場合ばあいにspec02の宣言同一性せんげんどういつせいうしなうためr4で訂正ていせいした。

native node indexはallocationごとのIDでもよい。wire bundleではrootからfieldじゅん訪問ほうもんした最初さいしょ出現順しゅつげんじゅん連番れんばんにする。shared nodeは二回目以降にかいめいこうreferenceを使つかう。source tableはSourceIdのUnicode scalarじゅん、revisionの数値順すうちじゅん、digestのbyteじゅんとし、schema tableはpackage/revision/digestじゅんOriginの親参照おやさんしょうはDAGを検査けんさし、payload nodeとorigin nodeのID空間くうかんける。SourceIdはこのnode index再採番さいさいばん対象たいしょうにしない。

NodeRefの訪問ほうもんはdepth-firstで、Childをその位置いち、Childrenをれつじゅんにたどる。rootは0となり、ぜんNodeRefをえる。ForeignSyntaxはguest bundleで独立どくりつして再採番さいさいばんし、ForeignSyntax.rootもguestの0へ対応たいおうさせる。wire bundleは単一たんいつrootの到達閉包とうたつへいほうあらわすため、到達不能とうたつふのうnodeはUnreachableNodeで拒否きょひし、だまって破棄はきしない。native arenaの未使用みしようslotはゆるせるが、出力対象しゅつりょくたいしょうbundleへふくめない。Missing/Unexpected/Unparsedとう回復構文かいふくこうぶんもrootから参照さんしょうして保持ほじする。

TokenRef、TokenないのViewRef、OriginRef、EnvironmentEntry.idはそれぞれの所有しょゆうtableで宣言せんげんされたslotをし、このNodeRef再採番さいさいばん対象たいしょうではない。これらのtableとbinding/resource/role/relation/triviaの列順れつじゅんあたい一部いちぶとして保存ほぞんする。生成側せいせいがわはsourceじゅんまたは明示めいじした生成順せいせいじゅんでtableをつくり、allocation address・hash map列挙順れっきょじゅん宣言順せんげんじゅん使つかわない。したがって、node arenaだけをならえたおなあたいはwire byte一致いっち要求ようきゅうするが、べつtableの宣言順せんげんじゅんまでことなるgraphの同型性どうけいせいをこの規則きそくだけで証明しょうめいしたとはあつかわない。

ParseTreeのcontexts/recoveryもおな所有しょゆうbundleのNodeRef対応表たいおうひょう変換へんかんする。ForeignStep.nodeはそのstepをたどる直前ちょくぜんのbundle、NodeSelection.nodeとRecoveryEntry.nodeはpathの終点しゅうてんbundleにぞくする。contextsはhostを先頭せんとうとし、かくbundleない正準せいじゅんnodeじゅん・fieldじゅん出会であうforeign bundleをdepth-firstでたどったじゅんく。かくcontextのselectionsは正準せいじゅんnodeじゅんとする。recoveryはおなじbundleじゅん部分列ぶぶんれつで、かくentriesは正準せいじゅんnodeじゅんとする。受信側じゅしんがわはこの順序じゅんじょ参照先さんしょうさき意味検査いみけんさ両方行りょうほうおこない、ふるいwrapper番号ばんごうだけをのこしたあたい拒否きょひする。packageのform/leaf/read/binding index、executionDigest、FactSetのopaque IDは構文こうぶんnode再採番さいさいばん対象たいしょうではない。

coreのNodeMappingは所有しょゆうbundleの参照範囲さんしょうはんい到達閉包とうたつへいほう正準番号せいじゅんばんごう対応たいおう計算けいさんする。これは単独たんどくではschema・source・cycle・選択せんたく検査済けんさずみproofではない。engineのParseTree型付かたつきadapterは解決済かいけつずみProfileによる静的選択せいてきせんたく回復検査かいふくけんさくわえ、Dynamicのじつprovider登録とうろく固定こていshape・保存ほぞんchildContextsの整合せいごう検査けんさし、core-owned FoundationValueCodecをかいしてwireのじつSyntaxBundle変換へんかん使つかう。wireからengineへの依存いぞん追加ついかしない。Dynamicのpackage indexやchildContextsを構文こうぶんnode番号ばんごうとして再配置さいはいちしない。この検査けんさはproviderの実行履歴じっこうりれき認証にんしょう代替だいたいせず、ParseTree codec成立せいりつからparse continuation全体ぜんたいのportable推定すいていしない。Facts要求応答ようきゅうおうとう型付かたつ包絡ほうらくはこのおなじtree codecと、要求ようきゅう束縛そくばくしたfacts権限検査けんげんけんさ使用しようする。

SyntaxBundle.sourceMapsも宣言順せんげんじゅんれつとして保存ほぞんする。そのSpanはopaque source identityとbyte rangeをち、NodeRef再採番さいさいばん変化へんかしない。foreign bundleは独自どくじのsourceMaps/sourcesをつ。生成せいせいsnapshotの予約よやくidentityもhostが固定こていしてからnative/portable比較ひかくわたし、別実装べつじっそう独自どくじにIDを発明はつめいして同一どういつbyteれつ偽装ぎそうしない。

EnvironmentEntry.digestは NEPL3-ENVIRONMENT-1 + zero byte + canonical NDF(Environment record) のSHA-256とする。entry自身じしんのid/digestはhashへれない。bindings/resourcesの列順れつじゅんとbindingちゅうのbundle局所きょくしょOriginRefはEnvironment一部いちぶである。Origin tableを再編さいへんするhostは参照さんしょうとdigestをとも更新こうしんし、べつbundleへおな数値すうちOriginRefだけをうつして同一環境どういつかんきょうとみなさない。環境かんきょうdigest一致いっちはoriginの実在じつざい・domain bindingの意味検査いみけんさ代替だいたいしない。

このあたい局所きょくしょtable参照さんしょうふく内容ないようdigestであり、参照先さんしょうさきOriginの閉包へいほうdigestではない。べつのOrigin tableでおな番号ばんごう使つかえばおな内容ないようdigestになりる。reader・editor・診断しんだんのcache keyはEnvironmentEntry.digestだけでなく、ReaderContextのOrigin table・選択せんたくProfile・source bundleのidentityを固定こていする。出自しゅつじ結果けっかべつbundleへ再利用さいりようしない。originの再採番時さいさいばんじはbindingとEnvironmentEntry.digestにくわえ、ForeignSyntax.environment.digestを同時どうじ更新こうしんする。

3. normal formとartifact

printの正規形せいきけい各言語かくげんごのformal sourceひょうしたがう。lossless再出力さいしゅつりょくはoriginal SourceSnapshotの抽出ちゅうしゅつであり、意味いみprinterと同一視どういつししない。sourceをたないあたいにもprefix printerが使つかえる。

HTML/XML出力しゅつりょくはUTF-8、属性ぞくせいはnamespace URIとlocal nameのscalarじゅん出力しゅつりょくする。モデル不変条件章ふへんじょうけんしょう文字集合もじしゅうごう検査後けんさご、Textと属性値ぞくせいち&<>つね&amp;&lt;&gt; へescapeする。これによりXML文字もじデータちゅう]]>直接出力ちょくせつしゅつりょくされない。属性値ぞくせいち二重引用符にじゅういんようふかこみ、"&quot; とする。TextのCRは &#xD;属性値ぞくせいちのTAB/LF/CRはそれぞれ &#x9;&#xA;&#xD; としてparseあたい保持ほじする。TextのTAB/LFはそのまます。HTMLのbrはvoid、XMLでは自己閉じことじを使つかう。外部がいぶから任意にんいのnamespace URIをけない。MathML/SVGのnamespaceはserializerが固定値こていち生成せいせいする。

pixelの完全一致かんぜんいっちはOS/font/browserに依存いぞんするため、このbackendの契約けいやく安全あんぜんなDOM内容ないよう構造こうぞう宣言せんげんされたstyle/layout規則きそくとする。おなじbackend revisionの固定こていassetから生成せいせいするmarkup byteれつ決定的けっていてきnativeとprocessの同実装経路どうじっそうけいろではbyte一致いっちことなる独立実装どくりつじっそうではcanonical構造一致こうぞういっち定義済ていぎず表示規則ひょうじきそく検査けんさする。

4. limitsとproviderの互換ごかん

algorithmごとのwork消費量しょうひりょうことなってよい。十分じゅうぶん予算よさんでCompleteになったおな入力にゅうりょくについて、意味正規形いみせいきけい診断しんだんcode/対象範囲たいしょうはんい解決先かいけつさき一致いっちすることを要求ようきゅうする。片方かたほうだけが予算不足よさんふそく場合ばあいあたい不一致ふいっちおなあつかいをしない。ただしlimit違反いはん無視むし、partialをCompleteにすること、hostへ制御せいぎょかえさないことは契約違反けいやくいはん

おな入力にゅうりょく・environment・source/resources・provider revision・budgetでのおな実装じっそう結果けっか決定的けっていてき外部がいぶclock、乱数らんすう、OS directoryじゅんなどに意味いみ依存いぞんさせない。