拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Boa 项目架构总览:Rust 编写的可嵌入 ECMAScript 引擎与 13 个核心 Crate 全解析

编程语言编译器开发工具【免费下载链接】boaBoa is an embeddable Javascript engine written in Rust.项目地址https://gitcode.com/gh_mirrors/bo/boa点击查看免费下载导读本文以仓库内 core/runtime/ABOUT.md 为骨架系统梳理 Boa 作为一款用 Rust 编写的可嵌入 ECMAScript 引擎的项目定位、执行链路与完整 crate 架构。读完你将掌握 13 个核心 crateboa_ast、boa_engine、boa_parser、boa_runtime、boa_wintertc等各自的职责边界、源码位置与协作关系并能在自己的 Rust 项目中按需组装这些 crate 构建 JS 运行时。一、Boa可嵌入的 Rust ECMAScript 引擎Boa 是一个开源、实验性质的 ECMAScript 引擎用 Rust 编写负责 JavaScript 的词法分析lexing、语法解析parsing与执行executing整条链路。其定位是可嵌入embeddable开发者不依赖完整的浏览器或 Node.js 环境就可以在自己的 Rust 程序中直接执行 ECMAScript 代码。按照 core/runtime/ABOUT.md 的表述Boa 目前支持 ECMAScript 语言规范中的部分语言特性语言符合度conformance数据持续在官方 conformance 页面公开跟踪。从仓库当前工作区配置 Cargo.toml 看项目版本为0.22.0使用 Rustedition 2024最低 Rust 版本要求为1.91.0采用 Cargo workspace 组织members覆盖core/*、cli、examples、tests/*、tools/*、ffi/*、benches与utils/*等全部子目录。Boa 的整体执行链路可从各 crate 源码推断出清晰的流水线JavaScript 源码 │ boa_parserLexer Parser ▼ ASTboa_ast │ boa_engineBytecompiler ▼ 字节码Bytecode │ boa_engineVirtual Machine ▼ 执行结果 / 内置对象boa_engine 内置对象 boa_gc 管理对象生命周期这条链路的每一环都对应仓库中一个独立 crate下一节将逐一展开。二、快速体验CLI、REPL 与内嵌执行2.1 用 CLI 执行脚本与进入 REPLBoa 的 CLI 实现位于boa_cli源码见 cli/src/main.rs自带文件执行与 REPL交互式解释器能力。仓库 README.md 给出最直接的运行方式在项目根目录执行cargo run -- test.js其中test.js是任意包含合法 JS 代码的文件路径。不带文件参数直接运行则会进入 REPL。README 还给出了用 release 模式跑 v8 基准脚本的示例cargo run --release -p boa_cli -- bench-v8/combined.js2.2 CLI 命令行选项boa_cli通过 clap 解析命令行参数完整选项如下见 README.mdUsage: boa [OPTIONS] [FILE]... Arguments: [FILE]... The JavaScript file(s) to be evaluated Options: --strict Run in strict mode -a, --dump-ast [FORMAT] Dump the AST to stdout with the given format [possible values: debug, json, json-pretty] -t, --trace Dump the AST to stdout with the given format --vi Use vi mode in the REPL -O, --optimize --optimizer-statistics --flowgraph [FORMAT] Generate instruction flowgraph. Default is Graphviz [possible values: graphviz, mermaid] --flowgraph-direction FORMAT Specifies the direction of the flowgraph. Default is top-top-bottom [possible values: top-to-bottom, bottom-to-top, left-to-right, right-to-left] --debug-object Inject debugging object $boa --test262-object Inject the test262 host object $262 -m, --module Treats the input files as modules -r, --root ROOT Root path from where the module resolver will try to load the modules [default: .] -h, --help Print help (see more with --help) -V, --version Print version这些选项覆盖了调试--dump-ast、--flowgraph、--debug-object、模块-m/--module、-r/--root与测试--test262-object注入$262宿主对象等场景与boa_runtime的test262特性配合可用于跑 Test262 用例。2.3 在自己的 Rust 程序中嵌入 Boa嵌入使用只需依赖boa_engine。以当前工作区版本为准见 Cargo.toml[dependencies] boa_engine 0.22.0最小执行示例取自 core/engine/src/lib.rsuse boa_engine::{Context, Source}; fn main() { let js_code r# let two 1 1; let definitely_not_four two 2; definitely_not_four #; // 实例化执行上下文 let mut context Context::default(); // 解析并执行源码 match context.eval(Source::from_bytes(js_code)) { Ok(res) println!({}, res.display()), Err(e) eprintln!(Uncaught {e}), }; }三、Boa Crates 全解析core/runtime/ABOUT.md 的核心内容是 Boa 发布的完整 crate 清单。下面逐项给出职责说明、源码位置与关键实现证据。Crate职责源码位置boa_cliCLI 与 REPL 实现cli/src/main.rsboa_astECMAScript 抽象语法树core/ast/src/lib.rsboa_engineECMAScript 内置对象与执行core/engine/src/lib.rsboa_gc垃圾收集器core/gc/src/lib.rsboa_icu_providerICU4X 数据提供器core/icu_provider/src/lib.rsboa_interner字符串驻留string internercore/interner/src/lib.rsboa_macros过程宏集合core/macros/src/lib.rsboa_parser词法分析器与解析器core/parser/src/lib.rsboa_runtimeWebAPI 特性示例运行时core/runtime/src/lib.rsboa_stringECMAScript 字符串实现core/string/src/lib.rsboa_wintertcWinterTCTC55最小公共 Web APIcore/wintertc/src/lib.rstag_ptr可携带usize标签的指针工具utils/tag_ptr/src/lib.rssmall_btreeSmallBTreeMap数据结构utils/small_btree/src/lib.rs3.1 语言前端boa_parser与boa_astboa_parser实现针对最新 ECMAScript 语言规范的 Lexer 与 Parser覆盖规范的词法文法与句法文法对外暴露Lexer、Parser、Source与Error等公共类型。解析产物交给boa_ast。boa_ast实现 ECMAScript 抽象语法树代表规范中定义的 Parse Nodecore/ast/src/lib.rs。AST 主体分为三大部分Declaration声明、Expression表达式、Statement语句其中StatementList是最主要的 Parse Node负责把三者组合成完整 AST。规范中一些仅用于触发早期错误Early Errors、不影响求值的语法产生式并未在 AST 中建模——这是从源码结构与注释中可以确认的设计取舍。3.2 执行引擎boa_engine、boa_gc、boa_interner、boa_stringboa_engine是执行核心实现 ECMAScript 标准库的内置对象、执行上下文Context、字节码编译器bytecompiler与虚拟机VMcore/engine/src/lib.rs。它还通过 feature 开关提供可选能力serdeAST 序列化/反序列化、profilermeasureme 性能剖析、intlECMA-402Intl国际化对象等。仓库内 core/engine/src/bytecompiler 与 core/engine/src/vm 目录分别承载字节码生成与虚拟机执行逻辑。boa_gc是 Boa 的标记-清除mark-sweep垃圾收集器通过Trace与Finalizetrait 描述被 GC 管理的值core/gc/src/lib.rs。它提供Gc、GcCell、WeakGc、Ephemeron、WeakMap等指针类型与可派生宏#[derive(Trace, Finalize)]宏实现见boa_macros是引擎对象内存管理的底层支撑。boa_interner是字符串驻留器为编译器性能而生把频繁重复的标识符与字符串字面量映射为唯一的usize符号Symbol比较与存储都退化为整数操作显著降低内存占用、提升编译器性能core/interner/src/lib.rs。boa_string实现 ECMAScript 字符串Latin1 或 UTF-16 编码、引用计数、不可变core/string/src/lib.rs。该设计贴近 JS 引擎对字符串的高频拷贝与共享需求是boa_engine中JsString的基础类型。3.3 运行时与 WebAPIboa_runtime、boa_wintertc、boa_icu_providerboa_runtime是 Boa 的示例运行时为boa_engine补充 WebAPI 层面的基础运行时特性供运行时实现者参考与复用见 core/runtime/src/lib.rs。它提供console、fetch、AbortController、process、TextEncoder/TextDecoder、URL、结构化克隆等能力并通过统一的register入口注册到Context。详细机制见第四节。boa_wintertc实现 WinterTCTC55Minimum Common Web API——Ecma 国际技术委员会 TC55 推动的一套所有服务端 JS 运行时Deno、Bun、Cloudflare Workers、Node.js 等共同实现的基础 Web 平台 API 基线目标是可移植的服务端 JavaScriptcore/wintertc/src/lib.rs。它只依赖boa_engine是独立 crateboa_runtime依赖它并把其 API 再导出用户无需额外配置即可获得 TC55 兼容能力。boa_icu_provider导出默认数据提供器包含支持Intl功能所需的 locale 数据ICU4X 数据格式即core/icu_provider/data目录下的.postcard文件覆盖 Unicode CLDR 的 modern locale 子集如需全量 locale可参照 ICU4X 指南生成自定义数据提供器并接入引擎core/icu_provider/src/lib.rs。3.4 工具与宏boa_cli、boa_macros、tag_ptr、small_btreeboa_cli是boa_engine的 CLI 实现自带文件执行与 REPLcli/src/main.rs即前文第二节所述的命令行入口。boa_macros提供 Boa 使用的过程宏源码目录 core/macros/src 包含class.rsJS 类绑定、embedded_module_loader.rs嵌入模块加载器、module.rs、value.rs与utils.rs等模块其中Trace/Finalize派生宏被boa_gc直接对外再导出。tag_ptr是一个通用工具库让指针可以携带一个usize类型的标签utils/tag_ptr/src/lib.rs常用于在指针低位编码额外信息以节省内存。small_btree提供SmallBTreeMap集合初始以内联数组inline vec为后盾存储当元素数量超过ARRAY_SIZE时自动切换为堆上映射从而在大多数时候很小的场景避免堆分配同时仍支持更大的集合utils/small_btree/src/lib.rs。四、深入boa_runtimeWebAPI 注册机制与 WinterTC 再导出由于本文所依托的文档正是boa_runtimecrate 的 ABOUT 文档本节聚焦其特有的实现细节。4.1 两条注册入口boa_runtime暴露两个核心注册函数见 core/runtime/src/lib.rsregister一次性注册全部内置 WebAPI 对象与函数外加调用方传入的扩展。默认会注册Base64Extensionatob/btoa、TimeoutExtension定时器、EncodingExtension编解码、MicrotaskExtensionqueueMicrotask、StructuredCloneExtensionstructuredClone并在对应 feature 开启时追加UrlExtension、ProcessExtension、AbortControllerExtension与用户扩展。register_extensions只注册调用方提供的扩展适合分批按需注入。两者都返回JsResult()在对象注册失败时返回 JS 错误。4.2 扩展点Extensionsboa_runtime以扩展 trait 体系组织 WebAPI见 core/runtime/src/extensions.rs公共 trait 为RuntimeExtension。核心扩展包括ConsoleExtension注册console对象支持自定义日志器Console::register_with_logger可注入DefaultLogger、NullLogger或自定义LoggerFetchExtension在启用fetchfeature 时可用默认使用基于 Reqwest 的BlockingReqwestFetcher需reqwest-blockingfeatureProcessExtensionprocessfeature进程相关 API以及Base64Extension、EncodingExtension、MicrotaskExtension、StructuredCloneExtension、TimeoutExtension、UrlExtension、AbortControllerExtension等。4.3 注册一个最简consoleboa_runtime库文档给出了最小示例见 core/runtime/src/lib.rsuse boa_engine::{Context, Source}; use boa_runtime::Console; use boa_runtime::console::DefaultLogger; // 创建上下文 let mut context Context::default(); // 注册 console 对象DefaultLogger 将错误写入 STDERR其余日志写入 STDOUT Console::register_with_logger(DefaultLogger, mut context) .expect(the console object shouldnt exist yet); // 执行 JS let js_code console.log(Hello World from a JS code string!); match context.eval(Source::from_bytes(js_code)) { Ok(res) println!({}, res.to_string(mut context).unwrap().to_std_string_escaped()), Err(e) eprintln!(Uncaught {e}), };4.4 一次性注册全部 WebAPI 并调用fetchregister的完整用法见 core/runtime/src/lib.rsuse boa_engine::{Context, Source}; let mut context Context::default(); boa_runtime::register( ( boa_runtime::extensions::ConsoleExtension::default(), // fetch 特性开启时可注入基于 Reqwest 的阻塞式 fetcher boa_runtime::extensions::FetchExtension( boa_runtime::fetch::BlockingReqwestFetcher::default(), ), ), None, mut context, ); let js_code r# fetch(https://example.com/) .then(response response.text()) .then(html console.log(html)) #; match context.eval(Source::from_bytes(js_code)) { Ok(res) { // 结果是 Promise需要阻塞等待其 resolve res.as_promise() .expect(Should be a promise) .await_blocking(mut context) .expect(Should resolve()); println!({}, res.to_string(mut context).unwrap().to_std_string_escaped()); } Err(e) eprintln!(Uncaught {e}), };注意这里使用阻塞式 fetcher 是为了在不引入异步运行时的情况下演示await_blocking阻塞当前线程等待 Promise 完成。4.5 WinterTCTC55再导出boa_runtime将boa_wintertc的以下模块原样再导出保持既有用户的单一、不变导入路径见 core/runtime/src/lib.rsbase64—atob与btoaclone—structuredCloneconsole—console对象microtask—queueMicrotaskinterval— 定时器 APIsetTimeout、clearTimeout、setInterval、clearInterval保留历史命名intervalstore—structuredClone背后的序列化核心也就是说boa_runtime用户无需额外依赖boa_wintertc即可获得完整的 TC55 最小公共 Web API 能力。4.6 feature 开关boa_runtime的功能按 feature 开关裁剪见 core/runtime/Cargo.tomlFeature说明default启用boa_engine/float16、boa_engine/temporal、boa_engine/xsum、fetch、urlalldefaultreqwest-blockingurl启用URL相关实现依赖urlcratefetch启用 fetch 相关实现依赖url、either、http、serde_jsonreqwest-blocking启用基于 Reqwest 阻塞 API 的 fetcherBlockingReqwestFetcherprocess启用process模块与ProcessExtensionannex-b透传boa_engine/annex-bECMAScript Annex B 兼容性扩展test262启用$262test262 harness 宿主对象支持依赖bus仓库内core/runtime的测试也按此组织fetch/、message/、process/、text/、url/等目录均含对应模块的测试如 core/runtime/tests/clone.rs 覆盖structuredClone的各类对象克隆行为fetch/目录下则有请求/响应/头部的单元测试与 e2e 测试可作行为验证参考。五、在自己的项目中按需组装 Boa 的 CratesBoa 的 workspace 把各 crate 组织成清晰的依赖层次见 Cargo.toml执行核心boa_engine依赖boa_ast、boa_parser、boa_gc、boa_interner、boa_string、boa_icu_provider等运行时层boa_runtime依赖boa_engine与boa_wintertc再导出后者 API工具层tag_ptr、small_btree是通用工具库被核心 crate 复用。按需组装的方式很简单[dependencies] boa_engine 0.22.0 # 仅需基础 JS 执行能力 boa_runtime 0.22.0 # 需要 console / fetch 等 WebAPI 能力启用boa_runtime的defaultfeatures 即包含fetch与url如使用BlockingReqwestFetcher需追加reqwest-blocking若实现自己的运行时并用 Test262 验证可启用test262注入$262宿主对象。六、结语Boa 通过精细的 crate 划分把可嵌入 ECMAScript 引擎拆解为语言前端boa_parser、boa_ast、执行引擎boa_engine、boa_gc、boa_interner、boa_string、国际化数据boa_icu_provider、WebAPI 运行时boa_runtime、boa_wintertc与通用工具tag_ptr、small_btree、boa_macros几个职责清晰、可独立复用的层次。无论是想在其上构建自己的 JS 运行时还是研究 Rust 语言实现的 ECMAScript 引擎都可以从 core/runtime/ABOUT.md 这份 crate 地图出发按需深入对应源码模块。赞分享编程语言编译器开发工具【免费下载链接】boaBoa is an embeddable Javascript engine written in Rust.项目地址https://gitcode.com/gh_mirrors/bo/boa点击查看免费下载相关推荐Boa一款用Rust编写的嵌入式实验性JavaScript引擎Boa一款用Rust编写的嵌入式实验性JavaScript引擎 1. 项目基础介绍 Boa是一个由Rust编程语言编写的嵌入式实验性JavaScript引擎。编程语言编译器开发工具九大网盘一键直链下载开源浏览器脚本终极解决方案九大网盘一键直链下载开源浏览器脚本终极解决方案 你是否厌倦了网盘下载的龟速体验是否对强制安装臃肿客户端感到厌烦今天我要向你介绍一个能够彻底改变你网盘使用习编程语言编译器开发工具Boa引擎终极指南Rust编写的实验性JavaScript引擎完全解析Boa引擎终极指南Rust编写的实验性JavaScript引擎完全解析 Boa是一个用Rust编写的实验性JavaScript引擎支持超过90%的最新编程语言编译器开发工具上一篇Rack Mini Profiler 使用教程下一篇安卓模拟器怎么在浏览器里打开用 Docker-Android 从零跑通创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门