V8 Torque 文件开发规则:.tq 源码与 BUILD.gn 注册的完整实战指南
发布时间:2026/9/21 16:55:21 作者:尧图编辑部 阅读量:1,286

语言运行时编译器JIT编译解释器内存管理【免费下载链接】v8The official mirror of the V8 Git repository项目地址https://gitcode.com/gh_mirrors/v81/v8点击查看免费下载导读本指南围绕 V8 仓库中面向 Torque 文件.tq的工程规范详解「新建.tq文件时必须注册到根目录BUILD.gn」这条核心规则包括注册位置、字母序要求、条件编译块的写法以及注册之后 Torque 编译器如何驱动代码生成的完整流程。读完本文你将掌握在 V8 中新增一个 Torque 源文件的正确姿势理解torque_files与v8_torque_files的区别并能基于 BUILD.gn 的源码结构独立排查新.tq文件未被编译这类构建问题。一、规则背景什么是 Torque 与 .tq 文件Torque 是 V8 用来编写内置函数builtins和运行期宏runtime macros的领域专用语言DSL它把类型化的高级语法编译为 V8 内部使用的 CodeStubAssemblerCSA调用序列。V8 源码中所有.tq文件都集中在src/下主要分布在两个目录src/builtins/*.tq内置函数实现例如array.tq、promise-all.tq、string.tqsrc/objects/*.tq堆对象类型定义例如js-objects.tq、string.tq、struct.tq另有少量测试与第三方文件如test/torque/test-torque.tq和third_party/v8/builtins/array-sort.tq。如果想深入了解 Torque 语法本身可以继续阅读仓库内的 docs/torque/architecture.md 与 docs/torque/user-manual.md本文聚焦的是工程层面的文件管理规范——新增一个.tq文件时如何把它接入构建系统。二、规则适用场景何时触发本规范规则文件agents/rules/torque.md通过 frontmatter 声明了自己的触发方式name: torque trigger: glob globs: src/**/*.tq也就是说只要工作内容涉及src/目录下的.tq文件无论是 Agent 自动执行任务还是开发者手工修改就应遵循本规则。src/**/*.tq这一 glob 精确覆盖了src/builtins/、src/objects/、src/debug/、src/wasm/等所有子目录中的 Torque 源文件。三、核心规则新建 .tq 文件必须在 BUILD.gn 中注册规则原文只讲了一件事但这件事直接决定构建成败如果你创建了一个新的.tq文件必须在根目录BUILD.gn中注册它。定位BUILD.gn中的torque_files列表注意不是v8_torque_files。按字母顺序添加你的新文件路径。注意对现有文件的修改不需要任何注册变更。拆解成三个要点新建才需要注册修改不需要。往已有.tq文件里加函数、改对象布局都不需要动BUILD.gn只有新增文件路径时才需要。注册目标是torque_files而不是v8_torque_files。V8 构建系统中名称相似的变量很多这条提示是为了避免新手把文件加到错误的位置。整个仓库中真正驱动 Torque 编译的列表就是根目录BUILD.gn里声明的torque_files。保持字母顺序。这既是为了 diff 可读性也是为了避免重复冲突——V8 的代码审查工具如 PRESUBMIT通常也期望列表保持有序。四、源码级验证BUILD.gn 中的 torque_files 结构打开根目录 BUILD.gntorque_files列表从第 2183 行开始可以看到它确实是严格按字母序排列的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, ]注意末尾两项test/torque/test-torque.tqTorque 自身的测试文件和third_party/v8/builtins/array-sort.tq第三方目录下的 Torque 文件说明torque_files不仅收录src/下的文件凡需要参与 Torque 编译的路径都在此列——这与规则中globs: src/**/*.tq的触发范围略有区别后者只是规则的激活条件不是注册范围的上限。4.1 条件注册不同特性开关下的列表扩展torque_files不只是静态列表它还会依据 GN 构建参数按条件追加见 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 ] } }这给你一个重要启示当你新增的.tq文件只与某一特性相关如 i18n、Temporal、WebAssembly时应把它放进对应的条件块内而不是无条件追加到基础列表。这样关闭该特性时对应文件就不会被纳入编译从而避免产生无谓的构建依赖或符号冲突。这些开关变量v8_enable_i18n_support、v8_enable_temporal_support、v8_enable_webassembly、v8_enable_drumbrake定义在 gni/v8.gni 中属于 V8 构建的常规配置项。五、注册之后发生了什么Torque 代码生成流水线把.tq文件加入torque_files后构建系统会通过run_torque模板见 BUILD.gn驱动 Torque 编译器工作template(run_torque) { ... action(run_torque suffix) { deps [ :torque($toolchain) ] # 先编译出 torque 可执行文件 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 # 输出逐个 .tq 生成对应代码 } }从这段模板可以看到完整的调用链先构建torque可执行程序deps [ :torque($toolchain) ]Torque 编译器本身位于 src/torque/通过tools/run.py以所有torque_files为输入执行torque二进制生成产物统一输出到$target_gen_dir/torque-generated/目录。以src/objects/string.tq为例一个.tq文件会派生出一组同名的生成文件filetq string_replace(file, .tq, -tq)即把.tq替换为-tqstring-tq-csa.cc/string-tq-csa.hCSA 汇编器实现与声明string-tq.ccTorque 生成的运行时支持代码。除此之外run_torque还会统一生成一批全局头文件包括builtin-definitions.h、instance-types.h、interface-descriptors.inc、exported-macros-assembler.h等见 BUILD.gn这些正是 V8 其它 C 代码#include的 Torque 生成接口。最终这些生成文件由torque_generated_initializers目标汇总编译进v8_base_without_compiler见 BUILD.gn。结论一个.tq文件如果不注册进torque_files它就不会出现在run_torque的输入里对应的*-tq-csa.cc/h等文件不会被生成任何引用该 Torque 定义类型的 C 代码都会在编译阶段报符号未定义或头文件缺失错误。六、实操清单新增一个 .tq 文件的完整步骤结合规则与源码推荐按以下流程操作以新增src/builtins/foo.tq为例创建文件在src/builtins/下编写foo.tq内容遵循 Torque 语法参考docs/torque/user-manual.md。确定注册位置打开根目录 BUILD.gn先判断新文件是否与某个特性开关绑定通用功能 → 追加到torque_files基础列表第 2183 行开始的块仅 i18n/Temporal/WebAssembly 相关 → 追加到对应的if条件块内。按字母序插入在目标列表中找到新文件路径应处的排序位置插入src/builtins/foo.tq,字符串带引号、行尾带逗号。以array-at.tq、array-concat.tq的排布为参照。检查列表末尾的测试注册若新增文件位于src/builtins/或src/objects/通常还需确认它是否应出现在torque_files末尾的测试/第三方条目附近——一般只需保证列表整体有序即可。本地验证构建重新运行 gn 生成与构建确认out/build_dir/gen/torque-generated/foo-tq-csa.cc、foo-tq.cc等文件被生成且编译通过。若文件未被生成说明注册位置或拼写有误。提交前检查修改已有.tq文件时跳过 25 步无需改动BUILD.gn。七、常见误区与注意事项误把文件加进v8_torque_files仓库中确实存在v8_*前缀的相关变量如v8_enable_*开关但 Torque 文件列表的名字就是torque_files。规则特别强调这一点就是为了防止混淆。忘记字母顺序虽然构建系统本身不校验顺序但不按序插入会让后续合并冲突频繁也容易在审查时被打回。新建文件后未跑构建注册本身是静态文本改动只有重新执行 gn/ninja 才会触发run_torque重新生成代码建议用ninja -C out/build_dir v8或对应的d8目标验证一次全量生成。条件块归属错误把 i18n 专属的.tq无条件加入基础列表会导致v8_enable_i18n_support false的构建中仍尝试编译该文件进而因缺少 Intl 相关类型定义而失败。只新增不注册的后果Torque 生成代码缺失症状往往是 C 侧#include torque-generated/foo-tq-csa.h报 file not found或Undefined symbol链接错误排查时应第一时间回到BUILD.gn确认注册。结语agents/rules/torque.md用三句话点出了 V8 中 Torque 文件管理的最小必要规范而 BUILD.gn 中的torque_files列表及其run_torque流水线则从源码层面印证了这条规则的必要性注册即编译编译即生成生成即被 C 引用。对任何在 V8 中新增 Torque 代码的开发者或 Agent 而言牢记新建注册、修改免注册、字母有序、条件归类这十六个字就能避免绝大多数与 Torque 相关的构建问题。赞分享语言运行时编译器JIT编译解释器内存管理【免费下载链接】v8The official mirror of the V8 Git repository项目地址https://gitcode.com/gh_mirrors/v81/v8点击查看免费下载相关推荐TypeSpec Linter 开发指南从规则定义到注册与测试的完整实战TypeSpec Linter 开发指南从规则定义到注册与测试的完整实战 本文基于 TypeSpec 官方文档《Linters》编写系统讲解在 TypeSp编程语言编译器后端miniblink49 内置 V8 的 Torque 语法高亮插件vim-torque 安装与源码级解析miniblink49 内置 V8 的 Torque 语法高亮插件vim torque 安装与源码级解析 Torque 是 V8 用来编写内置函数built前端桌面应用Roc 注释与文档注释实战指南从 单行注释到 文档注释的完整规则Roc 注释与文档注释实战指南从 单行注释到 文档注释的完整规则 本篇围绕 Roc 语言参考文档中的注释章节展开讲清两类注释的精确语法规则普通单行注释创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考