路线图 · 尚未实现
扩展系统路线图
了解扩展安装、加载、进程协议与 Redis 扩展示例的后续设计;这些能力尚未在 v1.0 实现。
先看状态:v1.0 尚不支持扩展
| 能力 | v1.0 状态 | 计划 |
|---|---|---|
| 扩展模块名与核心 contract | 已预留内部边界 | v1.0 |
| 本地扩展安装与加载 | 未实现 | v1.1 |
| 官方 office 扩展 | 未实现 | v1.2 |
| 公开 Native ABI | 未承诺 | Runtime 稳定后按需评估 |
v1.0 已允许带点的模块名,例如 import office.excel;未安装的模块会得到 ModuleNotFoundError。这只是为未来扩展保留语法空间,不代表模块已经存在。
版本路线
v1.0 Core contract 与命名空间预留
v1.1 Process Extension Protocol + 本地包安装
v1.2 官方 office 扩展验证协议
以后 Runtime 稳定后再评估公开 Native ABI核心继续负责 Pipe、Value、Stream、Error、取消、副作用与资源生命周期;扩展只注册新的 callable、类型或数据流,不得改变 HHY 语法或另建一套 Stream 语义。
计划中的安装、查看与移除
# 计划中的命令;v1.0 不可执行
hhy install ./hhy-redis
hhy list
hhy remove redis| 步骤 | 计划行为 |
|---|---|
| install | 读取本地 hhy.toml,校验版本、可执行文件与完整性哈希,展示权限后安装 |
| load | 脚本 import 时启动隔离扩展进程,握手并注册 callable |
| list | 列出本地已安装包、版本、协议和权限 |
| remove | 移除包记录并清理不再使用的扩展资源 |
计划中的 hhy.toml
[package]
name = "redis"
version = "0.1.0"
requires_hhy = ">=1.1,<2.0"
[extension]
kind = "process"
command = "bin/hhy-redis"
protocol = "1"
[capabilities]
read = []
write = []
network = ["redis.example.com:6379"]
process = false包名提供唯一顶级命名空间;hhy.* 与 std.* 由语言保留。安装器只授予清单声明且经用户确认的最小能力,扩展升级新增权限时必须重新确认。
扩展如何被加载
v1.1 计划优先采用进程扩展:Runtime 启动独立可执行文件,完成协议握手,接收其函数、类型、算子与 action 注册信息,再把它们接入同一 Callable Contract Registry。进程崩溃会转换为 HHY Error,不应拖垮解释器。
| 协议阶段 | 职责 |
|---|---|
| handshake | 协商 extension_id、protocol_version 与兼容性 |
| register | 登记名称、输入输出、effect、lazy、cancel 与 threading 元数据 |
| call / call_result | 按 request_id 调用并返回值或结构化错误 |
| stream_* | 通过 item、credit/window 和 close 提供分块 Stream 与背压 |
| cancel / shutdown | 传播取消并幂等释放进程、Stream 和句柄 |
Redis 扩展设计示例
# 未来可能的目录;v1.0 不会加载它
hhy-redis/
├── hhy.toml
└── bin/hhy-redis
# 未来可能的 HHY 调用;当前不可执行
import redis
let client = redis.connect({ url: require_env("REDIS_URL") })
client |> redis.set("health", "ok")
let value = client |> redis.get("health")
client |> redis.scan("session:*") |> take(100) |> collect()| 示意 callable | Contract 设想 |
|---|---|
| redis.connect | 有 network 副作用;返回不可序列化的 RedisClient handle |
| redis.get | 接收 client 与 key;返回 String、Bytes 或 Null |
| redis.set | 有 network 副作用;需要进入 dry-run/权限审计 |
| redis.scan | 返回惰性 Stream;必须支持背压、取消和提前关闭 |
扩展作者需要实现什么
| 部分 | 要求 |
|---|---|
| 可执行进程 | 从标准协议通道握手、注册并处理调用 |
| Contract | 为每个 callable 声明输入输出、副作用、惰性、取消和线程模型 |
| 值转换 | 使用协议可序列化值;外部连接使用受控 Opaque handle |
| Stream | 遵守拉取、credit 背压、取消、错误和 close 生命周期 |
| 安全 | 最小环境变量;秘密通过明确的 secret provider;不得绕过 capability |
| 测试 | 覆盖握手失败、超时、取消、崩溃、资源清理和版本不兼容 |
公开 Native ABI 不属于 v1.1 的前置条件。只有进程协议无法满足且性能数据证明必要时,才会考虑基于不透明句柄和函数表的稳定 ABI。
