菜单

核心 JavaScript 运行时

相关源文件

核心 JavaScript 运行时在 Bun 中提供了基础的 JavaScript 执行环境,它构建在 JavaScriptCore 之上,并拥有大量的自定义绑定。该系统建立了 Bun 的原生 Zig/C++ 实现与 JavaScript 代码执行之间的桥梁,负责管理 VM 的生命周期、全局对象的初始化以及核心 API 绑定。

有关事件循环和异步执行的信息,请参阅 ZigGlobalObject and Event Loop。有关模块加载和解析机制的信息,请参阅 Module System and Loading。有关 VM 内存管理和垃圾回收的信息,请参阅 JavaScript VM Lifecycle。有关进程级 API 和环境集成的信息,请参阅 Process API and Environment

JavaScriptCore 集成

Bun 的运行时构建在 WebKit 的 JavaScriptCore 引擎之上,提供高性能的 JavaScript 执行环境。集成涉及自定义全局对象、广泛的 API 绑定和细致的内存管理协调。

核心运行时架构

来源: src/bun.js/bindings/ZigGlobalObject.h93-400 src/bun.js/bindings/ZigGlobalObject.cpp860-890 src/bun.js/bindings/headers.h20-40

ZigGlobalObject - 核心运行时

Zig::GlobalObject 类是 Bun 中 JavaScript 执行的主要全局对象,它通过 Bun 特有的 API 和 Node.js 兼容层扩展了 JavaScriptCore 的功能。

运行时初始化流程

来源: src/bun.js/bindings/ZigGlobalObject.cpp259-325 src/bun.js/bindings/ZigGlobalObject.cpp860-886 src/bun.js/bindings/ZigGlobalObject.cpp912-975

全局对象结构

GlobalObject 维护着许多用于不同 API 类别的惰性初始化结构

API 类别关键结构目的
核心运行时m_bunVM, m_scriptExecutionContextVM 引用和执行上下文
Web APIm_subtleCryptoObject, m_performanceObject标准 Web 平台 API
Node.js 兼容性m_processObject, m_requireMapNode.js 兼容层
m_lazyReadableStreamPrototypeMap流 API 和控制器
测试m_lazyTestModuleObjectJest 兼容的测试框架
加密m_JSCryptoKey,各种加密结构加密 API

来源: src/bun.js/bindings/ZigGlobalObject.h200-320 src/bun.js/bindings/ZigGlobalObject.h425-800

运行时绑定架构

绑定系统通过涉及 C++ 包装函数、Zig 实现和自动代码生成的多种分层方法,提供了 JavaScript 和原生代码之间的无缝互操作性。

绑定层架构

来源: src/bun.js/bindings/bindings.cpp149-200 src/bun.js/bindings/headers.h45-150 src/bun.js/bindings/webcore/DOMIsoSubspaces.h18-75

类型转换和封送

运行时在 JavaScript 值和原生类型之间提供了广泛的类型转换

  • 原始类型:数字、字符串、布尔值,具有优化的转换路径
  • 对象类型:DOM 对象、ArrayBuffers、类型化数组,具有正确的生命周期管理
  • 函数类型:回调函数,具有正确的 this 绑定和错误传播
  • Promise 类型:与 JSPromise 和 JSInternalPromise 集成,用于异步操作

关键转换函数包括 JSValue::asString()JSValue::asArrayBuffer_(),以及针对 Web API 类型(如 FetchHeadersAbortSignal)的专用转换器。

来源: src/bun.js/bindings/headers.h194-300 src/bun.js/bindings/bindings.cpp610-690

内存管理集成

运行时与 JavaScriptCore 的垃圾回收器仔细协调,以确保 JavaScript/原生边界之间的正确对象生命周期管理。

GC 集成点

  1. 对象访问:混合对象的自定义 visitChildren 实现
  2. 弱引用:当 JS 对象被回收时,原生资源的正确清理
  3. ISO 子空间:为不同对象类型提供的专用内存区域
  4. 写屏障:确保跨堆引用的 GC 正确性

DOMIsoSubspacesDOMClientIsoSubspaces 类管理不同对象类别的专用内存分配,提供性能优化和内存安全。

来源: src/bun.js/bindings/webcore/DOMIsoSubspaces.h12-20 src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h11-20 src/bun.js/bindings/ZigGlobalObject.h161-185

错误处理和异常管理

运行时提供了全面的错误处理,将 JavaScript 异常与原生错误条件连接起来

  • 异常传播:将 C++ 异常正确地转发到 JavaScript
  • 堆栈跟踪生成:与 JavaScriptCore 的堆栈跟踪机制集成
  • 错误代码映射:在系统错误代码和 JavaScript Error 对象之间进行转换
  • 异步错误处理:对 Promise 拒绝和异步上下文错误进行特殊处理

computeErrorInfoWithPrepareStackTrace 函数族提供了与 V8 兼容的错误格式化,并支持源映射。

来源: src/bun.js/bindings/ZigGlobalObject.cpp331-450 src/bun.js/bindings/ZigGlobalObject.cpp687-810