TinyActor 中文 · English

TinyActor 改进计划 (Improvement Plan)

北极星:类型安全的 Erlang(语法类 Gleam)。类型安全尽可能,但不极致 (不追求 typeclass/traits;HM + ADT 泛型为止,不为类型安全付出过高实现/使用代价)。 自举已完成,进入”用起来”阶段。

执行顺序(用户确认)

阶段 A(bootstrap 工程债)→ 阶段 B(错误信息)→ 阶段 C(HOF 类型标注)
→ 阶段 D(真实程序)→ 阶段 E(C 交互)
→ 之后 D/E 反哺 A/B/C,形成持续改进环

LSP 明确不着急(老派用户,先做基础)。


阶段 A — Bootstrap 工程债(必须先还,浮沙筑高台)

阶段 B — 错误信息强化(基础功能,查问题成本是几倍开销)

阶段 C — 分层类型模型(map 不能 typecheck 的根因修复)

设计原则(用户确认):类型检查只发生在上层语言;下层实现是无类型的。 但底层原语不是完全不承诺类型——按语义通用性取光谱:

上层安全面:ADT 构造器 + 模式匹配 + 带签名 fn + 类型化封装函数 (”kons”只是举例,是否引入按需求决定,不是必须项)

阶段 D — 真实程序(验证 + 暴露短板)

D1 暴露的短板清单(D2 候选)

  1. [x] 字符串字面量转义"\r\n" 字面 4 字符 → 已加 tokenizer 级转义解码: \n \r \t \\ \" \' + \xNN 十六进制字节转义;未知转义按字面保留。 动 tokenizer(编译器核心),FIXED POINT VERIFIED + 全量回归绿。 str.chr(13) + str.chr(10) 仍可用作运行时构造 CRLF 的替代。
  2. dotted module 调用无类型承诺str.eq/http.parse_request/net.* 全是 permissive fresh var → 类型错误全推迟到运行时。C 阶段光谱规则应覆盖模块函数。
  3. [x] str.eq 返回 int 0/1 而非 bool:if 判定”非 nil 即真”(int 0 也 truthy), 裸 str.eq(a,b) 恒真 → 全部请求路由到 /health 分支(表现为全返回 “ok”)。 代码库惯例 str.eq(a,b) == 1,但 typecheck 不拦裸用。B/C 候选:bool 类型收紧 or dotted 函数签名。 → 已修(D2 #3):str.c 的 str_eq_fn 改返回 val_true()/val_false()(与 OP_STR_EQ 一致), lib 33 处 + kv_server 10 处 str.eq(X) == 1 → 裸用 str.eq(X)。运行时兑现 typecheck 的 bool 承诺。fixed point 验证 + make test 92 绿 + kv 冒烟全对。
  4. [x] len/list_ref 是幻影 builtin:typecheck 有、runtime 无 → kv_server 被迫手写 list_length。 → 已修(D2 #4):从 typecheck 移除 ‘len/’list_ref 幻影注册(上层不承诺 runtime 没有的 东西——与 #3 同哲学)。lib/parser.ta 本就自带 fn list_ref TA 实现,自给自足;用户 自定义 fn len/fn list_ref 即可用(typecheck 给出清晰 undefined function 错误而非 运行时崩溃)。注:曾尝试加 OP_LEN/OP_LIST_REF opcode,实证破坏 bootstrap fixed point (codegen dispatch 引入 ‘len/’list_ref 会把 lib 同名 TA 函数调用重写成新 opcode → mismatch + 死循环),弃用。
  5. and/or 是死语法:codegen 有 compile_and/or,parser/tokenizer 无 → 写 a and b 解析错乱级联假类型错误。A/B 候选:实现或显式报错。
  6. import typecheck 栈溢出:脚本 import 大模块(typecheck.ta)重新编译 → 栈溢出段错误; bootstrap.tabc(预编译)路径正常。驱动构建是 ground truth。
  7. 限流快速 close 偶发 RST:token 耗尽时 accept→立即 close → curl 偶发 000 而非 429 (客户端侧 RST)。可接受,记录之。

阶段 E — C 交互(用户强调:至关重要,要做对做易用)

目标:普通人能自己写 C 模块(不只是调用 C), GC 交互的心智负担 + 安全问题做到 Lua 级别(Lua 是少数做对的语言)。


反哺环(持续)

阶段 D/E 的每一次使用发现 → 回到 A/B/C 改进 → 再使用 → 形成闭环。