L Language 架构分析报告 — 无代码变更 (快照复查)
日期: 2026-06-05 17:08 | 自动生成 | 无源代码变更
上次代码基线: a15cd9d (2026-06-05 15:09 报告, v0.5)
当前 HEAD: a15cd9d feat: match 表达式 (P1 #8 收官)
结论: 自上次架构分析报告以来无新提交。以下为当前架构快照及健全性复查。
代码变更检查
a15cd9d 仍是 HEAD。与上次报告 (2026-06-05 15:09) 完全一致。零文件变更,零行差异。
1. 当前架构快照 (v0.5)
1.1 编译流水线
1.2 模块清单与行数
| 模块 |
文件 |
行数 |
职责 |
| include/ |
l_lang.h |
57 |
TypeKind (10), SourceLoc, 公共类型 |
| lexer/ |
lexer.c + token.c (+ .h) |
163 + 54 |
手写状态机, 50 Token 类型 |
| ast/ |
ast.c + ast.h |
245 + 159 |
25 种 AST 节点, 工厂函数 |
| parser/ |
parser.c + parser.h |
825 + 13 |
递归下降 + Pratt, parse_type_expr 统一 |
| sema/ |
sema.c + symbol.c (+ .h) |
809 + 155 |
类型推断, alias 展开, impl mangle |
| codegen/ |
codegen.c + target.c (+ .h) |
824 + 35 |
LLVM IR 生成, GEP, enum/array/match |
| driver/ |
main.c + error.c (+ .h) |
160 + 49 |
流水线串联, 错误报告 |
| util/ |
arena.c + arena.h |
45 + 17 |
Bump allocator (8MB) |
| 实现总计 |
|
~3,336 行 |
|
| test/ |
test_*.c × 4 |
944 |
30 单元测试函数 |
| test/ |
programs/*.l × 23 |
— |
23 集成测试程序 |
| 测试总计 |
|
~944 行 |
|
1.3 核心类型系统
| 枚举 |
成员数 |
位置 |
| TypeKind |
10 (+2 vs v0.4) |
include/l_lang.h:9, TYPE_ENUM + TYPE_ARRAY |
| TokenKind |
50 (+11 vs v0.4) |
src/lexer/token.h |
| AstNodeKind |
25 (+7 vs v0.4) |
src/ast/ast.h |
| SymbolKind |
5 (+1 vs v0.4) |
src/sema/symbol.h:7, SYM_ENUM |
TypeKind 成员: TYPE_I64, TYPE_F64, TYPE_BOOL, TYPE_STR, TYPE_VOID, TYPE_STRUCT, TYPE_ENUM, TYPE_ARRAY, TYPE_UNKNOWN, TYPE_ERROR
SymbolKind 成员: SYM_VARIABLE, SYM_PARAMETER, SYM_FUNCTION, SYM_STRUCT, SYM_ENUM
1.4 关键架构决策
| 决策 |
说明 |
| impl 改名 mangle |
sema 阶段将 impl S { fn f } 转为 S$f, 追加 self 参数; codegen 零修改 |
| match 脱糖为 let+if-else |
parser 阶段直接生成 AST_BLOCK + AST_LET_STMT + AST_IF_STMT 链; sema/codegen 完全复用 |
| parse_type_expr 统一入口 |
所有类型标注解析通过同一函数, 天然支持 [T; N] 嵌套 |
| SourceLoc 聚合 |
{ int line; int col; } 替代所有松散参数对 |
| cleanup_list 动态扩容 |
arena realloc, 消除固定 64 槽溢出风险 |
2. 功能完成度总览
2.1 P0 (v0.1-v0.4) — 100%
2.2 P1 (v0.5) — 100%
| # |
功能 |
Rust 启发 |
实现方式 |
| P1-5 |
struct 参数/返回值 |
值语义 |
parse_type_expr 扩展 + codegen struct type |
| P1-6 |
数组+索引 |
[T; N], arr[i] |
parse_type_expr 嵌套 + GEP |
| P1-7 |
枚举 |
enum |
i64 常量映射 + SYM_ENUM |
| P1-8 |
match 表达式 |
模式匹配 (简化) |
parser 脱糖为 let+if-else |
| P1-9 |
struct 方法 impl |
impl block |
sema mangle + 普通函数调用 |
| P1-10 |
类型别名 |
type alias |
alias 展开链 (sema Pass 0) |
3. 测试覆盖
| 测试文件 |
测试函数 |
行数 |
覆盖范围 |
| test_lexer.c |
3 |
53 |
token 识别, 关键字, 操作符, 注释 |
| test_parser.c |
5 |
68 |
算术, let, if, while, 函数 |
| test_sema.c |
21 |
391 |
类型检查, let mut, str, struct, enum, array, method, type alias |
| test_codegen.c |
9 |
432 |
struct, enum, array, method call, LLVMVerifyModule |
| 合计 |
38 (+11 vs v0.4) |
944 |
|
| 集成 .l 程序 |
23 |
— |
算术→if→for→struct→enum→array→method→match |
4. Rust 对标缺失清单 (现状)
已完成
| 特性 |
状态 |
| 默认不可变 (let vs let mut) |
✅ |
| 复合赋值 |
✅ |
| for + range |
✅ |
| struct 具名域 |
✅ |
| impl 方法 |
✅ |
| enum + match (简化) |
✅ |
| 类型别名 |
✅ |
| 数组固定大小 |
✅ |
| RAII 自动释放 |
✅ |
缺失 (P2 — 中期)
| # |
功能 |
预计工时 |
优先级 |
| 11 |
表达式作为值 (expression-oriented) |
2–3 天 |
高 |
| 12 |
模块系统 mod + use |
3–5 天 |
高 |
| 13 |
泛型 (单态化) |
5–7 天 |
中 |
| 14 |
枚举关联数据 (代数数据类型) |
2 天 |
高 |
| 15 |
trait / 接口 |
5–7 天 |
中 |
缺失 (P3 — 长期)
| # |
功能 |
预计工时 |
| 16 |
所有权 / 借用检查 |
2–4 周 |
| 17 |
自举 (L 编译 L) |
4–6 周 |
| 18 |
标准库 (prelude) |
4–6 周 |
5. 技术债务 (不变)
| # |
问题 |
严重度 |
状态 |
| 1 |
analyze_expr 膨胀 (350+ 行) |
高 |
未修复 |
| 2 |
parser.c 单文件 825 行 |
中 |
未修复 |
| 3 |
codegen.c 单文件 824 行 |
中 |
未修复 |
| 4 |
match 脱糖在 parser, 非独立 pass |
中 |
未修复 |
| 5 |
数组 struct 元素类型 [Point; N] 未实现 |
中 |
未修复 |
| 6 |
match/sema 无独立单元测试 |
高 |
未修复 |
| 7 |
TypeKind 耦合 (加新类型需改 7+ 文件) |
低 |
未修复 |
| 8 |
AST Visitor 缺失 (加节点需改 4 个 switch) |
低 |
未修复 |
| 9 |
CHANGELOG 未更新 v0.4/v0.5 |
低 |
未修复 |
| 10 |
LLVM 22 无 mem2reg C API |
低 |
平台限制 |
6. 推荐开发路线图 (重述)
v0.6 优先 (2–3 天)
- parser 独立 desugar pass (for/match/compound assign)
- 数组 struct 元素类型
[Point; N]
- match/sema 单元测试
- CHANGELOG 更新
v0.7 优先
- 表达式作为值 (expression-oriented)
- 枚举关联数据 (代数数据类型)
- AST Visitor 宏驱动
本报告由 Codex 自动生成于 2026-06-05 17:08。自上次代码基线 a15cd9d (v0.5) 以来无新提交 — 代码库处于稳定状态。P1 路线图全线完成, 下一迭代应聚焦 parser 重构、数组 struct 元素类型、match/sema 测试、表达式作为值。