架构

本指南说明 luna_thread 的 MoonBit 包、C 运行时和 JavaScript 插件如何组合在一起,以及哪些整数编码会跨越外部函数接口。各个包页面详细描述了每个 MoonBit 包。

层次

规范列出了两条实现路径:

MoonBit facade -> MoonBit C FFI  -> C wrapper  -> C runtime
MoonBit facade -> MoonBit JS FFI -> JS wrapper -> N-API addon -> C runtime

第一条路径已经存在。第二条路径止步于 MoonBit 一侧:backend/js 只给出 JavaScript 目标,js/ 中的插件只导出一个 runtimeName 函数。

MoonBit 包之间的依赖没有环:

包导入
shared只有核心库
planshared
workflowplan, shared
backend/jsplan, shared
backend/nativeplan, shared, workflow
corebackend/native, plan, shared, workflow
  • shared 包含其他所有包都使用的词汇:后端目标、执行模式、顺序保证、执行策略及其验证、运行时能力表,以及 C 请求结构体的整数编码镜像。
  • plan 描述作用于带类型输入域的单个数据并行操作,并按 v1 子集检查它。
  • workflow 描述一个任务图,其节点可以是计算计划,也可以是绑定到能力的同步步骤,并检查其结构。
  • backend/native 把计划转换为带类型的原生请求,调用 C 内核,并把工作流编组后交给 C 调度器。
  • 根包 core 以默认值重新导出常用入口,并把提交路由到原生后端。

C 运行时

运行时由一个 C 文件和一个头文件组成:

文件作用
native/include/luna_thread_runtime.h公开的 C API:状态码、请求结构体、工作流类型。
native/src/runtime.c内核、验证和工作流调度器。
luna_thread/backend/native/ffi_runtime_impl.c同一份源码,作为 MoonBit 原生桩编译;它只有 #include 路径不同。
luna_thread/backend/native/ffi_runtime_bridge.c把 MoonBit 参数转换为请求结构体的 luna_mbt_* 包装函数。
luna_thread/backend/native/ffi_stub.cluna_mbt_* 包装函数的声明。
native/tests/smoke.c内核及其失败状态的 C 冒烟测试。

运行时的两份副本必须手工保持一致。

有两种构建方式。moon 用系统 C 编译器编译桩,且不带 OpenMP 选项,因此 #pragma omp 循环在调用线程上运行,而工作流调度器仍会启动 POSIX 线程。CMake(make native-configure、make native-build)在开启 LUNA_THREAD_ENABLE_OPENMP 时把 native/ 构建为启用 OpenMP 的静态库,并一同构建冒烟测试。原生后端设计解释了这两种执行模型。

跨越接口的编码

所有枚举都以 Int 的形式跨越 C 接口。MoonBit 一侧在 backend/native 中映射它们(状态码则在 shared 中)。

状态码

编码C 名称MoonBit NativeStatus
0LUNA_THREAD_STATUS_OKOk
1INVALID_ARGUMENTInvalidArgument
2UNSUPPORTED_BACKENDUnsupportedBackend
3UNSUPPORTED_MODEUnsupportedMode
4UNSUPPORTED_VALUE_TYPEUnsupportedValueType
5UNSUPPORTED_REDUCTION_KERNELUnsupportedReductionKernel
6OVERFLOWOverflow
7NULL_POINTERNullPointer
8UNSUPPORTED_RUNTIME_PRIMITIVE无
9RUNTIME_BROKEN无
10CHANNEL_EMPTY无
11CHANNEL_CLOSED无
12MUTEX_PROTOCOL_ERROR无
13CONDVAR_PROTOCOL_ERROR无
14BARRIER_BROKEN无

编码 8 到 14 只来自工作流运行时;WorkflowResult::status 以原始整数携带它们。

工作流编码

编码节点种类能力种类边种类运行时状态
0ComputeOwnedBufferDataDependencySubmitted
1SpawnSharedReadViewControlDependencyRunning
2JoinAtomicCellOwnershipTransferCompleted
3SendMutexSynchronizationDependencyFailed
4RecvCondvarRejected
5LockRwLock
6UnlockSemaphore
7WaitBarrier
8SignalChannel
9BarrierOpaque
10ReadShared
11WriteShared

值类型 I32 为 0,I64 为 1;归约内核 Sum 为 0,Min 为 1,Max 为 2。

JavaScript 插件

js/ 是一个 node-gyp 项目(make js-install、make js-build),其 C 源码只注册一个函数 runtimeName,返回 "luna_thread_addon"。它还没有链接 C 运行时。

规范

doc/attachments/moonbit_parallel_spec/main.typ 是具有规范效力的英文规范,main.zh_CN.typ 是其中文镜像;make docs 会编译两者。规范定义了工作流演算、所有权转移、ABI 布局以及一致性义务。实现覆盖了第一部分的数据模型和验证,以及其中一个子集的原生实现;各包的设计页面说明具体覆盖了哪些部分。docs/spec-review-report-zh.md 用中文记录了评审意见。

仓库布局

路径内容
luna_thread/MoonBit 模块(moon.mod)及其包。
native/C 运行时、头文件、CMake 构建和冒烟测试。
js/Node.js 插件的脚手架。
doc/本手册、其翻译和规范。
scripts/check-env.sh检查 MoonBit、C、Node.js 和 Typst 工具链。
Makefile用于检查、构建原生运行时和插件以及编译规范的快捷命令。