規(guī)則:.tq 源碼與 BUILD.gn 注冊(cè)的完整實(shí)戰(zhàn)指南)
語言運(yùn)行時(shí)編譯器JIT編譯解釋器內(nèi)存管理【免費(fèi)下載鏈接】v8The official mirror of the V8 Git repository項(xiàng)目地址https://gitcode.com/gh_mirrors/v81/v8點(diǎn)擊查看免費(fèi)下載導(dǎo)讀本指南圍繞 V8 倉(cāng)庫(kù)中面向 Torque 文件.tq的工程規(guī)范詳解「新建.tq文件時(shí)必須注冊(cè)到根目錄BUILD.gn」這條核心規(guī)則包括注冊(cè)位置、字母序要求、條件編譯塊的寫法以及注冊(cè)之后 Torque 編譯器如何驅(qū)動(dòng)代碼生成的完整流程。讀完本文你將掌握在 V8 中新增一個(gè) Torque 源文件的正確姿勢(shì)理解torque_files與v8_torque_files的區(qū)別并能基于 BUILD.gn 的源碼結(jié)構(gòu)獨(dú)立排查新.tq文件未被編譯這類構(gòu)建問題。一、規(guī)則背景什么是 Torque 與 .tq 文件Torque 是 V8 用來編寫內(nèi)置函數(shù)builtins和運(yùn)行期宏runtime macros的領(lǐng)域?qū)S谜Z言DSL它把類型化的高級(jí)語法編譯為 V8 內(nèi)部使用的 CodeStubAssemblerCSA調(diào)用序列。V8 源碼中所有.tq文件都集中在src/下主要分布在兩個(gè)目錄src/builtins/*.tq內(nèi)置函數(shù)實(shí)現(xiàn)例如array.tq、promise-all.tq、string.tqsrc/objects/*.tq堆對(duì)象類型定義例如js-objects.tq、string.tq、struct.tq另有少量測(cè)試與第三方文件如test/torque/test-torque.tq和third_party/v8/builtins/array-sort.tq。如果想深入了解 Torque 語法本身可以繼續(xù)閱讀倉(cāng)庫(kù)內(nèi)的 docs/torque/architecture.md 與 docs/torque/user-manual.md本文聚焦的是工程層面的文件管理規(guī)范——新增一個(gè).tq文件時(shí)如何把它接入構(gòu)建系統(tǒng)。二、規(guī)則適用場(chǎng)景何時(shí)觸發(fā)本規(guī)范規(guī)則文件agents/rules/torque.md通過 frontmatter 聲明了自己的觸發(fā)方式name: torque trigger: glob globs: src/**/*.tq也就是說只要工作內(nèi)容涉及src/目錄下的.tq文件無論是 Agent 自動(dòng)執(zhí)行任務(wù)還是開發(fā)者手工修改就應(yīng)遵循本規(guī)則。src/**/*.tq這一 glob 精確覆蓋了src/builtins/、src/objects/、src/debug/、src/wasm/等所有子目錄中的 Torque 源文件。三、核心規(guī)則新建 .tq 文件必須在 BUILD.gn 中注冊(cè)規(guī)則原文只講了一件事但這件事直接決定構(gòu)建成敗如果你創(chuàng)建了一個(gè)新的.tq文件必須在根目錄BUILD.gn中注冊(cè)它。定位BUILD.gn中的torque_files列表注意不是v8_torque_files。按字母順序添加你的新文件路徑。注意對(duì)現(xiàn)有文件的修改不需要任何注冊(cè)變更。拆解成三個(gè)要點(diǎn)新建才需要注冊(cè)修改不需要。往已有.tq文件里加函數(shù)、改對(duì)象布局都不需要?jiǎng)覤UILD.gn只有新增文件路徑時(shí)才需要。注冊(cè)目標(biāo)是torque_files而不是v8_torque_files。V8 構(gòu)建系統(tǒng)中名稱相似的變量很多這條提示是為了避免新手把文件加到錯(cuò)誤的位置。整個(gè)倉(cāng)庫(kù)中真正驅(qū)動(dòng) Torque 編譯的列表就是根目錄BUILD.gn里聲明的torque_files。保持字母順序。這既是為了 diff 可讀性也是為了避免重復(fù)沖突——V8 的代碼審查工具如 PRESUBMIT通常也期望列表保持有序。四、源碼級(jí)驗(yàn)證BUILD.gn 中的 torque_files 結(jié)構(gòu)打開根目錄 BUILD.gntorque_files列表從第 2183 行開始可以看到它確實(shí)是嚴(yán)格按字母序排列的torque_files [ src/builtins/aggregate-error.tq, src/builtins/array-at.tq, src/builtins/array-concat.tq, src/builtins/array-copywithin.tq, src/builtins/array-every.tq, ... src/objects/string.tq, src/objects/struct.tq, ... test/torque/test-torque.tq, third_party/v8/builtins/array-sort.tq, ]注意末尾兩項(xiàng)test/torque/test-torque.tqTorque 自身的測(cè)試文件和third_party/v8/builtins/array-sort.tq第三方目錄下的 Torque 文件說明torque_files不僅收錄src/下的文件凡需要參與 Torque 編譯的路徑都在此列——這與規(guī)則中g(shù)lobs: src/**/*.tq的觸發(fā)范圍略有區(qū)別后者只是規(guī)則的激活條件不是注冊(cè)范圍的上限。4.1 條件注冊(cè)不同特性開關(guān)下的列表擴(kuò)展torque_files不只是靜態(tài)列表它還會(huì)依據(jù) GN 構(gòu)建參數(shù)按條件追加見 BUILD.gnif (v8_enable_i18n_support) { torque_files [ src/objects/intl-objects.tq, src/objects/js-collator.tq, src/objects/js-date-time-format.tq, ... ] } if (v8_enable_temporal_support) { torque_files [ src/objects/js-temporal-objects.tq ] } if (v8_enable_webassembly) { torque_files [ src/builtins/js-to-wasm.tq, src/builtins/wasm.tq, src/builtins/wasm-strings.tq, src/builtins/wasm-to-js.tq, src/debug/debug-wasm-objects.tq, src/wasm/wasm-objects.tq, ] if (v8_enable_drumbrake) { torque_files [ src/builtins/wasm-interpreter-wrappers.tq ] } }這給你一個(gè)重要啟示當(dāng)你新增的.tq文件只與某一特性相關(guān)如 i18n、Temporal、WebAssembly時(shí)應(yīng)把它放進(jìn)對(duì)應(yīng)的條件塊內(nèi)而不是無條件追加到基礎(chǔ)列表。這樣關(guān)閉該特性時(shí)對(duì)應(yīng)文件就不會(huì)被納入編譯從而避免產(chǎn)生無謂的構(gòu)建依賴或符號(hào)沖突。這些開關(guān)變量v8_enable_i18n_support、v8_enable_temporal_support、v8_enable_webassembly、v8_enable_drumbrake定義在 gni/v8.gni 中屬于 V8 構(gòu)建的常規(guī)配置項(xiàng)。五、注冊(cè)之后發(fā)生了什么Torque 代碼生成流水線把.tq文件加入torque_files后構(gòu)建系統(tǒng)會(huì)通過run_torque模板見 BUILD.gn驅(qū)動(dòng) Torque 編譯器工作template(run_torque) { ... action(run_torque suffix) { deps [ :torque($toolchain) ] # 先編譯出 torque 可執(zhí)行文件 script tools/run.py sources torque_files # 輸入所有 .tq 文件 destination_folder $target_gen_dir/torque-generated$suffix ... args [ ./ rebase_path(... /torque, root_build_dir), -o, rebase_path($destination_folder, root_build_dir), -v8-root, rebase_path(., root_build_dir), ] args torque_files # 輸出逐個(gè) .tq 生成對(duì)應(yīng)代碼 } }從這段模板可以看到完整的調(diào)用鏈先構(gòu)建torque可執(zhí)行程序deps [ :torque($toolchain) ]Torque 編譯器本身位于 src/torque/通過tools/run.py以所有torque_files為輸入執(zhí)行torque二進(jìn)制生成產(chǎn)物統(tǒng)一輸出到$target_gen_dir/torque-generated/目錄。以src/objects/string.tq為例一個(gè).tq文件會(huì)派生出一組同名的生成文件filetq string_replace(file, .tq, -tq)即把.tq替換為-tqstring-tq-csa.cc/string-tq-csa.hCSA 匯編器實(shí)現(xiàn)與聲明string-tq.ccTorque 生成的運(yùn)行時(shí)支持代碼。除此之外run_torque還會(huì)統(tǒng)一生成一批全局頭文件包括builtin-definitions.h、instance-types.h、interface-descriptors.inc、exported-macros-assembler.h等見 BUILD.gn這些正是 V8 其它 C 代碼#include的 Torque 生成接口。最終這些生成文件由torque_generated_initializers目標(biāo)匯總編譯進(jìn)v8_base_without_compiler見 BUILD.gn。結(jié)論一個(gè).tq文件如果不注冊(cè)進(jìn)torque_files它就不會(huì)出現(xiàn)在run_torque的輸入里對(duì)應(yīng)的*-tq-csa.cc/h等文件不會(huì)被生成任何引用該 Torque 定義類型的 C 代碼都會(huì)在編譯階段報(bào)符號(hào)未定義或頭文件缺失錯(cuò)誤。六、實(shí)操清單新增一個(gè) .tq 文件的完整步驟結(jié)合規(guī)則與源碼推薦按以下流程操作以新增src/builtins/foo.tq為例創(chuàng)建文件在src/builtins/下編寫foo.tq內(nèi)容遵循 Torque 語法參考docs/torque/user-manual.md。確定注冊(cè)位置打開根目錄 BUILD.gn先判斷新文件是否與某個(gè)特性開關(guān)綁定通用功能 → 追加到torque_files基礎(chǔ)列表第 2183 行開始的塊僅 i18n/Temporal/WebAssembly 相關(guān) → 追加到對(duì)應(yīng)的if條件塊內(nèi)。按字母序插入在目標(biāo)列表中找到新文件路徑應(yīng)處的排序位置插入src/builtins/foo.tq,字符串帶引號(hào)、行尾帶逗號(hào)。以array-at.tq、array-concat.tq的排布為參照。檢查列表末尾的測(cè)試注冊(cè)若新增文件位于src/builtins/或src/objects/通常還需確認(rèn)它是否應(yīng)出現(xiàn)在torque_files末尾的測(cè)試/第三方條目附近——一般只需保證列表整體有序即可。本地驗(yàn)證構(gòu)建重新運(yùn)行 gn 生成與構(gòu)建確認(rèn)out/build_dir/gen/torque-generated/foo-tq-csa.cc、foo-tq.cc等文件被生成且編譯通過。若文件未被生成說明注冊(cè)位置或拼寫有誤。提交前檢查修改已有.tq文件時(shí)跳過 25 步無需改動(dòng)BUILD.gn。七、常見誤區(qū)與注意事項(xiàng)誤把文件加進(jìn)v8_torque_files倉(cāng)庫(kù)中確實(shí)存在v8_*前綴的相關(guān)變量如v8_enable_*開關(guān)但 Torque 文件列表的名字就是torque_files。規(guī)則特別強(qiáng)調(diào)這一點(diǎn)就是為了防止混淆。忘記字母順序雖然構(gòu)建系統(tǒng)本身不校驗(yàn)順序但不按序插入會(huì)讓后續(xù)合并沖突頻繁也容易在審查時(shí)被打回。新建文件后未跑構(gòu)建注冊(cè)本身是靜態(tài)文本改動(dòng)只有重新執(zhí)行 gn/ninja 才會(huì)觸發(fā)run_torque重新生成代碼建議用ninja -C out/build_dir v8或?qū)?yīng)的d8目標(biāo)驗(yàn)證一次全量生成。條件塊歸屬錯(cuò)誤把 i18n 專屬的.tq無條件加入基礎(chǔ)列表會(huì)導(dǎo)致v8_enable_i18n_support false的構(gòu)建中仍嘗試編譯該文件進(jìn)而因缺少 Intl 相關(guān)類型定義而失敗。只新增不注冊(cè)的后果Torque 生成代碼缺失癥狀往往是 C 側(cè)#include torque-generated/foo-tq-csa.h報(bào) file not found或Undefined symbol鏈接錯(cuò)誤排查時(shí)應(yīng)第一時(shí)間回到BUILD.gn確認(rèn)注冊(cè)。結(jié)語agents/rules/torque.md用三句話點(diǎn)出了 V8 中 Torque 文件管理的最小必要規(guī)范而 BUILD.gn 中的torque_files列表及其run_torque流水線則從源碼層面印證了這條規(guī)則的必要性注冊(cè)即編譯編譯即生成生成即被 C 引用。對(duì)任何在 V8 中新增 Torque 代碼的開發(fā)者或 Agent 而言牢記新建注冊(cè)、修改免注冊(cè)、字母有序、條件歸類這十六個(gè)字就能避免絕大多數(shù)與 Torque 相關(guān)的構(gòu)建問題。贊分享語言運(yùn)行時(shí)編譯器JIT編譯解釋器內(nèi)存管理【免費(fèi)下載鏈接】v8The official mirror of the V8 Git repository項(xiàng)目地址https://gitcode.com/gh_mirrors/v81/v8點(diǎn)擊查看免費(fèi)下載相關(guān)推薦TypeSpec Linter 開發(fā)指南從規(guī)則定義到注冊(cè)與測(cè)試的完整實(shí)戰(zhàn)TypeSpec Linter 開發(fā)指南從規(guī)則定義到注冊(cè)與測(cè)試的完整實(shí)戰(zhàn) 本文基于 TypeSpec 官方文檔《Linters》編寫系統(tǒng)講解在 TypeSp編程語言編譯器后端miniblink49 內(nèi)置 V8 的 Torque 語法高亮插件vim-torque 安裝與源碼級(jí)解析miniblink49 內(nèi)置 V8 的 Torque 語法高亮插件vim torque 安裝與源碼級(jí)解析 Torque 是 V8 用來編寫內(nèi)置函數(shù)built前端桌面應(yīng)用Roc 注釋與文檔注釋實(shí)戰(zhàn)指南從 單行注釋到 文檔注釋的完整規(guī)則Roc 注釋與文檔注釋實(shí)戰(zhàn)指南從 單行注釋到 文檔注釋的完整規(guī)則 本篇圍繞 Roc 語言參考文檔中的注釋章節(jié)展開講清兩類注釋的精確語法規(guī)則普通單行注釋創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考