《两周自制脚本语言》权威学习地图
按中文版完整目录与日文原版出版社目录,把3部分、19天、80个编号小节和7篇专栏组织为可运行Stone语言增量。 覆盖22个正式目录层级。
为什么不能只看最终输出
、、、、共同构成本页坐标。按中文版完整目录与日文原版出版社目录,把3部分、19天、80个编号小节和7篇专栏组织为可运行Stone语言增量。
最终输出相同不代表实现相同:词法器可能吞掉错误字符,解析器可能生成错误结合性的树,解释器可能从调用点而非定义点捕获环境,优化器也可能只在当前样本上碰巧得到正确值。因此每次增量都保留源文本、Token范围、AST快照、环境或帧状态、标准输出、错误输出与退出状态。
Stone增量实现台账
先冻结上一日全部样本和公开接口,再为本日功能写一个最小成功程序、一个边界程序、一个故意失败程序和一个跨功能程序。成功样本证明新语法能到达执行层;边界样本暴露空输入、嵌套、遮蔽、短路、越界或缓存失效;失败样本必须在最早确定的位置停止;跨功能样本防止新节点破坏旧的表达式、控制流与函数语义。
处理流水线分为六个可观察检查点:源字符是否完整消费,Token是否携带类型和值及源位置,文法是否选择唯一分支,AST是否表达优先级与作用域,运行环境或虚拟机是否遵守所有权和调用约定,最终值与错误是否满足语言合同。只记录最终打印文本会丢失前五层最有诊断价值的证据。
每个错误对象至少含阶段、源文件、行列范围、实际符号、期望集合、原因和恢复建议。不要在底层捕获后返回null继续执行,因为后续空指针会掩盖真正错误;也不要把Java反射异常原样暴露给Stone程序,而应保留cause并映射为稳定的语言错误类别。
性能增量采用差分验证:同一语料分别运行基线解释器和优化版本,先比较值、输出、错误类别与位置,再比较预热后的时间、分配量与查找次数。若槽位分配、内联缓存或字节码改变异常顺序,性能再高也不能通过语义验收。
每次提交还要附带增量契约:本日新增哪些Token、文法产生式、AST节点、环境槽位、虚拟指令或类型规则,哪些旧接口保持不变,失败后如何回退到上一日可运行状态。将生成的Token、AST或字节码快照纳入版本比较,但不把快照更新本身当成修复;先解释结构变化为何符合语言设计,再接受新的基线。这样可把19天连续演进变成可二分、可撤销、可复查的工程历史。
六阶段证据链
1. 核对3部分
围绕3部分19天保存输入、结构化中间状态与输出。进入“完成基础解释器”前,先断言当前检查点成立并记录首个偏离。
2. 完成基础解释器
围绕Stone语言保存输入、结构化中间状态与输出。进入“加入对象函数”前,先断言当前检查点成立并记录首个偏离。
3. 加入对象函数
围绕解释器保存输入、结构化中间状态与输出。进入“验证性能优化”前,先断言当前检查点成立并记录首个偏离。
4. 验证性能优化
围绕性能优化保存输入、结构化中间状态与输出。进入“进入VM与类型”前,先断言当前检查点成立并记录首个偏离。
5. 进入VM与类型
围绕理论回链保存输入、结构化中间状态与输出。进入“回做理论自习”前,先断言当前检查点成立并记录首个偏离。
6. 回做理论自习
围绕3部分19天保存输入、结构化中间状态与输出。进入“核对3部分”前,先断言当前检查点成立并记录首个偏离。
可运行骨架
基础篇(1-10) -> 性能优化篇(11-14) -> 解说篇(15-19)find samples -name '*.stone' -print0 | xargs -0 -n1 ./run-regressionsource -> tokens -> AST -> eval -> optimized env -> VM -> typed bytecode正式目录逐项讲解
第1部分 基础篇
“第1部分 基础篇”要求先给出可运行正例,再列出语法、环境、对象、返回值和失败合同,最后沿处理流水线停在第一处分叉。在本日增量中,“3部分19天”服务于“核对3部分”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“完成基础解释器”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第1天 来,我们一起做些什么吧
“第1天 来,我们一起做些什么吧”要求先给出可运行正例,再列出语法、环境、对象、返回值和失败合同,最后沿处理流水线停在第一处分叉。在本日增量中,“Stone语言”服务于“完成基础解释器”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“加入对象函数”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第2天 设计程序设计语言
“第2天 设计程序设计语言”要求先给出可运行正例,再列出语法、环境、对象、返回值和失败合同,最后沿处理流水线停在第一处分叉。在本日增量中,“解释器”服务于“加入对象函数”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“验证性能优化”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第3天 分割单词
“第3天 分割单词”要求规定Token类别、最长匹配、跳过规则、转义与源位置,确保每个字符要么被消费一次,要么产生明确词法错误。在本日增量中,“性能优化”服务于“验证性能优化”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“进入VM与类型”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第4天 用于表示程序的对象
“第4天 用于表示程序的对象”要求明确对象布局、字段或变量槽位、查找守卫和失效条件,先冻结语义基线,再用相同样本比较时间与内存。在本日增量中,“理论回链”服务于“进入VM与类型”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“回做理论自习”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第5天 设计语法分析器
“第5天 设计语法分析器”要求把规则写成可执行文法,检查递归、歧义、优先级、结合性、前看集合和失败位置,再用AST快照证明结果。在本日增量中,“3部分19天”服务于“回做理论自习”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“核对3部分”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第6天 通过解释器执行程序
“第6天 通过解释器执行程序”要求先给出可运行正例,再列出语法、环境、对象、返回值和失败合同,最后沿处理流水线停在第一处分叉。在本日增量中,“Stone语言”服务于“核对3部分”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“完成基础解释器”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第7天 添加函数功能
“第7天 添加函数功能”要求画出词法环境、调用帧、参数绑定、返回值和闭包捕获关系,逐节点记录求值顺序、副作用与异常传播。在本日增量中,“解释器”服务于“完成基础解释器”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“加入对象函数”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第8天 关联Java语言
“第8天 关联Java语言”要求标明Stone与Java边界上的成员解析、参数转换、返回包装、异常映射和类路径依赖,避免宿主细节泄漏为语言语义。在本日增量中,“性能优化”服务于“加入对象函数”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“验证性能优化”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第9天 设计面向对象语言
“第9天 设计面向对象语言”要求明确对象布局、字段或变量槽位、查找守卫和失效条件,先冻结语义基线,再用相同样本比较时间与内存。在本日增量中,“理论回链”服务于“验证性能优化”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“进入VM与类型”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第10天 无法割舍的数组
“第10天 无法割舍的数组”要求明确对象布局、字段或变量槽位、查找守卫和失效条件,先冻结语义基线,再用相同样本比较时间与内存。在本日增量中,“3部分19天”服务于“进入VM与类型”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“回做理论自习”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第2部分 性能优化篇
“第2部分 性能优化篇”要求明确对象布局、字段或变量槽位、查找守卫和失效条件,先冻结语义基线,再用相同样本比较时间与内存。在本日增量中,“Stone语言”服务于“回做理论自习”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“核对3部分”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第11天 优化变量读写性能
“第11天 优化变量读写性能”要求明确对象布局、字段或变量槽位、查找守卫和失效条件,先冻结语义基线,再用相同样本比较时间与内存。在本日增量中,“解释器”服务于“核对3部分”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“完成基础解释器”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第12天 优化对象操作性能
“第12天 优化对象操作性能”要求明确对象布局、字段或变量槽位、查找守卫和失效条件,先冻结语义基线,再用相同样本比较时间与内存。在本日增量中,“性能优化”服务于“完成基础解释器”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“加入对象函数”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第13天 设计中间代码解释器
“第13天 设计中间代码解释器”要求先写出指令、操作数、程序计数器、栈效应和调用帧布局,再把每次状态变化与源表达式对齐。在本日增量中,“理论回链”服务于“加入对象函数”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“验证性能优化”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第14天 为Stone语言添加静态类型支持以优化性能
“第14天 为Stone语言添加静态类型支持以优化性能”要求明确对象布局、字段或变量槽位、查找守卫和失效条件,先冻结语义基线,再用相同样本比较时间与内存。在本日增量中,“3部分19天”服务于“验证性能优化”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“进入VM与类型”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第3部分 解说篇(自习时间)
“第3部分 解说篇(自习时间)”要求先给出可运行正例,再列出语法、环境、对象、返回值和失败合同,最后沿处理流水线停在第一处分叉。在本日增量中,“Stone语言”服务于“进入VM与类型”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“回做理论自习”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第15天 手工设计词法分析器
“第15天 手工设计词法分析器”要求规定Token类别、最长匹配、跳过规则、转义与源位置,确保每个字符要么被消费一次,要么产生明确词法错误。在本日增量中,“解释器”服务于“回做理论自习”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“核对3部分”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第16天 语法分析方式
“第16天 语法分析方式”要求把规则写成可执行文法,检查递归、歧义、优先级、结合性、前看集合和失败位置,再用AST快照证明结果。在本日增量中,“性能优化”服务于“核对3部分”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“完成基础解释器”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第17天 Parser库的内部结构
“第17天 Parser库的内部结构”要求先给出可运行正例,再列出语法、环境、对象、返回值和失败合同,最后沿处理流水线停在第一处分叉。在本日增量中,“理论回链”服务于“完成基础解释器”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“加入对象函数”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第18天 GluonJ的使用方法
“第18天 GluonJ的使用方法”要求标明Stone与Java边界上的成员解析、参数转换、返回包装、异常映射和类路径依赖,避免宿主细节泄漏为语言语义。在本日增量中,“3部分19天”服务于“加入对象函数”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“验证性能优化”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
第19天 抽象语法树与设计模式
“第19天 抽象语法树与设计模式”要求区分树结构与树上操作,列出新增节点和新增操作各自影响的模块,并用非法节点与跨版本回归检验扩展边界。在本日增量中,“Stone语言”服务于“验证性能优化”:输入保存原始Stone源码、预期Token或AST、初始环境与宿主版本,输出保存结构化结果、标准错误和退出状态。
验证时只改变一个运算符、分隔符、绑定、对象布局、类型标注或输入规模,并在进入“进入VM与类型”前停住第一条Token范围、语法分支、AST节点、环境绑定、虚拟指令或类型约束分叉。修复后重放此前所有日次样本;若旧语义改变,必须说明是有意语言演进还是回归。
分步视觉验证
常见误区
四类样本与验收
| 样本 | 只改变什么 | 必查证据 | 通过条件 |
|---|---|---|---|
| 正常 | 一个最小语言功能 | Token、AST、状态与输出 | 与手工预测一致 |
| 边界 | 空值、嵌套、遮蔽或规模 | 首个边界分支与源位置 | 边界可解释 |
| 非法 | 一个字符、规则、绑定或类型 | 最早错误类别与期望集合 | 不继续污染状态 |
| 回归 | 与上一日相同语料 | 结构、值、错误与性能基线 | 旧语义保持 |
练习
小结
- 3部分19天:连接“核对3部分”的源文本、中间结构、运行状态与回归证据。
- Stone语言:连接“完成基础解释器”的源文本、中间结构、运行状态与回归证据。
- 解释器:连接“加入对象函数”的源文本、中间结构、运行状态与回归证据。
- 性能优化:连接“验证性能优化”的源文本、中间结构、运行状态与回归证据。
- 理论回链:连接“进入VM与类型”的源文本、中间结构、运行状态与回归证据。
- 本页22个正式目录层级全部进入Stone可运行增量与差分回归链。