工具链

原生扩展 ABI v1 与 v2

以稳定 ABI、类型值、持久回调和父子资源封装宿主能力。

ABI v1 保留原有 UTF-8 JSON、同步回调和不透明资源,入口符号仍为yanxu_native_module_v1,结构布局不变。1.1.7 新增独立的 ABI v2 入口yanxu_native_module_v2,用于 GUI 等需要字节串、长期回调、异步事件和父子资源的包;运行时不会把两种描述符混读。

包声明

[]
格式 = 2
名 = "图像扩展"
版 = "1.0.0"
言序 = ">=1.1.7"
入口 = "src/图像.yx"

[原生]
ABI = 1

[原生.macos.aarch64]
文件 = "native/aarch64-apple-darwin/libimage.dylib"
校验和 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"

解析器只为当前目标选择一个制品,并把目标、路径与 SHA-256 固定到锁文件。扩展包不能把授权传给使用方;顶层应用仍须显式声明[权限].原生扩展 = true

加载门禁

运行时只在以下条件全部满足时加载动态库:

  1. 顶层应用授权原生扩展;
  2. 锁定目标与yanxu version --json报告完全一致;
  3. 制品 SHA-256 与清单和锁文件一致,已验证字节被复制到进程私有、内容寻址且只读的临时路径后再加载;
  4. yanxu_native_module_v1描述符的 ABI 版本、结构大小、指针、UTF-8 和名称唯一性都有效。

WASI 始终拒绝动态库。言序不会自动执行第三方构建脚本、安装钩子或 Shell 命令。单次 JSON 输入/输出上限为 16 MiB,每类描述符最多 1024 项;空指针、异常长度、JSON 解析失败和未知输出类型都会走 RAII 释放路径,资源析构至多执行一次。

动态库是与宿主进程同等权限的受信任机器码,语言沙箱无法完全约束它。原生扩展 = true只是一道显式授权门禁,不会把不可信动态库变安全;发布者必须审查来源、目标和摘要,并在 Windows、Linux、macOS 分别验证装载策略。

yanxu native --json
yanbao audit

native --json只查询当前运行时能力,不授予权限。发布者应为声明的每个 Windows、Linux、macOS 目标分别构建、计算校验和并测试拒绝路径。

ABI v2 值、回调与资源

YanxuValueV2覆盖空、布尔、64 位整数、有限浮点、UTF-8 文、不可变字节、列、典、原生资源、回调和结构化错误。参数只在调用期间借用,模块返回值由模块释放器恰好释放一次;深度、元素数、单项和总字节都受硬上限约束。

需要跨调用保存闭包时,模块必须成对调用callback_retaincallback_release。后台线程只能callback_post;宿主深拷贝参数进容量有界队列,言序闭包仅由 VM 所有者线程的pump执行。代际句柄拒绝释放后使用和 ID 复用悬挂。

资源记录所属扩展、事件循环、线程、父子关系、关闭状态、generation 与析构器。关闭父资源会先关闭子项,重复关闭与 VM 清理不会重复析构。稳定错误覆盖错误线程、已运行/已退出事件循环、满队列、释放回调、关闭资源和重入调用。

官方yanxu-gui只有在模块身份严格匹配时可凭图形界面窄化装载;其他原生模块仍要求原生扩展。剪贴板、文件对话框、通知、托盘、外部地址和全局快捷键必须单独授权。