docs/current/04-标准库与防线/标准库单源P0对照表20261010.md
GitHub ↗
当前有效

标准库单源 P0 对照表(2026-10-10)

2048 字·约 6 分钟 阅读 2026-10-10 17:07

状态:P0 只读盘点产物(零代码改动)——设计稿 §7 P0 的验收件,须人工确认后才进 P1。 实测口径:全部数字为 2026-10-10 亲跑文本提取(原始数据 tmp/review_20261010/p0_data.txt,脚本一次性内联),非引用旧记录。 盘点基线:master e85f7439。


1. 十点对照表(事实 → 现居 → 新归 → 分档)

分档口径:自有 = 真值锚已改 C 标准/头文件存根(#39 批四后),可自由重排;照搬 = 头注自述照搬 Rust、E1 对拍面,内容不可私改(搬迁不改内容可,须登记);生成 = @generated 产物,改输入再跑生成器。

# 现居 事实内容(2026-10-10 实测) 新归(方案 A) 分档
1 libc_src/include/*.h(14 头) 105 函数声明(stdio 27/string 20/math 20/ctype 14/stdlib 18 + stdarg 4 + assert 1 + stddef 1,含 __vitro_va_*×4、__vitro_assert_fail 等 5 条内部辅助)+ 24 个 #define(float 13/errno 5/stdarg 4/assert 1/time 1);limits.h 空壳、stdbool.h/stdint.h 零宏零声明 留 .h(surface 真源不动) 自有
2 libc_src/src/*.c(3 文件) ctype 11 + stdlib 4 + string 7 = 22 函数 bytecode 实现(→ vm/libc_data_gen.mbt 预编译产物) 留原处(behavior) 自有
3 libc/libc.mbt libc_table 57 条(= visit_call 56 臂名口径:58 臂 − std__move − 三名共享一臂),param_kinds 非空 28 条;builtin_all 175 放行名 stdlib 吸收(sig()) 已转自有(初始内容提取自 Rust check_builtin_*,批四销案后锚 = C 标准,N3/N4 已对齐存根)
4 libc/bytecode_sig.mbt 76 名 → 类型(typeck check_user_func 第四级);与 #6 的 88 名差集双向在案:sig 独有 3(vitro_sort 族)、idx 独有 12+(__ctor__ 族)——两表本非同一集合(typeck 面 ≠ 发射面) stdlib 派生(P2 与 #3 收敛) 已转自有(N4 销案对齐存根)
5 bytecode/host_func_id_gen.mbt 110 常量 + by_user_name 逐对 + PURE 14 名短路(@generated,源 = Rust 快照 host_func_id.snapshot.rs) P2 输入改事实包,删 Rust 快照 生成(gen_host_route)
6 bytecode/libc_index.mbt 88 名固定索引(1000+ 序,锚 = wbtest Rust 源 88 对硬编码 + codegen_diff) stdlib/binding 派生 照搬(Rust 照搬,锚声明在头注)
7 bytecode/route.mbt 改判 5(strcpy/strcat/strncpy/memcpy/memmove)+ 遮蔽 17(实测集合运算,见 §2②)+ shadowed_host_names() 显式清单 binding 派生 + 遮蔽清单保留 自有(S9 教学语义裁定:负 n trap)
8 typeck/builtin.mbt 26 方法 = check_builtin_table 入口 + 25 具体专臂(visit_call 实调名单:FILE 族 14 + 格式串 6 + malloc/realloc/qsort/bsearch/print_int 等);15 臂名走 table 入口 专臂留 typeck(Special);table 入口改消费 stdlib 照搬(头注自述逐字照搬、E1 对拍面)——专臂内容不可动
9 lexer/internal/pp/builtins.mbt 对象宏 23(INT_MAX/EOF/RAND_MAX/stdout…)+ 函数宏 4(va_arg/va_copy/va_end/va_start——头注写「三条」实测 4 条) 预定义宏迁 stdlib.macro_def 照搬(macros.rs 全量语义)——搬迁不改内容可,须登记
10 host/*.mbt(23 文件) 110 handler(host_format.mbt = printf 引擎照搬核心;其余按文件头注分档见 §4) 留原处(behavior) 混合(host_format 照搬不动;纯数据/接线 handler 分文件核)

2. 必答三题

① 病 11 过渡路径(已收编臂如何被 stdlib 吸收)

  • 现状链:libc_table 57 条(kinds 非空 28:putchar/puts/strlen/strcpy/strdup/strcmp/strcat/atoi/strncat/strncmp/memcmp/strchr/strrchr/strstr/memchr/atof/atol/srand/tan/log10/fabs/ceil/floor/round/fmod/free/memset/exit)→ @libc.sig_of → check_builtin_table;visit_call 56 臂名中其余 25 走专臂方法。
  • 吸收方式:stdlib.sig() 从 libc_table 反向提取,57 条零作废;param_kinds 的 P/I/D 字符编码换枚举(check_builtin_table 内 k==80/k==68 魔数同步消灭);入口改 import stdlib。
  • 验收线:重排前后 typeck_diff hash 等价(与病 11 验收同口径,设计稿 §3.5)。
  • 第二层停手建议维持(§8 裁定项):kinds 非空 28 > 已切 table 的 15 臂名——第二层正在半途(填了值未全切臂),恰好是停手的最佳时点:剩余填值工作并入 stdlib 一次做。

② 遮蔽名单处置(实测 17 名,非 route.mbt 头注的 20)

集合运算实测:idx(88) ∩ host(110) = 22,− 改判 5 = 17:

abs, atoi, isalnum, isalpha, iscntrl, isdigit, islower, isprint,
isspace, isupper, isxdigit, rand, srand, strcmp, strlen, tolower, toupper
  • 与 C3 历史实例对上:当年「14 臂不可达」= ctype 11 + abs/rand/srand,现已含 atoi/strcmp/strlen 共 17。
  • 处置建议(P2 执行):这 17 名 bytecode 版与 host 版语义等价(纯函数/无诊断面),实际路径恒 bytecode——host handler 属写而不可达死面,建议随 binding() 生成实际路径表后删;shadowed_host_names() 保留为断言(删后清单应清零,闸即转红——死面消灭的机器证据)。
  • 副产物勘误:route.mbt 头注「20 个静默遮蔽」是 2026-10-06 改判 3 条(交集 25→22)前的旧口径,未随改判连坐——应改 17(修不修随 P2 批顺带,本批不动他人文件)。

③ 宏两分边界清点

侧 清单(实测) 新归
预定义(lexer 常在,不依赖 include) 对象宏 23:stdout/stderr/stdin/EOF/EXIT_SUCCESS/EXIT_FAILURE/RAND_MAX/SEEK_SET/SEEK_CUR/SEEK_END/INT_MAX/INT_MIN/LONG_MAX/LONG_MIN/CHAR_BIT/SCHAR_MIN/SCHAR_MAX/UCHAR_MAX/SHRT_MIN/SHRT_MAX/USHRT_MAX/true/false;函数宏 4:va_arg/va_copy/va_end/va_start stdlib.macro_def
头文件(include 后由 pp 解析) 24 个 #define:float.h 13(DBL_/FLT_)+ errno.h 5(EACCES/EDOM/EINVAL/ENOENT/ERANGE)+ stdarg.h 4(va_* 函数式展开)+ assert.h 1(assert)+ time.h 1(CLOCKS_PER_SEC) 留 .h
  • 新发现盲区(P1 批已读码定案 2026-10-10):va_* 同名字两处定义——stdarg.h 用 #define va_start(ap,last) __vitro_va_start(...)(展开到辅助函数),builtins.mbt 用 token 预定义(显式 token 列表)。定案:Pp::new 初始化即装 builtin_macro_table()(预定义兜底——不 include stdarg.h 也可用),include 后 .h 的 #define 走正常 define_macro 通道覆盖同名预定义——两处都可达、按 include 切换,非死数据;stdlib 迁移时 va_* 4 条随预定义面走(macro_def),.h 版本留 surface,语义同构(均展开到 __vitro_va_* 辅助函数)。
  • 边界判据建议:「出现在空壳/近空壳头(limits/stdbool/stdint)的宏 = 预定义」——空壳头机制本身是教学子集的有意设计(头文件存在性检查 + 宏预定义),应在 C语言子集规范.md 补一段。

3. P1 就绪判定

就绪。P1 范围(设计稿 §7):建 stdlib 包(从 #3 libc_table + #9 预定义宏反向提取)+ 接线 stubs_gen/headers() 一个消费面,验收 = 产物逐字节一致。前置条件全满足:

  • 数据源明确(#3 自有可迁、#9 照搬可搬迁须登记);
  • 与并发工作零冲突(issue #50 在 typeck 诊断面,P1 不碰 typeck);
  • pkg_deps/surface 连坐清单已列(设计稿 §6.2)。

P1 起排 0.9.0 之后(设计稿 §8 时机裁定不变)。

4. 未尽事项(下批/顺带)

  • route.mbt 头注 20→17 勘误(随 P2)。
  • builtins.mbt 头注「va_* 三条」→ 4 条勘误(随 #9 搬迁批)。
  • host 23 文件逐头注分档(P2 接 host 路由面时做,本表只点了 host_format)。
  • PURE 14 名与 stdlib binding() 的关系建模(P2)。