5a0bf60698
- CHANGELOG: 新增 v0.4.0 (struct+RAII) 和 v0.5.0 (alias+enum+array+impl+match) - README: 版本0.5.0, 测试145, 完整功能列表+运算符表 - CLAUDE: v0.5 已知限制更新
186 lines
6.7 KiB
Markdown
186 lines
6.7 KiB
Markdown
# L Language 架构分析报告 — 无代码变更 (快照复查)
|
||
|
||
> 日期: 2026-06-05 17:08 | 自动生成 | **无源代码变更**
|
||
> 上次代码基线: `a15cd9d` (2026-06-05 15:09 报告, v0.5)
|
||
> 当前 HEAD: `a15cd9d` feat: match 表达式 (P1 #8 收官)
|
||
>
|
||
> **结论: 自上次架构分析报告以来无新提交。以下为当前架构快照及健全性复查。**
|
||
|
||
---
|
||
|
||
## 代码变更检查
|
||
|
||
```
|
||
git log a15cd9d..HEAD → (空)
|
||
```
|
||
|
||
`a15cd9d` 仍是 HEAD。与上次报告 (2026-06-05 15:09) 完全一致。**零文件变更,零行差异。**
|
||
|
||
---
|
||
|
||
## 1. 当前架构快照 (v0.5)
|
||
|
||
### 1.1 编译流水线
|
||
|
||
```
|
||
源码(.l) → Lexer(词法) → Parser(语法) → Sema(语义) → Codegen(LLVM IR) → Target(obj) → GCC 链接(.exe)
|
||
50 Token 25 AST 节点 类型标注 LLVMModuleRef .o 文件
|
||
```
|
||
|
||
### 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%
|
||
|
||
- [x] 词法/语法/语义三阶段解析
|
||
- [x] i64/f64/bool/void/str 类型
|
||
- [x] 算术/比较/逻辑运算
|
||
- [x] if/else/while/return 控制流
|
||
- [x] 函数定义+调用+递归
|
||
- [x] let/let mut 变量+赋值
|
||
- [x] 字符串拼接 str+str
|
||
- [x] 复合赋值 += -= *= /=
|
||
- [x] for + range (去糖为 let mut + while + assign)
|
||
- [x] struct 声明/初始化/字段访问/嵌套
|
||
- [x] RAII 自动内存管理 (cleanup_list)
|
||
- [x] 3 内置函数: print_i64, print_f64, print_str
|
||
|
||
### 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 天)
|
||
|
||
1. parser 独立 desugar pass (for/match/compound assign)
|
||
2. 数组 struct 元素类型 `[Point; N]`
|
||
3. match/sema 单元测试
|
||
4. CHANGELOG 更新
|
||
|
||
### v0.7 优先
|
||
|
||
1. 表达式作为值 (expression-oriented)
|
||
2. 枚举关联数据 (代数数据类型)
|
||
3. AST Visitor 宏驱动
|
||
|
||
---
|
||
|
||
*本报告由 Codex 自动生成于 2026-06-05 17:08。自上次代码基线 `a15cd9d` (v0.5) 以来无新提交 — 代码库处于稳定状态。P1 路线图全线完成, 下一迭代应聚焦 parser 重构、数组 struct 元素类型、match/sema 测试、表达式作为值。*
|