批8 2(a): 视图内建 @ptr_of/@str_of(两面实现)+ S2 残桶 68 点收口 + cli.cr 值面 e2e - #132
Merged
Merged
Conversation
… interp.cr 30 · parser.cr 9,偏移标定法)+ 两机制分流(route 1 intern 索引 免新语法 / route 2 裸字需视图内建)+ bootstrap 面硬约束实测(@name(args) 产生式缺失;自源去注释后 @ 零触碰)+ -17 三机制判定程序 + 判据要件(含 cli.cr 值面零覆盖补网)+ 版本位论证;未实施
…|& =后端算子)vs 内建形态面(@name(args) 缺产生式)三行对照 + 两面判定程序 + 最小对拍(把「名字」与「形态」分开)+ 误读纠正(@sizeOf/@raw_int 在语料可用、只在自源面不可用;自源去注释后 @ 零触碰)+ 后果面(新增内建 = bootstrap 必做项);判据 J1-J6 6/6 绿
…fmt.cr:4;intern 表 g_strs 存 load_str_ptr ⇒ 索引→指针)⇒ 裸字缓冲默认存指针;机制 B(改存索引)不是等价替换而是存储语义变更(写入端 + 全部读出端都要改,且读出端不能用文本扫描枚举)⇒ 推荐 A 的理由由「偏好」升级为「实证」
…intern 索引 / 原生 ELF = 指针;istr_get/istr_len/str_load8 全收 int 索引)⇒ 68 点分类必须逐点判「哪套 + 哪条腿」:interp.cr 命中点若值是索引 ⇒ 正解是 route 1(免新内建);cli.cr/parser.cr 两腿都要成立,不得按单一面判;e2e 判据补「必须跑解释器 + 原生两条腿」
…不作子集夹带;含不并入理由(存储语义变更 / 读出端不可文本扫描枚举 / intern 表增长 / 两种存储约定=新接缝)+ 硬证据(原生 ELF 下 string 值=指针:str_len 读 s-8 长度头;解释器路径=intern 索引,interp.cr:70-72 原注)+ 适用条件与状态(登记未修);取号基准 = develop 当天最大 N=17;判据 J1-J6 6/6 绿(137 标题)
…uiltin 节点 + fail-closed + unsafe 支持;自托管 checker/ir_gen 同款)+ 判据套件入 CI 【机制】视图内建 = **同一个 64 位字的两种看法**(零转换/零拷贝/零运行期动作):@ptr_of(s: string)->int · @str_of(p: int)->string。 两面必须同时支持——自源必须能被 bootstrap 编(同族已实测两次:as、|/&)。 【bootstrap 面】ast.py 新增 Builtin 节点;parser.py 表达式位 @ 分三形态(@name(args)/@name/@project file::symbol 按紧随 token 判); type_checker.py 新增 _infer_builtin(未知名 fail-closed + unsafe 区块判据 + 实参类型)+ Unsafe 分支与 unsafe_depth(此前 bootstrap 零 unsafe 支持: 实测旧行为 = checker Unsupported expression + ir_gen NotImplementedError;corec 清单去注释去字符串后 unsafe 行数 = 0 ⇒ 从未触发); ir_gen.py Builtin 直通 + Unsafe 直通。 【自托管面】checker.cr EXPR_AT 链新增两条(g_unsafe_depth==0 ⇒ N01 硬错;实参类型不符 ⇒ TF07;未知名仍走既有 N01 fail-closed); ir_gen.cr **真直通**(返回内层变量本身,零指令零新变量)。为什么不沿用 @raw_int 的「新建变量+IR_STORE」:那换的是 dex↔int(XMM vs GP 两条真不同机器路径), 而 int↔string 两条腿都是同一 GP 字 ⇒ 搬运只会多一条 IR_STORE 并**破坏可擦除性**(实测该版本擦除判据红)。 【判据 tests/selfhost/test_view_builtins.py(入 selfhost-tests)12 项全绿】① 两面一致:check rc=0 · 解释器 rc=42 · native rc=42 · bootstrap 运行值 42; ② 擦除:往返写法与直写 ELF **逐字节一致**(int 与 string 两对;对照必须同处 unsafe 包络——实测 unsafe 本身带 +158B 区域元数据);③ 未知名两面 fail-closed; ④ unsafe 块外 ⇒ 两面硬错;⑤ 实参类型 ⇒ 两面报错。探针用 42(既非有效指针也非有效 intern 索引)⇒ 任何真转换/真解引用都会在此暴露。
…er.cr 9)+ cli.cr 值面 e2e 补网
【台账】CORE_S1P=1 check src/compiler/main.cr:**68 → 0**(bool 桶保持 0)。逐点按语义分类后改写:
· cli.cr(29):裸字表存/取串值 ⇒ 注册走 @ptr_of、读取走 @str_of、`_cli_find_flag` 比较走 @str_of;
**同族顺带收口 2 处返回位**(`cli_get`/`cli_arg` 返回 r64 而声明 string——S1P **只覆盖调用实参、不覆盖返回位**,
故不在 68 点里,同属一类)。
· interp.cr(30):地址字当缓冲(`r64(ptr,…)`/`w64(ptr,…)`)⇒ @str_of(ptr);alloc 结果(string)当字存 ⇒ @ptr_of(bp)。
· parser.cr(9):名字表存 `tok_lx`(串)⇒ @ptr_of;读回 `str_intern(r64(...))` ⇒ @str_of;泛型名/约束搬运两处同款。
【安全面 (ii)】全部视图点包在 unsafe 块内,且**块内无 alloc**——实测 unsafe 块仅在**有分配**时发射 arena_new
(无分配 ⇒ 后端不发代码,`arch/x86_64/instr.cr:1042` s1>0 分支);小块(`unsafe { w64(...); }`)优先,
避免为视图引入区域/arena 开销。
【零行为变化(迁移前/后同程序两腿对拍)】cli_view_test 同源程序:迁移前 cli.cr(develop 版)与迁移后,
解释器腿输出**同为 166B**、原生腿 rc 同为 0 且帮助文本一致 ⇒ 迁移零语义变化。
【e2e 补网】tests/suite/cli_view_test.cr(`grep -rln "cli_cmd|cli_flag" tests/ examples/` = 0,今日零覆盖):
注册 2 命令 + 2 旗标 → cli_help() 逐子串断言(myprog/{build,cir}/compile things/out path/more noise/
-o, --output/-v, --verbose)+ 查询面 cli_get/cli_has。实测:原生 rc=0 且子串齐;解释器 rc=0
(**解释器腿 cli_help 不产出**——alloc+w64/r64 裸内存路径在解释器里是近似,`interp.cr:719` 自注;
迁移前/后同为 166B ⇒ 该分歧与 2(a) 无关,不得当成本批引入)。
【判据】tests/selfhost/test_view_builtins.py 15 项全绿(①两面一致 ②擦除逐字节 ③fail-closed ④unsafe 面
⑤实参类型 ⑥cli e2e);构建 rc=0。
【形态】迁移时我把一个返回位写成 `return unsafe { r64(@str_of(ptr), 0); };`——块内表达式带分号 ⇒
**块的值是 unit** ⇒ `ir_interp_deref_read` 的该路径返回 unit。抓出它的是 **bootstrap 面的非致命警告**
(`Function ir_interp_deref_read: expected return type BaseType(name='int'), got BaseType(name='unit')`)。
【修法】归一为**语句形**:`unsafe { return r64(@str_of(ptr), 0); }`(两面同解)。
复跑 bootstrap 警告清单:返回型类 **2 → 1**(仅剩既有误报 `ty_memo_slot_no_grow`)。
【纪律(已落纸 TODO #2026-09-18-19(B))】视图一律写**语句形**(`unsafe { return @str_of(...); }` /
`unsafe { w64(...); }`),**不写** `return unsafe { X; };`。该形态两面诊断面分歧(bootstrap 警告 + 解释器按值执行;
self-hosted `TF01` 硬错),已登记待裁。
…盖面发现)+ 两条判据覆盖面登记(S1P 只覆盖调用实参——返回位盲区;unsafe 块内分号 ⇒ 块值 unit 的两面诊断面分歧)
…**总点 == 0**(更严)」;「0」的活性由判据①(必命中探针恰 1 条)背书——没有①,0 点与「打点没装」不可区分。触发:迁 68 点全收口后本档在 selfhost-tests 转红(本档当初正是为「覆盖为零/假阴」立的,口径必须跟着不变量走,不得放宽为「跳过」)。
…/harness/test_lsp_builtin_table.py 的 L1–L4 双向差集机械拦) 【触发】bootstrap-tests 转红:L2「语言面有而 LSP 表缺 ⇒ [ptr_of, str_of]」——真源①(checker EXPR_AT) 17 名 vs LSP 表 16 名。 这条判据(含 L4 四条突变控制)正是为「新增内建漏同步 LSP」立的,本批第一次真实命中。 【修法】src/lsp/analysis.cr 补两名(与既有 15 名同形)。复跑:4/4 通过(L1–L4)。
dslsdzc
force-pushed
the
feature/b8-2a-view-builtins
branch
from
September 18, 2026 13:44
2c72cf8 to
b7d1bc0
Compare
…式,PR #132)+ 计划 §5/§6 原文保留加注 + 顺带扫安全面 【本批自己制造的过期口径,同批解掉(team-lead 复核 #132 前置)】 · TODO.md 映射行 -17:「内建形态面」加删除线 + 已随 2(a) 闭合;**剩余面收窄为两条语法层**(as = token 级 parse 失败 / |& = parse 通过但后端 NotImplementedError)。 · TODO.md -17 段落表同一行 + 判定程序「对号入座」第三条:同步标注(该信号只对「本批之前的 bootstrap」成立)。 · 计划 §5/§6(记录类,**原文逐字保留 + 加注**):§6 表在该行下加注「已随本批闭合」;§5 在「bootstrap 表达式位 @ 只有 @project 一种产生式」后加注同款。 · 顺带扫(第 5 条团队约定:修了前置能力的批次要清点前提式陈述):本批还给 bootstrap 补了 **unsafe 支持**(此前完全缺失:checker Unsupported expression + ir_gen NotImplementedError)——已在 §5 加注里一并标明「凡把 bootstrap 无 unsafe 当现状的陈述同样失效」;全仓未发现其他把该缺口当现状的陈述(仅计划 §10 的历史式表述,仍成立)。 判据 J1-J6 6/6 绿。**doc-only**(仅 2 个 .md,src/ 零改动)⇒ 未重跑两档重层(按 team-lead 复核口径)。
dslsdzc
added a commit
that referenced
this pull request
Sep 18, 2026
…+ 排除法成因,明写机制未查明 实测三读数(同一批探针跨基点):41a51d8d = check rc=0 + 1 条 [S1-ARG] · 965052b(2(a) 后)= rc=1 error[TF01] (g2(d)/g2(x:int)/g2(Some(3))/return g2(x)/f := g2(x);return f 五项全 rc=1)· 批 1 修后五项全 rc=0。 成因 = 排除法定位到 #132(区间内 #129/#130/#131 皆文档面,唯一代码提交是 2(a))。 **机制未查明**(不得据本条推断机理;先例 = #2026-09-17-5 的读码机理被 T0 推翻并带下游判据作废)。 方法学(供后续批次照做):「批声明的范围」≠「批的实际影响面」⇒ 凡改 checker.cr 的批,收尾宜对已知敏感面 跨基点复测同类案例。状态 = 已消解(判据 = tests/selfhost/test_topt_pattern.py C7)。 (映射表行 + ### 段两处齐备;test_todo_id_migration 全绿:J3 新 id 139 / 标题 139)
dslsdzc
added a commit
that referenced
this pull request
Sep 18, 2026
…(判据 C1–C7 两向钉子 + 突变自证) (#133) * fix(批8 (甲) 批1 刀1): unify_types 的 T? 模式规则(只加分支,不改既有三条规则语义) 根因(实测):unify_types 三条规则外的 `T?`(TYP_OPTIONAL,内层泛型参数)落兜底 type_compat_strict(concrete, pattern) ⇒ 内层**不代入、不绑定、恒假** ⇒ 泛型调用里 `T?` 形参的实参既不绑定也不校验,且 [S1-ARG] report-only 打点对 `T?` **恒报**(含已正确编译的 合法调用 —— 它们此前靠 ir_gen 旧路径恰好正确)。 修复:新增 `pk == TYP_OPTIONAL` 分支(① concrete 亦 optional ⇒ 内层对内层;② 否则裸值入 T? ⇒ 内层对 concrete),内层是泛型参数时由既有 TYP_GENERIC_PARAM 分支绑定/比对。 **既有三条规则逐字未动;不改任何调用点。** 判据(tests/selfhost/test_topt_pattern.py,已挂 src/ci/run.sh selfhost-tests;**两向钉子**): C1 五例合法调用(C6 g(d,d) / C7 g2(d) / J / K / M)[S1-ARG] 由 1 → **0**; C2 g(1,d) 真错仍**恰 1** 条(防「一律不报」);C3 实例键与调用点转换不变 (g[dex] / g2[dex] / call g2[dex](_dxsc));C5 槽型直读 slot=8;C4 非泛型面零足迹对照。 批次判据(与当批起点读数相同):check src/compiler rc=0 · ^error[ = 0(起点 0)· selftest-types 415/415(起点 415/415)· canary 5/5 且五值逐字节同改前 · 停条件六套件全绿(test_optional 80/80 · test_arg_inference_gap 全绿 · test_generic_constr 15/15 · test_generic_param_erasure ALL PASS · test_cache_identity 6/6 · test_cir_warm_path 19/19)。 行为变更(显式登记):`T?` 的 S1-ARG 误报消失(诊断面)+ 该模式下的泛型绑定由「不绑定」 变为「绑定」;产物面零足迹(canary 五值 + 六套件均同改前)。 * docs(TODO #2026-09-18-20): 登记「T? 形参单泛型调用在 2(a) 后由静默升级为硬错 TF01」——只登事实 + 排除法成因,明写机制未查明 实测三读数(同一批探针跨基点):41a51d8d = check rc=0 + 1 条 [S1-ARG] · 965052b(2(a) 后)= rc=1 error[TF01] (g2(d)/g2(x:int)/g2(Some(3))/return g2(x)/f := g2(x);return f 五项全 rc=1)· 批 1 修后五项全 rc=0。 成因 = 排除法定位到 #132(区间内 #129/#130/#131 皆文档面,唯一代码提交是 2(a))。 **机制未查明**(不得据本条推断机理;先例 = #2026-09-17-5 的读码机理被 T0 推翻并带下游判据作废)。 方法学(供后续批次照做):「批声明的范围」≠「批的实际影响面」⇒ 凡改 checker.cr 的批,收尾宜对已知敏感面 跨基点复测同类案例。状态 = 已消解(判据 = tests/selfhost/test_topt_pattern.py C7)。 (映射表行 + ### 段两处齐备;test_todo_id_migration 全绿:J3 新 id 139 / 标题 139)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
摘要
2(a) 视图内建
@ptr_of/@str_of:语义 = 同一个 64 位字的两种看法(零转换、零拷贝、零运行期动作)。本 PR 含 ① 机制两面实现 ② S2 残桶 68 点全部收口 ③
cli.cr值面 e2e(今日零覆盖的补网)④ 两条覆盖面登记。裁据(team-lead 2026-09-18):机制 A(视图内建;机制 B = 改存 intern 索引,已独立登记
TODO #2026-09-18-18,不并入);安全面 (ii):视图必须出现在
unsafe块内,块外 ⇒ 硬错(本 PR 两面都实现并各有判据)。一、机制(两面必须同时支持:自源必须能被 bootstrap 编)
ast.py新增Builtin·parser.py表达式位@三形态分流(@name(args)/@name/@project file::symbol,按紧随 token 判)·type_checker.py_infer_builtin(未知名 fail-closed + 实参类型 + unsafe 判据)·ir_gen.py直通checker.crEXPR_AT 链两条(g_unsafe_depth==0⇒N01硬错;实参类型 ⇒TF07)·ir_gen.cr真直通(返回内层变量,零指令零新变量)附带补齐:bootstrap 此前对
unsafe零支持(实测旧行为:checkerUnsupported expression+ ir_genNotImplementedError;自源去注释去字符串后
unsafe行数 = 0 ⇒ 从未触发)⇒ 本 PR 同时补unsafe支持(Unsafe分支 +unsafe_depth)。为什么视图不用
@raw_int的「新建变量 + IR_STORE」:那换的是 dex↔int(XMM/GP 两条真不同机器路径);int↔string 两腿都是同一 GP 字 ⇒ 搬运只会多一条 IR_STORE 并破坏可擦除性(实测该版本判据②红)。
二、68 点收口(S2 残桶 → 0)
src/stdlib/cli.cr@ptr_of· 读取/比较@str_of;另修 2 处返回位(cli_get/cli_arg)src/compiler/interp.cr@str_of(ptr);alloc结果(string)当字存 ⇒@ptr_of(bp)src/compiler/parser.crtok_lx⇒@ptr_of;读回str_intern(r64(...))⇒@str_ofCORE_S1P=1 corec check src/compiler/main.cr:68 → 0(bool 桶保持 0)。旁证(bootstrap 面 oracle):构建期
Checker warnings (non-fatal)330 → 165(视图点逐条消失)。安全面落地纪律:视图块块内无 alloc——实测
unsafe仅在有分配时才发arena_new(
arch/x86_64/instr.cr:1042的s1 > 0分支)⇒ 视图块零运行期开销。三、判据(
tests/selfhost/test_view_builtins.py,已挂selfhost-tests,15 项全绿)在 corec check / 解释器 / native 与 bootstrap 管线 / bootstrap 解释器 五处读数一致(均 42)。
f(p)=@ptr_of(@str_of(p))与f(p)=p的 ELF 逐字节一致(int 与 string 两对;⚠ 对照必须同处
unsafe包络——unsafe本身带 +158B.ccr区域元数据,跨包络对照测的是unsafe)。N01/unknown @ builtin)。@ptr_of(int)/@str_of(string)⇒ 两面拒绝。tests/suite/cli_view_test.cr注册 2 命令 + 2 旗标 →cli_help()逐子串断言(myprog/{build,cir}/compile things/out path/more noise/-o, --output/-v, --verbose)+ 查询面
cli_get/cli_has。_cli_find_flag首视图点 ⇒ 台账 0→2(str_len/str_eq复现);② 移除
checker.cr的 unsafe 守卫 ⇒ 块外探针由 rc=1 变 rc=0 ⇒ 判据④必红。四、零行为变化(迁移前/后同源对拍)
tests/suite/cli_view_test.cr用迁移前的cli.cr(develop 版)与迁移后分别跑两腿:解释器腿输出同为 166B、原生腿 rc 同为 0 且帮助文本一致 ⇒ 迁移零语义变化。
(解释器腿
cli_help不产出属预存:alloc+w64/r64裸内存路径在解释器里是近似,interp.cr:719自注。)五、登记(两条覆盖面发现 →
TODO #2026-09-18-19)cli_get/cli_arg声明-> string却return r64(...),68 点台账从未收录(本 PR 一并修)⇒ S3 升硬错前必须补返回位,否则同类点仍静默。
unsafe { expr; }块内分号 ⇒ 块值 = unit:return unsafe { X; };让该路径返回 unit——bootstrap 面仅非致命警告(解释器仍按值执行)、self-hosted 面
TF01硬错 ⇒ 两面诊断面分歧,已登记待裁。本 PR 的编码纪律 = 一律语句形(
unsafe { return @str_of(...); })。五bis、被两条既有判据当场抓出的漏项(本 PR 修)
bootstrap-tests转红):tests/harness/test_lsp_builtin_table.py的L1–L4(真源枚举 · 双向差集 · 非真空 + 四条突变控制)实测 L2 红:语言面 17 名 vs LSP 表 16 名
⇒ 缺
['ptr_of','str_of']。修法 =src/lsp/analysis.cr补两名(与既有 15 名同形),复跑 4/4 通过(含 L4-① 删 LSP 表项必红 / L4-② 删 checker 分派必红 / L4-④ 新增第三真源必红)。
selfhost-tests转红):该档原断言「自源台账非空 + bool 桶 0」(当初残 68 点);迁移后总点合法归 0 ⇒ 断言升级为「总点 == 0」(更严),「0」的活性改由判据①(必命中探针恰 1 条)背书。
不做「跳过/放宽」——判据必须跟着不变量走。
六、附带说明
§2.2bis/§2.2ter补 +TODO #2026-09-18-17/-18)。其中-17/-18是增补(-17首登已随 批8: S1P 打点定位通道(源行片段)+ S2 侦察结论与两条登记(代码净额为零) #127 进 develop;-18为本批新登记)。check面口径更正:./build/corec check src/compiler实测 0 条^error[(rc=0);原「应恰为 2(
lits_copy/ty_memo_slot_no_grow)」系过期口径(那两条已在先前批次消除)。CIR_CACHE_VER(无「已接受程序 IR 变化」;自源三档 AST 变 ⇒ 其.cir条目 miss 重建,其余等价命中,身份闸兜底)。