commit initial

This commit is contained in:
baishi
2026-05-30 07:59:28 +08:00
commit cbefad339f
39 changed files with 7736 additions and 0 deletions

View File

@@ -0,0 +1,461 @@
# TinyCC 编译器改进计划
Feature Name: 2026-05-20-tinycc-improvements
Updated: 2026-05-20
## Description
本改进计划涵盖 TinyCC 编译器的 9 个核心改进方向,分为三个阶段:
- **阶段一(基础完善)**:端到端测试、错误报告增强、仓库清理
- **阶段二(功能完善)**:语义分析、预处理器集成、代码生成优化
- **阶段三(高级特性)**DWARF 调试信息、PE 格式支持、性能基准
## Architecture
```mermaid
graph TD
subgraph "阶段一:基础完善"
A1[E2E 测试框架] --> A2[测试用例集合]
B1[ErrorReporter 增强] --> B2[代码上下文格式化]
C1[.gitignore 更新] --> C2[移除误提交文件]
end
subgraph "阶段二:功能完善"
D1[SemanticAnalyzer 完善] --> D2[类型系统增强]
D1 --> D3[作用域管理优化]
E1[Preprocessor 集成] --> E2[宏展开引擎]
E1 --> E3[头文件搜索机制]
F1[优化 CodeGen] --> F2[寄存器分配器]
F1 --> F3[指令选择优化]
end
subgraph "阶段三:高级特性"
G1[DWARF 生成器] --> G2[调试信息编码]
G1 --> G3[行号表生成]
H1[PE Writer 完善] --> H2[PE 头生成]
H1 --> H3[重定位表生成]
I1[性能基准] --> I2[编译时间测量]
I1 --> I3[执行时间测量]
end
A2 -. 验证 .-> D1
B2 -. 集成 .-> D1
D3 -. 输入 .-> F2
E3 -. 输出 .-> A2
```
### 改进架构概览
改进计划遵循渐进式实现策略,每个阶段的输出为下一阶段提供基础:
1. **阶段一**建立测试基础设施和用户体验改进
2. **阶段二**完善编译器核心功能
3. **阶段三**添加高级特性和性能监控
## Components and Interfaces
### 1. 端到端测试框架
**职责**
- 编译测试 C 源文件并验证生成的可执行文件
- 管理测试用例输入和预期输出
- 报告测试通过/失败状态
**接口**
```csharp
public interface IE2ETestRunner
{
Task<TestResult> RunTestAsync(TestCase testCase);
IEnumerable<TestCase> LoadTestsFromDirectory(string directory);
}
public record TestCase(
string Name,
string SourceCode,
int ExpectedExitCode,
string? ExpectedOutput = null
);
public record TestResult(
string TestCaseName,
bool Passed,
int ActualExitCode,
string? ActualOutput = null,
string? ErrorMessage = null
);
```
**实现策略**
- 使用 `CompilerDriver` 编译源代码到临时 ELF 文件
- 使用 `Process` 类执行生成的可执行文件
- 比较实际输出/退出码与预期值
### 2. 错误报告增强
**职责**
- 格式化错误信息,包含代码上下文
- 生成可视化错误位置标记
- 支持多错误汇总输出
**接口扩展**
```csharp
public record ErrorInfo(
ErrorLevel Level,
string Message,
SourceLocation Location,
string? SourceLine = null, // 新增:出错的源代码行
int? ColumnOffset = null, // 新增:错误在行内的偏移
string? Suggestion = null // 新增:修复建议
);
public sealed class ErrorReporter : IErrorReporter
{
private readonly List<ErrorInfo> _errors = new();
private readonly Dictionary<string, string[]> _sourceCache = new(); // 新增:源代码缓存
public void Report(ErrorInfo error);
public void SetSourceLines(string fileName, string[] lines); // 新增:设置源代码行
public string FormatErrors(); // 新增:格式化所有错误
}
```
**格式化输出示例**
```
test.c:3:5: error: expected ';' before 'return'
2 | int add(int a, int b) {
3 | int x = a + b
| ^^^^^^^^
4 | return x;
| ~~~~~
help: add ';' at the end of the statement
```
### 3. 语义分析器完善
**职责扩展**
- 实现完整的类型检查系统
- 支持嵌套作用域管理
- 检测函数签名不匹配
**新增组件**
```csharp
public sealed class TypeChecker
{
public CType? CheckBinaryOperation(TokenType op, CType left, CType right, SourceLocation loc);
public CType? CheckUnaryOperation(TokenType op, CType operand, SourceLocation loc);
public bool IsCompatible(CType source, CType target);
public CType? PromoteType(CType type); // 类型提升
}
public sealed class ScopeManager
{
private readonly Stack<Dictionary<string, Symbol>> _scopes = new();
public void EnterScope();
public void ExitScope();
public void DeclareSymbol(string name, Symbol symbol);
public Symbol? LookupSymbol(string name);
public bool IsDeclared(string name);
}
```
**类型检查规则**
| 操作 | 左操作数 | 右操作数 | 结果类型 |
|------|---------|---------|---------|
| 算术运算 | 整数/浮点 | 整数/浮点 | 提升后的类型 |
| 比较运算 | 数值类型 | 数值类型 | int |
| 赋值 | 类型 T | 类型 S | TS 必须可转换为 T |
### 4. 预处理器集成
**职责**
- 处理 `#include``#define`、条件编译
- 管理头文件搜索路径
- 宏展开和参数替换
**接口**
```csharp
public interface IPreprocessor
{
string Preprocess(string sourceCode, string sourceFile);
void AddIncludePath(string path);
void DefineMacro(string name, string? value);
void UndefineMacro(string name);
}
public sealed class Macro
{
public string Name { get; }
public string? Value { get; }
public List<string>? Parameters { get; } // 函数宏参数
public string? Body { get; }
}
```
**集成到 CompilerDriver**
```csharp
// 在 CompilerDriver.Compile 中
var preprocessor = new Preprocessor(_errorReporter);
foreach (var includePath in options.IncludePaths)
{
preprocessor.AddIncludePath(includePath);
}
var preprocessedSource = preprocessor.Preprocess(options.SourceFile);
var lexer = new Lexer(preprocessedSource, options.SourceFile, _errorReporter);
```
### 5. 代码生成优化
**职责**
- 实现图着色寄存器分配
- 指令选择和调度
- 栈帧布局优化
**寄存器分配器接口**
```csharp
public sealed class GraphColoringAllocator
{
private readonly Dictionary<IrValue, HashSet<IrValue>> _interferenceGraph = new();
private readonly Dictionary<IrValue, string> _allocation = new();
private readonly HashSet<IrValue> _spilledVars = new();
public void Allocate(IrFunction function, string[] availableRegs);
public string? GetRegister(IrValue value);
public bool IsSpilled(IrValue value);
}
```
**优化验证策略**
- 比较优化前后生成的机器码长度
- 验证优化后程序的执行结果正确性
- 测量溢出变量数量
### 6. DWARF 调试信息生成器
**职责**
- 生成 DWARF 调试信息节
- 编码源文件路径和行号映射
- 生成变量和类型调试信息
**接口**
```csharp
public sealed class DwarfGenerator
{
private readonly List<DwarfInfo> _debugInfo = new();
private readonly List<DwarfLine> _lineTable = new();
public void AddFile(string fileName);
public void AddLineEntry(int fileIndex, int line, int address);
public void AddVariable(string name, CType type, int scopeLevel, int offset);
public byte[] GenerateDebugSection();
public byte[] GenerateLineSection();
}
```
**ELF 集成**
-`ElfWriter` 中添加 `.debug_info``.debug_line`
- 更新节头表和字符串表
### 7. PE 写出器完善
**职责**
- 生成完整的 PE32+ 文件头
- 创建 `.text``.data`
- 处理重定位和导入表
**PE 文件结构**
```
DOS Header (64 bytes)
PE Signature ("PE\0\0")
COFF File Header (20 bytes)
Optional Header (PE32+, 112 bytes)
Data Directories (16 entries)
Section Headers (40 bytes per section)
.text Section (代码)
.data Section (数据)
```
### 8. 性能基准测试框架
**职责**
- 测量编译时间
- 测量生成代码执行时间
- 生成统计报告
**接口**
```csharp
public sealed class BenchmarkRunner
{
public BenchmarkResult RunCompilationBenchmark(string sourceFile, int iterations = 10);
public BenchmarkResult RunExecutionBenchmark(string executable, int iterations = 100);
}
public record BenchmarkResult(
string TestName,
double MeanTimeMs,
double MedianTimeMs,
double StdDevMs,
int Iterations
);
```
## Data Models
### 错误信息模型(增强)
```csharp
public enum ErrorLevel
{
Warning,
Error,
Fatal
}
public readonly struct SourceLocation
{
public string FileName { get; }
public int Line { get; }
public int Column { get; }
public int Length { get; } // 新增:错误跨度
}
```
### 测试用例模型
```csharp
public record TestCase(
string Name,
string SourceCode,
int ExpectedExitCode,
string? ExpectedOutput = null,
string? ExpectedErrorPattern = null // 期望的错误模式
);
```
### DWARF 调试信息模型
```csharp
public record DwarfInfoEntry(
uint Offset,
uint AbbrevCode,
Dictionary<uint, object> Attributes
);
public record DwarfLineEntry(
int Address,
int FileIndex,
int Line,
int Column,
bool IsStatement,
bool IsEndOfSequence
);
```
## Correctness Properties
### 不变量
1. **测试覆盖完整性**: 每个 C 语言特性至少有一个 E2E 测试用例
2. **错误信息准确性**: 错误位置标记必须指向正确的源代码行和列
3. **类型检查健全性**: 类型检查必须拒绝所有类型错误的程序
4. **寄存器分配正确性**: 分配的寄存器不能干涉活跃变量
5. **调试信息一致性**: 调试信息中的行号必须与实际代码位置匹配
### 约束条件
1. E2E 测试必须在 Linux x64 环境下运行
2. 错误报告格式化器必须处理多字节字符
3. 寄存器分配器必须遵循 System V AMD64 ABI
4. DWARF 信息必须兼容 gdb 7.0+
5. PE 文件必须兼容 Windows 10+ 加载器
## Error Handling
### 错误场景与处理策略
| 错误场景 | 检测阶段 | 处理方式 |
|---------|---------|---------|
| 头文件不存在 | 预处理 | 报告错误,提供搜索路径 |
| 宏重复定义 | 预处理 | 报告警告,使用新定义 |
| 未声明变量 | 语义分析 | 报告错误,标记位置 |
| 类型不匹配 | 语义分析 | 报告错误,显示期望和实际类型 |
| 寄存器溢出 | 代码生成 | 溢出到栈,更新栈帧布局 |
| DWARF 编码失败 | 调试信息生成 | 报告错误,继续编译 |
| PE 头生成失败 | 目标文件写入 | 报告错误,终止编译 |
### 错误恢复策略
- **词法/语法错误**: 尝试跳过错误 token继续解析
- **语义错误**: 收集所有错误,一次性输出
- **代码生成错误**: 立即终止,报告详细错误信息
## Test Strategy
### 单元测试
1. **错误报告测试**: 验证错误信息格式化和代码上下文显示
2. **类型检查测试**: 验证各种类型场景的检查逻辑
3. **寄存器分配测试**: 验证图着色算法正确性
4. **DWARF 编码测试**: 验证调试信息编码正确性
### 集成测试
1. **端到端测试**: 编译并运行测试 C 程序,验证输出
2. **预处理器集成测试**: 验证宏展开和头文件包含
3. **PE 格式测试**: 在 Windows 环境验证生成的 PE 文件
### E2E 测试用例集合
```c
// test_arithmetic.c - 算术运算测试
int add(int a, int b) { return a + b; }
int main() { return add(3, 4) == 7 ? 0 : 1; }
// test_control_flow.c - 控制流测试
int main() {
int sum = 0;
for (int i = 1; i <= 10; i++) sum += i;
return sum == 55 ? 0 : 1;
}
// test_functions.c - 函数调用测试
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
int main() { return factorial(5) == 120 ? 0 : 1; }
// test_pointers.c - 指针测试
int main() {
int x = 42;
int *p = &x;
return *p == 42 ? 0 : 1;
}
// test_arrays.c - 数组测试
int main() {
int arr[3] = {1, 2, 3};
return arr[1] == 2 ? 0 : 1;
}
// test_macro.c - 宏测试
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int main() { return MAX(3, 5) == 5 ? 0 : 1; }
```
### 性能基准测试
- **编译时间基准**: 测量编译标准 C 文件的时间(如 `factorial.c`, `sort.c`
- **执行时间基准**: 测量生成代码执行时间,与 gcc/clang 对比
- **内存使用基准**: 测量编译过程中的内存峰值
## References
[^1]: (DWARF Spec) - DWARF 调试标准格式 https://dwarfstd.org
[^2]: (PE Spec) - Microsoft PE 和 COFF 规范 https://docs.microsoft.com/en-us/windows/win32/debug/pe-format
[^3]: (System V AMD64 ABI) - x64 调用约定 https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf
[^4]: (ELF Spec) - ELF 规范 https://refspecs.linuxfoundation.org/elf/elf.pdf
[^5]: (CompilerDriver.cs#L18) - 当前编译器驱动实现 src/TinyCC.Core/CompilerDriver.cs
[^6]: (ErrorReporter.cs#L6) - 当前错误报告器实现 src/TinyCC.Core/Diagnostics/ErrorReporter.cs
[^7]: (SemanticAnalyzer.cs#L11) - 当前语义分析器实现 src/TinyCC.Core/Semantic/SemanticAnalyzer.cs
[^8]: (OptimizedX64CodeGenerator.cs#L12) - 当前优化代码生成器实现 src/TinyCC.Core/CodeGen/OptimizedX64CodeGenerator.cs

View File

@@ -0,0 +1,123 @@
# Requirements Document
## Introduction
本改进计划涵盖 TinyCC 编译器的 9 个核心改进方向包括端到端测试、错误报告增强、代码清理、语义分析完善、预处理器集成、代码生成优化、调试信息支持、PE 格式支持及性能基准测试。
## Glossary
- **TinyCC**: 本项目实现的轻量级 C 编译器
- **E2E 测试**: 端到端测试,验证完整编译流程
- **ELF**: Executable and Linkable FormatLinux 可执行文件格式
- **PE**: Portable ExecutableWindows 可执行文件格式
- **DWARF**: 调试信息格式,支持源码级调试
- **ABI**: Application Binary Interface应用二进制接口
## Requirements
### Requirement 1: 端到端编译测试
**User Story:** AS 一个编译器开发者I WANT 验证完整编译流程生成的可执行文件能够正确运行SO THAT 确保编译器各组件协同工作正常
#### Acceptance Criteria
1. WHEN 提供包含 `main` 函数的 C 源代码,编译器 SHALL 生成可在 Linux 上执行的 ELF 文件
2. WHEN 运行生成的 ELF 文件,程序 SHALL 返回正确的退出码
3. WHEN 编译包含算术运算的 C 程序,执行程序 SHALL 输出正确的计算结果
4. WHEN 编译包含函数调用的 C 程序,执行程序 SHALL 正确调用函数并返回结果
5. WHEN 编译包含控制流语句if/while/for的 C 程序,执行程序 SHALL 正确执行控制流
### Requirement 2: 增强错误报告
**User Story:** AS 一个 C 程序员I WANT 编译器提供包含代码上下文和位置提示的错误信息SO THAT 能够快速定位和修复代码问题
#### Acceptance Criteria
1. WHEN 报告编译错误,错误信息 SHALL 包含文件名、行号和列号
2. WHEN 报告语法错误,错误信息 SHALL 显示出错代码行及错误位置标记
3. WHEN 报告类型错误,错误信息 SHALL 说明期望的类型和实际提供的类型
4. WHEN 报告多个错误,编译器 SHALL 汇总所有错误并一次性输出
5. IF 错误信息包含建议,建议 SHALL 提供可能的修复方向
### Requirement 3: 清理误提交文件
**User Story:** AS 一个仓库维护者I WANT 从版本控制中移除构建产物和临时文件SO THAT 保持仓库整洁并减小仓库体积
#### Acceptance Criteria
1. WHEN 提交代码,构建目录 `bin/``obj/` SHALL 被 `.gitignore` 排除
2. WHEN 提交代码,临时测试文件 `test_output` SHALL 从版本控制中移除
3. WHEN 提交代码,本地测试文件 `test.c` SHALL 从版本控制中移除
### Requirement 4: 语义分析器完整实现
**User Story:** AS 一个 C 编译器开发者I WANT 语义分析器能够验证程序的语义正确性SO THAT 拒绝语义错误的 C 程序
#### Acceptance Criteria
1. WHEN 遇到未声明的变量,语义分析器 SHALL 报告"未声明的标识符"错误
2. WHEN 遇到类型不匹配的赋值操作,语义分析器 SHALL 报告类型不匹配错误
3. WHEN 遇到函数调用参数数量不匹配,语义分析器 SHALL 报告参数数量错误
4. WHEN 遇到函数调用参数类型不匹配,语义分析器 SHALL 报告参数类型错误
5. WHILE 处理嵌套作用域,语义分析器 SHALL 正确解析变量的词法作用域
6. WHEN 遇到重复的函数声明,语义分析器 SHALL 报告重复定义错误
### Requirement 5: 预处理器集成到编译流程
**User Story:** AS 一个 C 编译器用户I WANT 编译器正确处理预处理指令SO THAT 可以编译包含宏和头文件的 C 程序
#### Acceptance Criteria
1. WHEN 遇到 `#include` 指令,预处理器 SHALL 展开并包含指定头文件的内容
2. WHEN 遇到 `#define` 宏定义,预处理器 SHALL 在后续代码中展开宏
3. WHEN 遇到 `#ifdef`/`#ifndef` 条件编译,预处理器 SHALL 根据宏定义情况选择编译分支
4. WHEN 预处理完成后,编译器驱动 SHALL 将预处理后的源代码传递给词法分析器
5. IF 头文件不存在,预处理器 SHALL 报告错误并提供搜索路径信息
### Requirement 6: 代码生成优化验证
**User Story:** AS 一个编译器开发者I WANT 验证优化后的代码生成器能够正确分配寄存器并生成高效代码SO THAT 提升生成程序的执行性能
#### Acceptance Criteria
1. WHEN 使用优化代码生成器编译函数,寄存器分配算法 SHALL 为活跃变量分配物理寄存器
2. WHEN 寄存器数量不足,寄存器分配算法 SHALL 正确地将变量溢出到栈
3. WHEN 生成优化后的机器码,程序执行结果 SHALL 与未优化版本一致
4. WHILE 分配寄存器,寄存器分配算法 SHALL 遵循调用约定保留被调用者保存的寄存器
5. IF 代码生成器生成溢出代码,溢出区域 SHALL 正确管理栈帧布局
### Requirement 7: DWARF 调试信息生成
**User Story:** AS 一个 C 程序员I WANT 编译器生成 DWARF 调试信息SO THAT 可以使用 gdb 对生成的可执行文件进行源码级调试
#### Acceptance Criteria
1. WHEN 启用调试信息选项,编译器 SHALL 在 ELF 文件中生成 `.debug_info`
2. WHEN 生成调试信息,调试信息 SHALL 包含源文件路径和行号映射
3. WHEN 生成调试信息,调试信息 SHALL 包含变量名称、类型和作用域信息
4. WHEN 使用 gdb 加载生成的可执行文件gdb SHALL 能够显示源代码并设置断点
5. IF 未启用调试信息选项,编译器 SHALL 不生成调试信息以减小文件体积
### Requirement 8: PE 格式可执行文件支持
**User Story:** AS 一个 Windows 用户I WANT 编译器生成 Windows PE 格式的可执行文件SO THAT 可以在 Windows 系统上运行编译后的程序
#### Acceptance Criteria
1. WHEN 指定目标平台为 Windows x64编译器 SHALL 生成 PE32+ 格式的可执行文件
2. WHEN 生成 PE 文件PE 文件 SHALL 包含正确的 DOS 头和 PE 签名
3. WHEN 生成 PE 文件PE 文件 SHALL 包含有效的节表(`.text``.data`
4. WHEN 运行生成的 PE 文件Windows 操作系统 SHALL 能够加载并执行程序
5. WHEN 生成 PE 文件PE 文件 SHALL 设置正确的入口点Entry Point
### Requirement 9: 编译性能基准测试
**User Story:** AS 一个编译器开发者I WANT 建立编译性能基准SO THAT 可以量化编译器性能变化并识别性能瓶颈
#### Acceptance Criteria
1. WHEN 运行性能基准测试,测试 SHALL 测量编译器处理标准 C 文件的编译时间
2. WHEN 运行性能基准测试,测试 SHALL 测量生成代码的执行时间
3. WHEN 运行性能基准测试,测试 SHALL 输出编译时间和执行时间的统计报告
4. WHILE 进行性能优化,开发者 SHALL 能够对比优化前后的基准测试结果
5. IF 性能基准测试发现回归,测试结果 SHALL 标记性能下降的模块

View File

@@ -0,0 +1,80 @@
# TinyCC 改进计划 - 任务列表
Feature Name: 2026-05-20-tinycc-improvements
Created: 2026-05-20
## 阶段一:基础完善
### Task 1.1: 创建端到端测试框架
- [ ] 1.1.1 创建 `TinyCC.E2ETests` 测试项目,配置 xUnit 测试框架
- [ ] 1.1.2 实现 `E2ETestRunner` 类,支持编译 C 源代码并执行生成的 ELF 文件
- [ ] 1.1.3 实现测试用例管理,支持从嵌入式代码或文件加载测试用例
- [ ] 1.1.4 编写基础测试用例:算术运算、控制流、函数调用
- [ ] 1.1.5 运行端到端测试,验证当前编译器功能,记录失败项
### Task 1.2: 增强错误报告
- [ ] 1.2.1 扩展 `ErrorInfo` 结构,添加 `SourceLine``ColumnOffset``Suggestion` 字段
- [ ] 1.2.2 在 `ErrorReporter` 中实现源代码行缓存机制
- [ ] 1.2.3 实现错误信息格式化器,支持代码上下文和位置标记显示
- [ ] 1.2.4 集成到 `CompilerDriver`,在编译前缓存源代码行
- [ ] 1.2.5 编写单元测试验证错误格式化输出
### Task 1.3: 清理误提交文件
- [ ] 1.3.1 更新 `.gitignore`,确保 `bin/``obj/``test.c``test_output/` 被排除
- [ ] 1.3.2 从 git 历史中移除 `test_output``test.c` 文件
- [ ] 1.3.3 验证 `git status` 输出清洁,无构建产物
## 阶段二:功能完善
### Task 2.1: 完善语义分析器
- [ ] 2.1.1 实现完整的 `TypeChecker` 类,支持类型兼容性检查和类型提升
- [ ] 2.1.2 完善 `ScopeManager`,支持嵌套作用域和符号查找
- [ ] 2.1.3 实现函数签名验证,检测参数数量和类型不匹配
- [ ] 2.1.4 实现重复声明检测(函数和全局变量)
- [ ] 2.1.5 编写单元测试验证类型检查和作用域管理
### Task 2.2: 预处理器集成到编译流程
- [ ] 2.2.1 完善 `Preprocessor` 类,支持 `#include` 头文件搜索和展开
- [ ] 2.2.2 实现 `#define` 宏定义和宏展开(包括函数宏)
- [ ] 2.2.3 实现条件编译 `#ifdef`/`#ifndef`/`#endif`/`#if`/`#else`/`#elif`
- [ ] 2.2.4 集成预处理器到 `CompilerDriver.Compile` 流程
- [ ] 2.2.5 编写单元测试和 E2E 测试验证预处理功能
### Task 2.3: 代码生成优化验证
- [ ] 2.3.1 完善 `GraphColoringAllocator` 寄存器分配器实现
- [ ] 2.3.2 实现变量溢出到栈的逻辑和栈帧布局管理
- [ ] 2.3.3 集成优化代码生成器到 `CompilerDriver`
- [ ] 2.3.4 编写测试验证优化前后代码执行结果一致性
- [ ] 2.3.5 比较优化前后生成的机器码长度和寄存器使用情况
## 阶段三:高级特性
### Task 3.1: DWARF 调试信息生成
- [ ] 3.1.1 实现 `DwarfGenerator` 类,支持 DWARF 调试信息编码
- [ ] 3.1.2 实现行号表生成(`.debug_line` 节)
- [ ] 3.1.3 实现变量和类型调试信息(`.debug_info` 节)
- [ ] 3.1.4 集成到 `ElfWriter`,添加调试信息节到 ELF 文件
- [ ] 3.1.5 使用 gdb 验证生成的调试信息可正确显示源码和设置断点
### Task 3.2: PE 格式可执行文件支持
- [ ] 3.2.1 完善 `PeWriter`,生成完整的 PE32+ 文件头
- [ ] 3.2.2 实现 `.text``.data` 节创建和填充
- [ ] 3.2.3 实现 PE 入口点设置和重定位处理
- [ ] 3.2.4 集成 PE 写出器到 `CompilerDriver` 的 Windows 平台分支
- [ ] 3.2.5 验证生成的 PE 文件可在 Windows 环境加载执行
### Task 3.3: 编译性能基准测试
- [ ] 3.3.1 实现 `BenchmarkRunner` 类,支持编译时间和执行时间测量
- [ ] 3.3.2 创建标准测试用例集合factorial、sort 等)
- [ ] 3.3.3 实现统计报告生成(均值、中位数、标准差)
- [ ] 3.3.4 集成到测试框架,支持一键运行基准测试
- [ ] 3.3.5 记录初始基准数据,建立性能基线