|
152 | 152 | - O(1)复杂度的函数查找实现 |
153 | 153 | - 避免字符串匹配的性能损耗 |
154 | 154 |
|
| 155 | +--- |
| 156 | + |
| 157 | +## [v0.9.4 Pre3] - 2025-08-16 |
| 158 | + |
| 159 | +### 核心设计原则回归 |
| 160 | + |
| 161 | +#### 移除硬编码内置函数 |
| 162 | +- **设计原则**:CodeNothing的设计宗旨是"没有内置函数,内置函数以Library实现" |
| 163 | +- 移除编译器中硬编码的`println`函数特殊处理逻辑 |
| 164 | +- 移除VM中的`Print`字节码指令处理 |
| 165 | +- 移除语句编译中对内置函数的特殊判断逻辑 |
| 166 | + |
| 167 | +#### 统一库函数调用机制 |
| 168 | +- 所有函数调用(包括`println`)必须通过`using lib <library>`导入 |
| 169 | +- 强制使用`using lib <io>; using ns std;`来启用`println`功能 |
| 170 | +- 确保VM和解释器都遵循相同的库导入规则 |
| 171 | + |
| 172 | +### VM字节码系统修复 |
| 173 | + |
| 174 | +#### 编译器模块修复 (`src/vm/compiler.rs`) |
| 175 | +- 移除`Expression::FunctionCall`中对`println`的特殊处理分支 |
| 176 | +- 移除`Statement::FunctionCallStatement`中的内置函数检测逻辑 |
| 177 | +- 统一所有函数调用通过库系统或命名空间系统处理 |
| 178 | +- 改进错误信息,提示用户导入相应库 |
| 179 | + |
| 180 | +#### VM执行引擎修复 (`src/vm/vm.rs`) |
| 181 | +- 移除`ByteCode::Print`指令的执行逻辑 |
| 182 | +- 所有输出功能通过`CallLibrary`指令调用`std::println` |
| 183 | +- 确保栈管理的一致性,移除特殊的栈处理逻辑 |
| 184 | + |
| 185 | +#### 字节码指令集扩展 (`src/vm/bytecode.rs`) |
| 186 | +- `Print`指令标记为未使用(保留向后兼容性) |
| 187 | +- 新增循环控制指令:`Jump`、`JumpIfFalse`、`JumpIfTrue` |
| 188 | +- 所有输出操作统一使用`CallLibrary`指令 |
| 189 | +- 完善控制流指令集,支持复杂程序结构 |
| 190 | + |
| 191 | +### 控制流语句完整实现 |
| 192 | + |
| 193 | +#### While循环支持 |
| 194 | +- 实现VM中`while`循环的完整编译和执行 |
| 195 | +- 添加`compile_while_loop`方法处理循环体编译 |
| 196 | +- 支持嵌套while循环和复杂条件表达式 |
| 197 | +- 正确处理循环中的变量作用域 |
| 198 | + |
| 199 | +#### For循环支持 |
| 200 | +- 实现传统for循环:`for (init; condition; increment)` |
| 201 | +- 实现范围for循环:`for (item in collection)` |
| 202 | +- 添加循环控制语句:`break`和`continue` |
| 203 | +- 支持多层嵌套for循环结构 |
| 204 | + |
| 205 | +#### 循环字节码指令 |
| 206 | +- 新增字节码指令: |
| 207 | + - `Jump(u32)` - 无条件跳转 |
| 208 | + - `JumpIfFalse(u32)` - 条件跳转 |
| 209 | + - `JumpIfTrue(u32)` - 条件跳转(保留) |
| 210 | +- 实现循环的高效字节码生成 |
| 211 | +- 优化跳转指令的地址计算 |
| 212 | + |
| 213 | +### 数组类型系统完善 |
| 214 | + |
| 215 | +#### 类型推断修复 |
| 216 | +- 修复VM编译器中对`auto`类型的数组推断 |
| 217 | +- 正确处理`[]int`数组类型语法(而非`[int]`) |
| 218 | +- 修复类型检查器中数组索引访问的类型验证 |
| 219 | + |
| 220 | +#### 函数参数类型规范 |
| 221 | +- 修复函数参数中`auto`类型导致的类型检查错误 |
| 222 | +- 要求数组参数使用明确类型声明:`arr : []int` |
| 223 | +- 提高类型安全性和代码可读性 |
| 224 | + |
| 225 | +### 栈管理系统优化 |
| 226 | + |
| 227 | +#### 函数调用栈修复 |
| 228 | +- 修复`Print`指令移除后的栈平衡问题 |
| 229 | +- 统一函数调用语句的栈清理逻辑 |
| 230 | +- 确保所有函数调用后正确执行`Pop`指令 |
| 231 | + |
| 232 | +#### 内存管理改进 |
| 233 | +- 优化VM栈空间使用 |
| 234 | +- 修复潜在的栈溢出风险 |
| 235 | +- 提高内存使用效率 |
| 236 | + |
| 237 | +### 测试验证完善 |
| 238 | + |
| 239 | +#### 库导入测试 |
| 240 | +- 创建`test_vm_with_library.cn`验证正确的库导入语法 |
| 241 | +- 测试`using lib <io>; using ns std;`的完整流程 |
| 242 | +- 验证`println`通过库系统的正确调用 |
| 243 | + |
| 244 | +#### 数组功能测试 |
| 245 | +- 测试数组创建、访问、修改的完整流程 |
| 246 | +- 验证数组类型推断的正确性 |
| 247 | +- 确保VM和解释器的数组处理一致性 |
| 248 | + |
| 249 | +#### 循环控制测试 |
| 250 | +- While循环的条件判断和循环体执行 |
| 251 | +- For循环的初始化、条件检查、递增操作 |
| 252 | +- 嵌套循环的正确执行和变量作用域 |
| 253 | +- Break和continue语句的跳转逻辑 |
| 254 | + |
| 255 | +#### 综合功能测试 |
| 256 | +- 基础变量和表达式计算 |
| 257 | +- 条件语句和循环控制 |
| 258 | +- 数组操作和函数调用 |
| 259 | +- 命名空间函数的正确执行 |
| 260 | +- 复杂控制流的组合使用 |
| 261 | + |
| 262 | +### 架构一致性提升 |
| 263 | + |
| 264 | +#### 设计原则遵循 |
| 265 | +- **严格遵循**"没有内置函数"的核心设计原则 |
| 266 | +- 所有功能通过库系统提供,保持语言的纯净性 |
| 267 | +- 编译器和VM不包含任何硬编码的函数实现 |
| 268 | + |
| 269 | +#### 库系统完整性 |
| 270 | +- VM完全依赖库系统提供基础功能 |
| 271 | +- 库加载机制在编译时和运行时的一致性 |
| 272 | +- 支持动态库函数发现和映射 |
| 273 | + |
| 274 | +#### 错误处理改进 |
| 275 | +- 提供清晰的库导入错误提示 |
| 276 | +- 指导用户正确使用`using lib <library>`语法 |
| 277 | +- 改进类型错误的诊断信息 |
| 278 | + |
| 279 | +### 修复的关键问题 |
| 280 | + |
| 281 | +#### 设计原则违背 |
| 282 | +- **问题**:编译器硬编码了`println`函数处理 |
| 283 | +- **修复**:移除所有硬编码逻辑,强制通过库导入 |
| 284 | + |
| 285 | +#### 栈管理不一致 |
| 286 | +- **问题**:`Print`指令的栈处理与其他指令不一致 |
| 287 | +- **修复**:统一所有函数调用的栈管理逻辑 |
| 288 | + |
| 289 | +#### 类型系统缺陷 |
| 290 | +- **问题**:数组类型推断和语法解析存在问题 |
| 291 | +- **修复**:完善类型检查器和解析器的数组处理 |
| 292 | + |
| 293 | +#### 控制流支持不完整 |
| 294 | +- **问题**:VM缺乏对while和for循环的完整支持 |
| 295 | +- **修复**:实现完整的循环编译和执行机制 |
| 296 | + |
| 297 | +#### 测试覆盖不足 |
| 298 | +- **问题**:缺乏对库导入机制和循环控制的完整测试 |
| 299 | +- **修复**:创建专门的库导入和循环控制测试用例 |
| 300 | + |
| 301 | +### 技术实现亮点 |
| 302 | + |
| 303 | +#### 纯净的语言设计 |
| 304 | +- 实现了真正的"无内置函数"语言架构 |
| 305 | +- 所有功能模块化,通过库系统组织 |
| 306 | +- 为未来的标准库扩展奠定基础 |
| 307 | + |
| 308 | +#### 统一的执行模型 |
| 309 | +- VM和解释器使用相同的库调用接口 |
| 310 | +- 消除了执行模式间的功能差异 |
| 311 | +- 提供一致的开发体验 |
| 312 | + |
| 313 | +#### 高效的字节码执行 |
| 314 | +- 简化的指令集提高执行效率 |
| 315 | +- 优化的栈管理减少内存开销 |
| 316 | +- 支持复杂的嵌套函数调用 |
| 317 | +- 高效的循环跳转指令实现 |
| 318 | +- 优化的条件分支执行路径 |
| 319 | + |
| 320 | +### 向前兼容性 |
| 321 | + |
| 322 | +#### 字节码兼容性 |
| 323 | +- 保留`Print`指令定义,避免破坏现有字节码 |
| 324 | +- 新的字节码生成不再使用废弃指令 |
| 325 | +- 平滑的版本迁移路径 |
| 326 | + |
| 327 | +#### API稳定性 |
| 328 | +- 库接口保持向后兼容 |
| 329 | +- 编译器API的稳定性保证 |
| 330 | +- 为生态系统发展提供稳定基础 |
| 331 | + |
0 commit comments