Files
l-language/docs/analysis/architecture-analysis-report-2026-06-05-1708.md
T
Serendipity 5a0bf60698 docs: CHANGELOG v0.4/v0.5 + README/CLAUDE 版本刷新
- CHANGELOG: 新增 v0.4.0 (struct+RAII) 和 v0.5.0 (alias+enum+array+impl+match)
- README: 版本0.5.0, 测试145, 完整功能列表+运算符表
- CLAUDE: v0.5 已知限制更新
2026-06-05 18:42:24 +08:00

186 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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) | 23 天 | 高 |
| 12 | 模块系统 `mod` + `use` | 35 天 | 高 |
| 13 | 泛型 (单态化) | 57 天 | 中 |
| 14 | 枚举关联数据 (代数数据类型) | 2 天 | 高 |
| 15 | trait / 接口 | 57 天 | 中 |
### 缺失 (P3 — 长期)
| # | 功能 | 预计工时 |
|---|------|---------|
| 16 | 所有权 / 借用检查 | 2–4 周 |
| 17 | 自举 (L 编译 L) | 46 周 |
| 18 | 标准库 (prelude) | 46 周 |
---
## 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 优先 (23 天)
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 测试、表达式作为值。*