
编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载引言Dart2Wasm 是 Dart SDK 内置的 WasmWebAssembly编译器位于pkg/dart2wasm/能够将 Dart 源码直接编译为.wasm模块。本文以仓库中的官方开发文档 pkg/dart2wasm/docs/build_and_test.md 为骨架系统讲解 Dart2Wasm 的完整开发闭环源码检出与工具链配置、编译器构建单独构建与随 SDK 构建、本地编译/运行基准测试的两套辅助脚本、从源码直接运行编译器、编译器核心命令行参数以及测试矩阵与回归验证方法。读完本文你将具备在本地从源码构建并调试 Dart2Wasm、用dart compile wasm快速编译 Wasm 应用、以及在测试框架中运行 dart2wasm 测试套件的完整实战能力。一、前置准备源码检出与工具链配置1.1 获取 Dart SDK 源码Dart2Wasm 的构建与测试都假定你已有一个符合 Dart 仓库结构的源码检出。官方文档指向 docs/Building.md 中的 Getting the source 章节其中包含完整的gclient检出流程。检出完成后仓库根目录下会生成由 gclient 管理的工作区配置.gclient文件Dart2Wasm 的辅助脚本正是依赖这一仓库目录结构来定位构建产物。1.2 通过.gclient的 custom_vars 启用可选工具链默认情况下DEPS中与 dart2wasm 测试相关的可选工具不会随检出自动下载——从 DEPS 可以看到它们的默认值均为Falsecheckout_flute: False第 69 行checkout_javascript_engines: False第 77 行download_chrome: False第 163 行download_firefox: False第 165 行download_emscripten: False第 169 行这些开关会作为DEPS中对应condition的输入控制是否拉取对应的测试引擎与工具链例如checkout_javascript_engines控制 V8D8、JavaScriptCoreJSC等 JS 引擎的检出DEPS 第 238、246 行附近download_chrome/download_firefox控制浏览器测试环境download_emscripten控制 Emscripten 工具链第 733、740 行附近checkout_flute控制 Flutter 相关的 Flute 依赖第 354、367 行附近。因此若要运行 dart2wasm 的全部测试特别是跨 JS 引擎的测试需要在.gclient的 solution 中追加自定义变量再执行下一次gclient syncsolutions [ { name : sdk, ... custom_vars : { download_emscripten: True, download_firefox: True, download_chrome: True, checkout_flute: True, checkout_javascript_engines: True, }, }, ]说明download_emscripten主要服务于需要使用 Emscripten 的构建场景checkout_flute服务于 Flutter 侧集成测试。如果只做 dart2wasm 本地的编译/调试仅检出 JS 引擎D8 等即可满足run_benchmark --d8的运行需求。二、构建 Dart2Wasm 编译器本体2.1 单独构建本地开发推荐Dart2Wasm 编译器本身也是用 Dart 编写的构建流程会把它先编译成 Kernelplatform dill再为编译器自身生成 AOT snapshot。执行% tools/build.py -mrelease -ax64 dart2wasm该命令会完成两件事生成平台 dillout/ReleaseX64/dart2wasm_platform.dill—— 这是 dart2wasm 编译 Dart 程序时加载的平台库Dart SDK 内置库的预编译 Kernel 表示类似 dart2js 的 platform 概念生成编译器自身的 AOT snapshotout/ReleaseX64/dart2wasm.snapshot此后可直接用 VM 的 AOT 运行时dartaotruntime加载执行无需再用源码解释运行。构建产物所在的目录结构可由 pkg/dart2wasm/tool/utils.sh 确认Linux 下为sdk/out/配置如ReleaseX64macOS 下为sdk/xcodebuild/配置配置名默认为ReleaseHOST_ARCH其中宿主架构取自uname -mx86_64 →x64aarch64/arm64 →arm64。2.2 随 Dart SDK 一起构建如果构建整个 SDK% tools/build.py -mrelease -ax64 create_sdk构建完成后SDK 内的dart命令便自带 wasm 编译入口可以直接使用% dart compile wasm app.dart app.wasmdart compile wasm接受的参数与compile_benchmark脚本高度一致详见第四节是日常开发中从已安装 SDK 编译 Wasm 的推荐方式。2.3 构建产物与测试矩阵的对应关系从 tools/bots/test_matrix.json 中的dart2wasm_hostassertsfileset 可以看到 CI 实际消费的产物清单第 46-58 行附近out/ReleaseX64/dart2wasm.snapshot out/ReleaseX64/dart2wasm_asserts.snapshot out/ReleaseX64/dart2wasm_outline.dill out/ReleaseX64/dart2wasm_platform.dill out/ReleaseX64/dart2wasm_js_compatibility_outline.dill out/ReleaseX64/dart2wasm_js_compatibility_platform.dill out/ReleaseX64/dart2wasm_standalone_outline.dill out/ReleaseX64/dart2wasm_standalone_platform.dill这里出现的dart2wasm_asserts.snapshot带断言版、js_compatibility_platform.dillJS 兼容模式与standalone_platform.dillstandalone 模式分别对应本文后续将介绍的特殊模式构建它们在测试矩阵中以独立测试变体存在。三、本地开发compile_benchmark / run_benchmark 工作流3.1 两个核心脚本本地开发时官方提供了一对辅助脚本负责编译 运行闭环% pkg/dart2wasm/tool/compile_benchmark -O0 -g app.dart app.wasm % pkg/dart2wasm/tool/run_benchmark --d8 app.wasm第一个命令完成编译第二个命令在指定 JS 引擎中运行产物。这对命令的实际效果为用 dart2wasm 把app.dart编译为app.wasm以及配套的app.mjs启动模块因为传了-O0关闭优化不会调用 binaryen 的wasm-opt做 wasm2wasm 优化便于快速迭代因为传了-g保留调试信息保留 name section方便调试与性能剖析把产物交给 D8V8 的命令行 shell运行。历史小知识这两个脚本名字里带 benchmark 是历史遗留——它们同时被 golemDart 性能基准测试框架使用所以功能上兼顾了常规编译运行与基准测量两种用途。3.2 compile_benchmark 脚本内部逻辑从 pkg/dart2wasm/tool/compile_benchmark 的源码可以确认其行为细节产物定位脚本通过utils.sh确定sdk/outLinux或sdk/xcodebuildmacOS下的构建目录并默认使用Release$HOST_ARCH配置可用环境变量DART_CONFIGURATION覆盖。它还会自动带上--libraries-spec$SDK_DIR/sdk/lib/libraries.json。关键参数脚本自行解析不会透传给编译器参数行为--src从源码运行编译器$SDK_DIR/pkg/dart2wasm/bin/dart2wasm.dart跳过 AOT snapshot详见第四节--src --compiler-asserts源码运行 为编译器进程启用 VM asserts--enable-asserts并改用dart2wasm_asserts.snapshot相关的断言构建--compiler-asserts使用带断言的 AOT snapshotdart2wasm_asserts.snapshot并给 VM 加--enable-asserts-O0/--optimization-level0关闭优化并禁止binaryen 后处理RUN_BINARYEN0-O*如-O1、-O2开启优化并启用binaryen 后处理--js-compatibility切换平台 dill 为dart2wasm_js_compatibility_platform.dill并给编译器传--js-compatibility--standalone切换平台 dill 为dart2wasm_standalone_platform.dill并传--standalone--temp-output编译产物写入临时目录mktemp运行完自动清理适合快速验证--run[SHELL]编译完成后立即运行默认使用 d8--no-source-maps关闭 source map 生成--phasescfe,tfa,codegen指定编译器流水线阶段默认cfe,tfa,codegen详见下文--extra-compiler-option...透传任意选项给 dart2wasm 编译器本体--compile-benchmarkNAME进入基准测量模式输出编译耗时/内存/产物体积等指标golem 用途binaryen 后处理当启用优化且输出为.wasm时脚本会调用--phasesopt --wasm-opt$BINARYEN再次驱动编译器执行 wasm 优化阶段compile_benchmark 中的run_binaryen函数wasm-opt路径默认为out/wasm-opt。基准测量模式若指定--compile-benchmark脚本会用/usr/bin/time测量编译器耗时与峰值内存并统计.mjs、.wasm的原始体积与 gzip 体积输出形如NAME.Time.Dart2Wasm(CompileTime)、NAME.Size.wasm(CodeSize)、NAME.MemoryUse.Dart2Wasm(MemoryUse)的指标行。3.3 run_benchmark 脚本内部逻辑pkg/dart2wasm/tool/run_benchmark 负责把编译好的 Wasm 交给 JS 引擎执行支持三种引擎% pkg/dart2wasm/tool/run_benchmark --d8 app.wasm # V8 的 D8 % pkg/dart2wasm/tool/run_benchmark --jsshell app.wasm # SpiderMonkey 的 JS shell % pkg/dart2wasm/tool/run_benchmark --jsc app.wasm # JavaScriptCore 的 jsc引擎二进制来自检出目录D8 位于third_party/d8/os/arch/d8JSShell 位于third_party/firefox_jsshell/jsJSC 位于third_party/jsc/jsc——这正是第一节.gclient中checkout_javascript_engines: True的意义所在。脚本参数细节--shell-optionFLAG向引擎追加参数以.js结尾的位置参数视为额外加载的 JS 文件如 polyfill第一个.wasm是 Dart 程序主模块后续的.wasm会被当作FFI 线性内存模块linear memory modules依次实例化并以ffi模块名作为 imports 提供给 Dart 模块与 pkg/dart2wasm/bin/run_wasm.js 头部的说明一致其余参数透传给 Dart 程序的main函数。最终执行形如d8 run_wasm.js -- abs.mjs abs.wasm [ffi.wasm] -- dart-args其中run_wasm.js是跨引擎的通用启动器pkg/dart2wasm/bin/run_wasm.js通过探测readbufferD8、readFileJSC、readRelativeToScriptJSShell来区分引擎。四、从源码运行编译器免重新构建如果修改了pkg/dart2wasm/下的源码希望不重新执行tools/build.py直接验证改动可以跳过 AOT snapshot直接从源码运行编译器% pkg/dart2wasm/tool/compile_benchmark --src app.dart app.wasm--src模式实际执行的命令形如% out/dart --libraries-spec$SDK_DIR/sdk/lib/libraries.json \ pkg/dart2wasm/bin/dart2wasm.dart app.dart app.wasm即用开发用的dartVM 直接运行 pkg/dart2wasm/bin/dart2wasm.dart该入口只是转发到package:dart2wasm的main。若同时需要编译器自身的运行时断言可叠加% pkg/dart2wasm/tool/compile_benchmark --src --compiler-asserts app.dart app.wasm它会给编译器进程附加--enable-asserts便于在编译器代码内部触发断言检查。透传任意编译器参数--extra-compiler-option可以把任何 dart2wasm 选项原样转发例如% pkg/dart2wasm/tool/compile_benchmark --src \ --extra-compiler-option--omit-implicit-checks \ --extra-compiler-option--minify \ app.dart app.wasm查看全部可用选项% dart pkg/dart2wasm/bin/dart2wasm.dart --help编译器入口的用法是Usage: dart2wasm [options] infile.dart outfile.wasm见 pkg/dart2wasm/lib/dart2wasm.dart 的parseArguments且要求--libraries-spec与--platform必须二选一提供。五、dart2wasm 编译器核心选项详解所有 CLI 选项都在 pkg/dart2wasm/lib/dart2wasm.dart 顶部的options列表中声明参数解析与类型转换机制则在 pkg/dart2wasm/lib/option.dartFlag、IntOption、StringOption、UriOption、MultiValueOption等。以下按用途分组整理优化与体积选项说明-O/--optimization-levelN优化级别。-O0关闭优化同时跳过 binaryen-O1/-O2开启默认值由编译器内部translatorOptions.optimizationLevel决定--inlining/--inlining-limitN控制函数内联开关与内联上限--minify产物标识符压缩--strip-wasm/--no-strip-wasm是否裁剪 wasm 中的冗余信息默认开启可反向--no-strip-wasm--unique-constant-names常量为唯一命名默认 true可反向关闭--minify-interop-names压缩与 JS 互操作相关的导出名默认 false类型检查与错误信息选项说明--omit-explicit-checks省略显式类型检查--omit-implicit-checks省略隐式类型检查--omit-bounds-checks省略边界检查--omit-error-details省略错误详情信息--verify-type-checks校验类型检查逻辑开发用平台与模式选项说明--platformPATH指定平台 dill如dart2wasm_platform.dill--libraries-specPATH指定 SDK 库清单sdk/lib/libraries.json--js-compatibility启用 JS 兼容模式使用dart2wasm_js_compatibility_platform.dill代码中dart.wasm.js_compatibility环境变量会被置为true--standalone启用 standalone 模式使用dart2wasm_standalone_platform.dill环境变量dart.wasm.standalone置为true--supports-es6-modules/--no-supports-es6-modules声明运行环境是否支持 ES6 模块影响产物加载方式调试与诊断选项说明-g相关经--extra-compiler-option或--no-source-maps反向保留/生成 source map--no-source-maps关闭--print-kernel打印编译中的 Kernel IR--print-wasm打印生成的 wasm--verbose详细日志--dump-kernel-after-cfe/--dump-kernel-before-tfa/--dump-kernel-after-tfa在各流水线阶段转储 Kernel隐藏选项--dry-run只做前端解析/检查不产出 wasm配套pkg/dart2wasm/test/dry_run/用例多模块 / 延迟加载选项说明--enable-deferred-loading启用延迟加载deferred loading支持--deferred-mapURI输出延迟加载模块映射文件--use-load-ids使用 load id 管理模块--read-program-splitURI读取程序切分约束文件--enable-multi-module-stress-test-mode多模块压力测试模式FFI / 互操作选项说明--enable-experimental-ffi启用实验性 FFI 特性--enable-experimental-wasm-interop启用实验性 Wasm 互操作--enable-protobuf-tree-shaker/--enable-protobuf-mixin-tree-shakerprotobuf 相关树摇优化工程化选项选项说明-D keyvalue/--define设置编译期环境变量dart.前缀环境变量可被const bool.fromEnvironment等读取--enable-experimentNAME启用语言实验特性--packagesURI指定.packages配置--depfileFILE输出依赖文件--wasm-optPATH指定 binaryenwasm-opt路径--wasm-opt-process-limitNwasm-opt 并发进程数上限默认机器核数-1表示不限制--save-unopt保存未优化版本--phasescfe,tfa,codegen指定流水线阶段cfe前端 Kernel 生成、tfaTransformer/优化、codegenwasm 代码生成、optwasm-opt 优化注意dart2wasm 与 dart2js 共用类似的选项语义如--no-source-maps的一致性注释部分选项的默认值集中在 pkg/dart2wasm/lib/compiler_options.dart 的WasmCompilerOptions中可通过--help随时核对当前版本的实际取值。六、测试 Dart2Wasm6.1 两种测试入口官方测试命令支持两套入口区别在于是否考虑批准数据库approval database# 考虑 approval database发布/合入前建议使用 % dart tools/test.dart -n dart2wasm-linux-(optimized-){d8,jsc,jsshell} # 只考虑 status 文件 % tools/test.py -n dart2wasm-linux-(optimized-){d8,jsc,jsshell}注意 bash 的花括号展开会同时匹配多个测试配置例如dart2wasm-linux-d8、dart2wasm-linux-jsc、dart2wasm-linux-jsshell以及带optimized-前缀的优化变体。测试框架内部会复用上一节介绍的同一对脚本compile_benchmark编译 run_benchmark运行保证本地跑的与CI 跑的是同一套路径。6.2 测试矩阵中的 dart2wasm 变体从 tools/bots/test_matrix.json第 523-584 行可以看到 dart2wasm 在 CI 中的主要测试变体它们同样可作为本地测试命名的参考变体模式选项说明dart2wasm-asserts-(linux\|mac\|win)-(d8\|jsshell\|jsc\|chrome\|firefox\|safari)-O0enable-asserts: truehost-asserts: true基础测试 宿主断言dart2wasm-(...)-(...)-O0host-asserts: true基础测试dart2wasm-(...)-optimized-(...)-O1 --no-strip-wasmuse-sdk: truehost-asserts: false优化产物测试且使用 SDK 内dart compile wasmdart2wasm-asserts-minified-(...)--minifyenable-asserts: trueuse-sdk: false压缩产物测试dart2wasm-(...)-jscm-(...)-O0 --js-compatibilityJS 兼容模式测试dart2wasm-(...)-standalone-(chrome\|firefox\|safari)-O0 --standaloneuse-sdk: falsestandalone 模式测试CI 侧还配套了 dart2wasm 的单测pkg/dart2wasm包内测试如 pkg/dart2wasm/test/ir_test.dart、pkg/dart2wasm/test/self_compile_test.dart、dry-run 测试 pkg/dart2wasm/test/dry_run/dry_run_test.dart以及基于 runtime/tools/dartfuzz/flag_fuzzer_dart2wasm.dart 的编译器选项模糊测试。6.3 用 SDK 版dart compile wasm跑测试默认情况下测试框架调用的是构建产物中的编译器快照。官方文档提示可以改用 SDK 自带的dart compile wasm% dart tools/test.dart --use-sdk -n dart2wasm-linux-d8这一行为也可以在 tools/bots/test_matrix.json 中按配置覆盖如use-sdk: true/false字段dart2wasm-...-optimized-...变体正是use-sdk: true的代表。七、相关文档与进一步阅读pkg/dart2wasm/docs/目录还提供了围绕 dart2wasm 的其他专题文档可按需深入pkg/dart2wasm/docs/benchmarking.md基于 linux-perf 对 dart2wasm 应用进行性能剖析pkg/dart2wasm/docs/imports_and_exports.mdWasm 模块导入导出的互操作约定pkg/dart2wasm/docs/inspecting_wasm.md如何用 pkg/dart2wasm/bin/wasm2wat.dart 等工具检查生成的 wasmpkg/dart2wasm/docs/standalone.mdstandalone 模式脱离浏览器/JS 宿主运行的说明pkg/dart2wasm/docs/wasm_detection.md运行时检测 Wasm 支持能力pkg/dart2wasm/docs/v8.md构建 V8 用于本地开发/测试。结语从.gclient的可选工具链配置到tools/build.py构建编译器本体再到compile_benchmark/run_benchmark这对日常开发脚本、--src源码直跑模式以及test.dart/test.py两套测试入口本文完整复现了官方 build_and_test.md 的开发工作流并用 compile_benchmark、run_benchmark、option.dart、lib/dart2wasm.dart、tools/bots/test_matrix.json、DEPS 等仓库源码对每个环节做了底层印证。无论是想快速体验dart compile wasm还是深入 dart2wasm 编译器本身的开发调试这套流程都能直接落地。赞分享编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载相关推荐CANN graph-autofusion 源码构建全指南从环境准备到编译、安装与测试验证CANN graph autofusion 源码构建全指南从环境准备到编译、安装与测试验证 本文以 CANN graph autofusion 开源仓库的 d人工智能模型编译AscendHackMyResume 本地构建指南从搭建开发环境、源码编译到测试与提交 PRHackMyResume 本地构建指南从搭建开发环境、源码编译到测试与提交 PR HackMyResume 是一个用 Node.js 实现的开源简历生成命令行CLI开发工具Skia CanvasKit 构建与测试实战从 emscripten 编译、本地调试到 Karma 测试与 WASM 性能验证Skia CanvasKit 构建与测试实战从 emscripten 编译、本地调试到 Karma 测试与 WASM 性能验证 本篇指南基于仓库中 modul图形学图像处理上一篇如何在5分钟内搭建本地OpenAI-Edge-TTS服务Docker快速部署指南下一篇react-big-calendar可访问性测试axe-core与WCAG合规性验证创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考