)
编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载本文对应仓库文档 docs/Kernel-developer-notes.md是 Dart SDK 中 Kernel 编译器的开发者工作笔记。阅读本文你将掌握修改pkg/kernel之后从静态分析、单元测试、端到端回归到 AOT 全链路验证的完整测试方法与命令适用于参与 Dart SDK 的 IR、序列化与前端编译相关的开发与调试工作。背景先弄清楚你在改什么在动手执行任何测试命令之前有必要先定位pkg/kernel在整个 Dart SDK 中的角色。Dart Kernel 是一种中间语言IR。按照 pkg/kernel/README.md 的定义它是从 Dart 派生的小型高级语言专门设计用于全程序分析whole-program analysis与程序变换transformation最终被 codegen 与执行后端消费。它同时是一种紧凑的二进制对象文件格式支持分离编译separate compilation与链接linking——docs/Kernel-Documentation.md 明确将其定位为用于 Dart 程序的中间语言 二进制对象文件格式 程序变换基础设施。pkg/kernel包内包含可变换的 IR见 pkg/kernel/lib/ast.dart与二进制/文本序列化二进制格式规范见 pkg/kernel/binary.md。从 pkg/kernel/lib/kernel.dart 可以看到该包的顶层 API 形态例如loadComponentFromBinary(String path, ...)/loadComponentFromBytes(...)从.dill等二进制文件或字节流中反序列化出Component见 pkg/kernel/lib/kernel.dart#L28-L37writeComponentToBinary(...)/writeComponentToBytes(...)把Component重新序列化回二进制见 pkg/kernel/lib/kernel.dart#L48-L81writeComponentToText(...)把 IR 以文本形式打印出来支持showOffsets、showMetadata选项见 pkg/kernel/lib/kernel.dart#L83-L100。围绕 IR 的核心能力还包括类型检查器pkg/kernel/lib/type_checker.dart、验证器pkg/kernel/lib/verifier.dart、变换库pkg/kernel/lib/transformations/等目录它们构成了测试时受影响范围的判断依据。注意README 明确提示本包 API 处于早期不稳定状态没有 semver 版本契约外部依赖者应当直接锁定具体版本。这也意味着改动 IR 节点、序列化格式时波及面可能远超pkg/kernel本身——这正是下文测试矩阵设计的出发点。测试前的准备理解工具链Kernel 开发笔记给出的所有命令都基于 SDK 仓库自带的两个工具脚本tools/test.pySDK 的统一测试入口负责按套件suite组织并调度测试tools/build.pySDK 的构建入口用于构建编译器/运行时产物。命令中反复出现的选项含义如下结合命令上下文可以确认选项含义出现在命令中的形式-m release/-mrelease以release 模式构建并运行./tools/test.py pkg/kernel -mrelease--checked以checked 模式运行测试启用运行时类型检查便于尽早暴露类型错误./tools/test.py pkg/kernel -mrelease --checked-c dartk选择dartk 编译器配置用 Dart Kernel 编译器把源码编译成 kernel 组件后由 VM 执行./tools/test.py -m release -c dartk language-c dartkp在 dartk 基础上叠加precompiledAOT 预编译配置./tools/test.py -cdartkp ...-r dart_precompiled指定运行时产物为dart_precompiledAOT 快照运行器./tools/test.py -cdartkp -rdart_precompiled ...language/co19测试套件名tests/language语言测试与tests/co19语言一致性测试端到端命令的套件参数测试套件的命名约定是pkg/kernel、pkg/front_end、dart2js/kernel分别对应 kernel 包、前端front_end以及 dart2js 的 kernel 相关测试目录。由于 dart2js 编译器源码位于pkg/compilerdart2js/kernel在tools/test.py中属于 dart2js 套件下的 kernel 相关子集。第一步静态分析dartanalyzer改动后的第一道关卡是静态分析。Kernel 开发笔记给出的命令是(cd pkg/kernel dartanalyzer --strong bin lib test)这条命令的作用cd pkg/kernel把工作目录切换到 kernel 包内对bin、lib、test三个源码目录做整体分析--strong以strong mode强模式类型检查运行 dartanalyzer对类型系统做严格校验。在当今的 SDK 版本中dartanalyzer已被dart analyze取代若你的本地工具链未提供dartanalyzer二进制可在pkg/kernel目录下执行等价的(cd pkg/kernel dart analyze bin lib test)无论使用哪个命令目标一致在跑任何测试之前先把类型错误、未解析引用等静态问题消灭掉避免把低级的编译错误带进耗时的测试环节。pkg/kernel包内自带 analysis_options.yaml静态分析会按该文件中的 lint 规则执行。第二步单元测试三连直接受影响套件静态检查通过后接着运行直接受影响的三个单元测试套件。Kernel 开发笔记给出的命令是./tools/test.py pkg/kernel -mrelease --checked ./tools/test.py pkg/front_end -mrelease --checked ./tools/test.py dart2js/kernel -mrelease --checked逐条解读pkg/kernelkernel 包自身的单元测试。从 pkg/kernel/test/ 目录可以看到覆盖面相当广的测试矩阵例如verify_test.dart验证器verifier测试equivalent_dill_test.dart两次序列化/反序列化后 IR 等价性测试relink_test.dart组件链接relink行为测试clone_test.dartIR 克隆语义测试type_hashcode_test.dart、norm_test.dart 等类型系统测试。 这些测试直接验证 IR 结构、变换与序列化的正确性是改动 kernel 时第一优先级必须全绿的部分。pkg/front_end前端编译器front_end的测试。front_end 负责把源码编译为 kernel 组件.dill它深度依赖pkg/kernel的 IR 与二进制格式——任何 IR 节点改动、序列化格式变更都会波及 front_end。若pkg/front_end测试失败而pkg/kernel通过问题通常出在格式读写或前端构建 IR 的方式上。dart2js/kerneldart2js位于pkg/compiler消费 kernel IR 进行 JS 代码生成其 kernel 相关测试用于确认IR 改动没有破坏 JS 后端对 IR 的解读。三者构成一条完整的依赖链kernel 定义 IR → front_end 生成 IR → dart2js 消费 IR。--checked选项让这些测试以运行时类型检查模式执行能把更多运行时类型不匹配问题提前暴露出来。第三步端到端测试dartk VM单元测试覆盖的是编译器内部组件但 kernel 改动最终要服务于源码 → kernel → VM 执行的整条链路。Kernel 开发笔记给出的端到端命令是./tools/test.py -m release -c dartk language这条命令的含义-c dartk使用dartkDart Kernel 编译器作为编译后端——即先用 front_end 把tests/language下的语言测试源码编译为 kernel 组件再由 Dart VM 执行language运行tests/language语言测试套件该目录下包含数千个覆盖语言特性的用例是 Dart 语言语义正确性的主战场。这一步是回归的核心如果 IR 变换、类型信息或序列化有任何偏差语言测试会以编译错误、运行时崩溃或错误结果的形式暴露出来。由于tests/language用例数量庞大仓库中该目录下有数千个.dart文件这条命令的运行时间明显长于单元测试建议在单元测试全绿后再执行。如果改动涉及 AOT 相关特性如常量折叠、AOT 专用变换或希望覆盖tests/co19语言一致性测试可把套件参数替换为language co19见下一步。第四步可选、较慢AOT 全链路测试Kernel 开发笔记特别标注了这一步是optional可选且 slow较慢。当改动可能影响 AOTAhead-of-Time编译路径时需要运行./tools/build.py runtime_precompiled ./tools/test.py -cdartkp -rdart_precompiled language co19逐步拆解./tools/build.py runtime_precompiled构建 AOT 运行时产物runtime_precompiled目标即生成可执行 AOT 快照的 Dart VM 运行时./tools/test.py -cdartkp -rdart_precompiled language co19-cdartkp使用 dartk precompiledAOT编译管线-rdart_precompiled使用dart_precompiled运行时直接加载/运行预编译快照language co19同时运行语言测试与 co19 语言一致性测试。为什么慢因为 AOT 流程涉及编译为 kernel → 生成 AOT 快照 → 由预编译运行时执行的完整流水线且co19套件用例量级很大。因此这条命令被定位为可选通常只在以下场景执行改动影响了 AOT 编译阶段特有的变换或优化改动涉及常量、类型参数实例化等 AOT 语义单元测试与 JIT 端到端测试均已通过需要最终确认。第五步dart2js 编译输出对比回归Kernel 开发笔记还建议在改动前后分别编译 dart2js并对编译输出进行对比以捕捉IR 语义变化导致代码生成结果漂移这类难以被功能性测试覆盖的问题# 改动前保存一份编译输出 # 改动后再次编译并对比原文档附带的对比脚本托管于 gist的作用就是降低前后两次编译输出对比的工作量。通用的操作思路是改动前用固定的输入程序集编译 dart2js把产物JS 输出或 kernel 组件另存为基线改动后用相同输入重新编译对两份产物做diff逐项审查差异是否在预期范围内例如仅由你的改动引起的、语义等价的重命名或布局调整。这一回归手段的价值在于dart2js 生成的 JS 对 IR 中的字段布局、类型信息、常量表示高度敏感语义等价但字节级不同的输出往往预示着潜在的代码生成问题值得人工审查确认。测试策略总结按改动影响面选择命令综合 Kernel 开发笔记与仓库结构推荐按下表安排测试顺序与取舍阶段命令耗时覆盖范围何时必跑静态检查(cd pkg/kernel dartanalyzer --strong bin lib test)短类型错误、lint任何改动单元测试./tools/test.py pkg/kernel -mrelease --checked短IR 结构、序列化、变换任何改动单元测试./tools/test.py pkg/front_end -mrelease --checked中前端生成 IR 的路径IR/格式改动单元测试./tools/test.py dart2js/kernel -mrelease --checked中dart2js 消费 IRIR/格式改动端到端./tools/test.py -m release -c dartk language长源码→kernel→VM 全链路任何改动AOT可选./tools/build.py runtime_precompiled./tools/test.py -cdartkp -rdart_precompiled language co19很长AOT 全链路 co19AOT 相关改动输出对比前后两次编译 dart2js 并 diff中代码生成漂移dart2js 相关改动几个实操建议顺序执行、逐级放行静态分析 → 单元测试 → JIT 端到端 → 可选AOT。不要跳过单元测试直接跑端到端否则排错成本会急剧上升利用--checked模式它能在测试执行时附加运行时类型检查是 Kernel 开发笔记特意为开发者保留的调试手段关注二进制格式版本号如果改动触及序列化格式注意 pkg/kernel/binary.md 中ComponentFile的定义当前仓库中 magic 为0x90ABCDEFformatVersion 141任何格式布局变更都需要同步评估版本号与跨版本兼容性并运行pkg/kernel下的等价性/重链接测试验证 round-trip 正确性。相关文档导航关于 Kernel 的更多背景仓库内还有一组配套文档docs/Kernel-Documentation.mdKernel 文档索引页汇总二进制格式、操作语义与类型系统文档入口docs/Kernel-Operational-Semantics.mdKernel 的操作语义kernel 程序如何执行docs/Kernel-Type-System.mdKernel 类型系统说明pkg/kernel/binary.mdKernel 二进制格式的完整字段级规范是理解序列化测试与格式版本约定的必读材料pkg/kernel/README.mdKernel 包的能力边界可变换 IR、序列化与 API 稳定性声明。参与 SDK 贡献时相关流程规范可参考 CONTRIBUTING.md 与 docs/Testing.md而本文所有命令的最终权威定义均以仓库中的 tools/test.py 与 tools/build.py 为准。赞分享编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载相关推荐Graphene测试策略从单元测试到端到端验证全流程Graphene测试策略从单元测试到端到端验证全流程 你是否在开发GraphQL应用时遇到过这些问题接口返回数据不符合预期、权限验证漏洞、版本迭代后功能异常后端API设计LoopBack测试驱动开发终极指南从单元测试到端到端测试的完整实践LoopBack测试驱动开发终极指南从单元测试到端到端测试的完整实践 LoopBack是一个强大的Node.js框架专为构建需要复杂集成的现代API应用程序后端Web框架API设计如何构建D-FINE目标检测模型的完整测试体系从单元测试到端到端验证的终极指南如何构建D FINE目标检测模型的完整测试体系从单元测试到端到端验证的终极指南 D FINE作为ICLR 2025 Spotlight收录的创新目标检测模型人工智能计算机视觉深度学习上一篇Spree 媒体库Media Library统一管理门店图片与视频的复用、检索与删除机制下一篇Floodlight与Mininet完美结合构建虚拟SDN网络的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考