
編程語言編譯器云原生語言運行時【免費下載鏈接】wingA programming language for the cloud ?? A unified programming model, combining infrastructure and runtime code into one language ?項目地址https://gitcode.com/gh_mirrors/wi/wing點擊查看免費下載導讀本文以開源倉庫 Wing 中一份 Hangar 測試快照 new_jsii.test.w_test_sim.md 為切入點逐層拆解它背后驗證的語言特性——Wing 語言中new X() in scope語法下自定義 scope 表達式只被求值構造一次。讀完本文你將理解該快照記錄了什么、被測的 new_jsii.test.w 如何斷言 scope 單次構造語義、編譯產(chǎn)物如何印證這一行為以及 Hangar 快照測試框架是如何自動化生成、規(guī)整并沉淀這些結果的。一、快照文檔速覽一條通過的 sim 測試記錄關聯(lián)文檔全文非常精簡是 Hangar 為tests/valid/目錄下每個合法.w測試文件自動生成的標準快照格式。其結構為標題行# [new_jsii.test.w](https://link.gitcode.com/i/432adb6158f6c08529038b163219f56e) | test | sim聲明該快照對應的源文件、執(zhí)行的測試類型test與目標平臺sim即模擬器。## stdout.log代碼塊記錄wing test -t sim運行后經(jīng)規(guī)整sanitize的標準輸出pass ─ new_jsii.test.wsim (no tests) Tests (0) Snapshots 1 skipped Test Files 1 passed (1) Duration DURATION這段輸出有幾處值得注意的細節(jié)pass ─ new_jsii.test.wsim (no tests)測試文件本身不包含test ... {}聲明的用例Tests (0)但文件作為合法程序被成功編譯并加載執(zhí)行因此整體判定為pass。這也是(no tests)的由來——它的價值不在于單元斷言數(shù)量而在于驗證一段合法 Wing 程序在 sim 平臺下能完整跑通包括其中的assert語句在 preflight 階段執(zhí)行。Snapshots 1 skipped指同一源文件對應的compile快照tf-aws 平臺被跳過只在本輪生成test快照。Duration DURATION這是關鍵細節(jié)——真實的耗時如Duration 0m0.42s被 Hangar 的規(guī)整邏輯替換成了占位符DURATION。原因見 utils.ts 中sanitizeOutput()的正則/Duration \dm[\d.]s/g→Duration DURATION。因為運行時長在不同機器、不同負載下必然波動快照必須對時長免疫否則任何一次本地運行都會導致快照 diff。也就是說這份快照的意義是它固化了new_jsii.test.w在 sim 平臺測試通過這一可復現(xiàn)事實任何破壞該行為的代碼變更都會讓快照測試失敗從而被 CI 攔截。二、被測代碼斷言自定義 scope 只執(zhí)行一次快照指向的源文件是 tests/valid/new_jsii.test.w全文僅 15 行// verifies that new CustomScope() is only // executed once when passed as a custom scope bring cloud; let var count 0; class CustomScope { new() { count 1; } } new cloud.Bucket() in new CustomScope(); assert(count 1);這段代碼的語義鏈條非常清晰引入標準庫cloud聲明可變變量count作為觀測器。定義 preflight 類CustomScope其構造函數(shù)對count自增 1。用new cloud.Bucket() in new CustomScope()創(chuàng)建一個 Bucket 資源并把new CustomScope()的求值結果作為該資源的自定義 scope。最后assert(count 1)斷言count恰好為 1。如果編譯器在處理in scope時對 scope 表達式求值了多次例如先求值一次用于解析、再求值一次用于掛載構造樹count就會變成 2assert直接失敗整個測試文件在 sim 平臺下也會以非零狀態(tài)退出快照中就不會出現(xiàn)pass。因此這個測試以最樸素的黑盒方式釘死了語言的一個語義承諾scope 表達式只求值一次。該語法本身在語言參考 docs/api/05-language-reference.md 中有明確定義Preflight 對象都擁有一個 scope 和一個唯一 id默認 scope 為this當前定義所在作用域默認 id 為類型名若同 scope 內(nèi)同類型實例唯一。實例化語法為let name[: type] new Type(args) [as id] [in scope];in scope用于自定義掛載的父構造節(jié)點as id用于自定義構造樹中的 idscope必須是能解析為 preflight 對象的表達式。new_jsii.test.w正是對scope 可以是任意表達式且只求值一次這一行為的回歸測試。三、編譯產(chǎn)物印證preflight.cjs 中的單次構造僅看源代碼與運行時斷言還不夠有說服力Hangar 還為同一文件保留了tf-aws 平臺下的編譯快照new_jsii.test.w_compile_tf-aws.md其中展示了編譯器生成的 preflight 代碼從實現(xiàn)層面印證了該語義。關鍵的 preflight.cjs 片段如下class CustomScope extends $stdlib.std.Resource { constructor($scope, $id, ) { super($scope, $id); count 1; } ... } let count 0; globalThis.$ClassFactory.new(winglang/sdk.cloud.Bucket, cloud.Bucket, new CustomScope(this, CustomScope), Bucket); $helpers.assert($helpers.eq(count, 1), count 1);從生成代碼可以看到CustomScope被編譯為繼承std.Resource的類其構造函數(shù)體中的count 1原樣保留資源的創(chuàng)建被改寫為$ClassFactory.new(...)調(diào)用第三個參數(shù)new CustomScope(this, CustomScope)在調(diào)用現(xiàn)場只出現(xiàn)一次其返回值作為 Bucket 的父 scope生成的斷言$helpers.assert($helpers.eq(count, 1), count 1)與源碼assert(count 1)一一對應。同一快照中的main.tf.json也給出了云資源側的旁證——生成的 S3 桶在構造樹中的路徑為root/Default/Default/CustomScope/Bucket/Default其uniqueId為CustomScope_Bucket_8BBB89A4。這說明自定義 scope 確實參與了資源在構造樹中的定位CustomScope作為父節(jié)點掛載了Bucketscope 的語義不只是求值一次還真正決定了資源的層級路徑。這與應用樹文檔 docs/docs/02-concepts/02-application-tree.md 中資源名在其 scope 內(nèi)唯一的原則一致。此外同快照中的inflight.CustomScope-1.cjs顯示該類也生成了對應的 inflight 類型文件說明即使CustomScope在源碼中未定義任何 inflight 成員編譯器仍會為其生成 inflight 類型骨架以便在需要時參與運行時序列化。四、Hangar 機制快照從何而來這份快照并非手寫文檔而是由HangarWing 工具鏈的 E2E 測試套件自動生成的。其完整鏈路值得展開因為它決定了快照的格式與可信度。4.1 測試文件自動生成tools/hangar/src/generate_tests.ts 會遍歷tests/valid及其他測試目錄下的每個.w文件為每個文件生成一個 vitest 用例文件例如test(wing compile -t tf-aws, async () { await compileTest(.../tests/valid, new_jsii.test.w, undefined, true, false, []); }); test(wing test -t sim, async () { await testTest(.../tests/valid, new_jsii.test.w, undefined, false); });也就是說每個合法.w文件都對應兩條測試一條編譯到 tf-aws 平臺一條在 sim 平臺下執(zhí)行wing test。本快照對應的正是后者。4.2 命令執(zhí)行與輸出規(guī)整generated_test_targets.ts 中的testTest()會只對入口文件*.main.w、*.test.w、main.w等執(zhí)行測試——new_jsii.test.w符合.test.w后綴因此會被執(zhí)行通過runWingCommand見 utils.ts調(diào)用wing --no-update-check --no-analytics test file -t sim并設置WING_HIDE_CONTAINER_LOGS1隱藏容器日志把stdout寫入fileMap[stdout.log]stderr寫入stderr.log調(diào)用createMarkdownSnapshot()生成 Markdown 快照。sanitizeOutput()是快照穩(wěn)定性的核心保障它對輸出做了大量歸一化處理除了前面提到的DURATION還包括統(tǒng)一換行符\r\n→\n去掉 Rust 源碼報錯中的行列號src/xxx.rs:LINE:COL去掉絕對路徑、隨機.state文件引用、動態(tài)端口號與 IP:Port把時間戳統(tǒng)一替換為TIMESTAMP。createMarkdownSnapshot()則負責把規(guī)整后的輸出拼裝成統(tǒng)一格式的快照文件并落盤到 tools/hangar/snapshots/test_corpus/最后通過 vitest 的toMatchFileSnapshot與歷史快照比對??煺瘴募?guī)則為文件名_testCase_target.md因此本快照名為new_jsii.test.w_test_sim.md。4.3 平臺的路徑與配置tools/hangar/src/paths.ts 定義了整套路徑約定tests/valid下的.w文件被收集為validWingFileswing 二進制位于 Hangar 臨時目錄下安裝的winglang/sdk中tmpNodeModulesDir/.bin/wing運行測試前需要先完成依賴安裝。Hangar 的 npm scripts 定義在 tools/hangar/package.jsonnpm test即vitest run --update更新快照npm run test:generate重新生成測試用例文件。五、同族測試scope 與 id 的自定義語法new_jsii.test.w并非唯一覆蓋in scope語法的用例tests/valid/中還有多個同族測試可交叉印證in_scope_construct.test.w僅兩行核心代碼bring constructs as c; class MyClass {} new MyClass() in new c.Construct();它驗證自定義 scope 可以來自外部 jsii 庫constructs包的Construct且in語法對未顯式繼承Resource的普通 preflight 類同樣適用。custom_obj_id.test.w與in配套的as語法class Foo { } let foo1 new Foo(); let bar2 new Foo() as bar2; assert(nodeof(foo1).id Foo); assert(nodeof(bar2).id bar2);驗證as id能覆蓋默認 id默認取類型名Foo并可用nodeof(...).id在運行時反查。三者合在一起構成了對語言參考中l(wèi)et name new Type(args) [as id] [in scope]完整語法的回歸覆蓋in控制掛載位置、as控制節(jié)點 id、而 scope 表達式的單次求值由new_jsii.test.w專屬守衛(wèi)。六、如何驗證與復現(xiàn)由于倉庫是只讀的你可以在本地復現(xiàn)本快照的生成過程需要先按倉庫指引安裝依賴并構建 wing CLI在倉庫根目錄安裝依賴pnpm install構建 wing 工具鏈使wing可執(zhí)行進入tools/hangar執(zhí)行npm run test:generate重新生成用例再運行npm testvitest 會以--update模式刷新快照觀察 new_jsii.test.w_test_sim.md 是否仍以pass收尾。若修改 Wing 編譯器導致in scope對 scope 表達式求值多次count將不等于 1assert失敗wing test -t sim退出碼非零Hangar 的runWingCommand會判定失敗并讓快照測試整體報錯——這正是這類快照作為語言語義看門狗的價值所在。結語一份看似只有幾行的快照文檔背后串聯(lián)起了三層信息語言語義層in scope的 scope 單次求值與構造樹掛載、編譯實現(xiàn)層preflight.cjs 中$ClassFactory.new對 scope 表達式的單次內(nèi)聯(lián)求值、tf 資源路徑中的CustomScope/Bucket層級、以及測試基建層Hangar 自動生成用例、規(guī)整可變輸出、落盤快照并持續(xù)比對。理解了這三層你便既能讀懂 Wing 自定義 scope 語法的行為承諾也掌握了如何在倉庫中定位、復現(xiàn)和擴展現(xiàn)有回歸測試的方法。贊分享編程語言編譯器云原生語言運行時【免費下載鏈接】wingA programming language for the cloud ?? A unified programming model, combining infrastructure and runtime code into one language ?項目地址https://gitcode.com/gh_mirrors/wi/wing點擊查看免費下載相關推薦Wing 語言 inflight 閉包自動 ID 機制解析從 hangar 快照測試看 AutoIdResource 與 $Closure 生成Wing 語言 inflight 閉包自動 ID 機制解析從 hangar 快照測試看 AutoIdResource 與 $Closure 生成 導讀 本文以編程語言編譯器云原生語言運行時Wing 語言 cloud.Counter 初始化機制解析從 initial.test.w 到 hangar 快照測試Wing 語言 cloud.Counter 初始化機制解析從 initial.test.w 到 hangar 快照測試 cloud.Counter 是 Win編程語言編譯器云原生語言運行時Wing 語言前向聲明語義解析從 hangar 編譯快照看類與變量的定義順序規(guī)則Wing 語言前向聲明語義解析從 hangar 編譯快照看類與變量的定義順序規(guī)則 Wingwinglang是一門面向云計算的編程語言其核心特點之一是把基編程語言編譯器云原生語言運行時上一篇Haystack 中 YouComWebSearch 組件完全指南零配置聯(lián)網(wǎng)搜索與 RAG 集成下一篇Haystack 集成 DoclingServeConverter通過遠程 DoclingServe 服務將 PDF、Office、HTML 等文檔轉換為 Haystack Document創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考