Skip to content
This repository was archived by the owner on Aug 18, 2025. It is now read-only.

Commit 593be04

Browse files
committed
feat(vm): 修复虚拟机条件判断和递归执行问题
- 重新构建了VM调试信息控制系统,新增`--cn-vm-tip`参数以精确控制调试信息的显示 - 修复了VM编译器在处理`else if`语句时的严重bug,确保所有条件判断正确执行 - 恢复了递归函数的正常执行,确保其在VM模式下能够正确返回结果 - 优化了调试信息的输出,提升用户体验和调试便利性
1 parent 3f78299 commit 593be04

File tree

1 file changed

+249
-0
lines changed

1 file changed

+249
-0
lines changed

chagelog0.9.4.md

Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,3 +471,252 @@ cargo run test.comcn --cn-vm-tip --cn-time
471471
- **清晰边界**:模块间通过简单接口交互
472472
- **易于扩展**:为未来功能扩展预留空间
473473
- **测试友好**:模块化设计便于单元测试
474+
475+
---
476+
477+
## [v0.9.4 Pre5] - 2025-08-16
478+
479+
### VM调试信息控制系统
480+
481+
#### 调试参数重构
482+
- **新增参数**`--cn-vm-tip` 专门控制VM执行过程的详细调试信息
483+
- **信息分离**:将VM调试信息从默认输出中分离,提供更清洁的用户体验
484+
- **精确控制**:用户可以选择性地查看VM内部执行细节
485+
486+
#### VM结构体增强
487+
- **新增字段**`tip_mode: bool` 控制VM调试信息的显示
488+
- **新增方法**`set_tip_mode()` 动态设置调试模式
489+
- **参数传递**:在`execute_with_vm`函数中正确传递`tip`参数给VM
490+
491+
### VM条件判断系统重大修复
492+
493+
#### 核心问题诊断
494+
- **问题发现**:VM编译器在处理`else if`语句时存在严重bug
495+
- **具体表现**:只处理第一个`else`分支,完全忽略`else if`的条件判断
496+
- **影响范围**:导致所有递归函数在VM模式下无法正确执行
497+
498+
#### 编译器修复 (`src/vm/compiler.rs`)
499+
- **修复前问题**
500+
```rust
501+
// 错误的简化处理,只取第一个else分支
502+
if let Some((_, else_body)) = else_branches.first() {
503+
for stmt in else_body {
504+
self.compile_statement(stmt)?;
505+
}
506+
}
507+
```
508+
- **修复后逻辑**
509+
```rust
510+
// 正确处理所有else if和else分支
511+
for (maybe_condition, else_body) in else_branches {
512+
match maybe_condition {
513+
Some(else_if_condition) => {
514+
// 编译else if条件和分支体
515+
self.compile_expression(else_if_condition)?;
516+
// 生成正确的条件跳转指令
517+
},
518+
None => {
519+
// 处理最终的else分支
520+
}
521+
}
522+
}
523+
```
524+
525+
#### 条件跳转逻辑完善
526+
- **跳转地址计算**:正确计算每个`else if`分支的跳转目标地址
527+
- **分支链处理**:实现完整的`if-else if-else`分支链编译
528+
- **结尾跳转统一**:所有分支执行完后统一跳转到if语句结尾
529+
530+
### 递归函数执行修复
531+
532+
#### 问题根因分析
533+
- **症状**`repeat_string("Ha", 3)` 在VM模式下返回 `"Ha"` 而非 `"HaHaHa"`
534+
- **根因**:当`times > 1`时,VM错误地进入`times == 1`分支,直接返回而不递归
535+
- **影响**:所有包含`else if`条件判断的递归函数都无法正常工作
536+
537+
#### 修复验证
538+
- **修复前测试结果**
539+
```
540+
debug_repeat_simple(2) = case2 ❌ (应该是case3)
541+
debug_repeat_simple(3) = case2 ❌ (应该是case3)
542+
```
543+
- **修复后测试结果**
544+
```
545+
debug_repeat_simple(2) = case3 ✅ (正确)
546+
debug_repeat_simple(3) = case3 ✅ (正确)
547+
```
548+
549+
#### 功能完整性恢复
550+
- **数学函数**`factorial(5) = 120`
551+
- **字符串函数**`repeat_string("Ha", 3) = "HaHaHa"`
552+
- **组合调用**`repeat_string("*", add(3, 2)) = "*****"`
553+
554+
### 调试信息分级显示
555+
556+
#### 默认VM模式 (`--cn-vm`)
557+
- **编译信息**:显示函数索引分配和编译过程
558+
- **隐藏执行细节**:不显示每次函数调用和返回的详细信息
559+
- **清洁输出**:专注于程序执行结果
560+
561+
#### 详细调试模式 (`--cn-vm --cn-vm-tip`)
562+
- **完整执行跟踪**:显示每次函数调用的参数和返回值
563+
- **栈状态监控**:显示VM栈的变化过程
564+
- **指令级调试**:显示每条字节码指令的执行
565+
566+
### 技术实现细节
567+
568+
#### VM调试控制实现
569+
```rust
570+
// VM结构体增强
571+
pub struct VM {
572+
// ... 其他字段
573+
tip_mode: bool, // 新增调试模式控制
574+
}
575+
576+
impl VM {
577+
pub fn set_tip_mode(&mut self, tip_mode: bool) {
578+
self.tip_mode = tip_mode;
579+
}
580+
581+
// 在关键执行点使用tip_mode控制输出
582+
if self.tip_mode {
583+
println!("🔍 VM: 执行函数调用 {} (索引 {}) 参数数量 {}",
584+
function_name, func_index, arg_count);
585+
}
586+
}
587+
```
588+
589+
#### 条件编译修复实现
590+
```rust
591+
// 修复后的else if处理逻辑
592+
let mut end_jumps = vec![end_jump_addr];
593+
594+
for (maybe_condition, else_body) in else_branches {
595+
match maybe_condition {
596+
Some(else_if_condition) => {
597+
// 编译else if条件
598+
self.compile_expression(else_if_condition)?;
599+
600+
// 条件为假时跳到下一个else if/else
601+
self.emit(ByteCode::JumpIfFalse(0));
602+
let next_else_jump = self.bytecode.len() - 1;
603+
604+
// 编译else if分支体
605+
for stmt in else_body {
606+
self.compile_statement(stmt)?;
607+
}
608+
609+
// 跳转到if语句结束
610+
self.emit(ByteCode::Jump(0));
611+
end_jumps.push(self.bytecode.len() - 1);
612+
613+
// 回填下一个分支的地址
614+
let next_else_addr = self.bytecode.len() as u32;
615+
if let ByteCode::JumpIfFalse(_) = &mut self.bytecode[next_else_jump] {
616+
self.bytecode[next_else_jump] = ByteCode::JumpIfFalse(next_else_addr);
617+
}
618+
},
619+
None => {
620+
// 最终的else分支
621+
for stmt in else_body {
622+
self.compile_statement(stmt)?;
623+
}
624+
}
625+
}
626+
}
627+
```
628+
629+
### 修复的关键问题
630+
631+
#### VM条件判断系统缺陷
632+
- **问题**:VM编译器无法正确处理`else if`语句链
633+
- **影响**:所有包含复杂条件判断的函数无法在VM模式下正确执行
634+
- **修复**:实现完整的条件分支编译和跳转逻辑
635+
636+
#### 递归函数执行失败
637+
- **问题**:递归函数在VM模式下提前终止,不进行递归调用
638+
- **根因**:错误的条件判断导致递归终止条件被误触发
639+
- **修复**:修复条件编译后,递归函数恢复正常执行
640+
641+
#### 调试信息混乱
642+
- **问题**:VM调试信息与程序输出混合,影响用户体验
643+
- **修复**:通过`--cn-vm-tip`参数精确控制调试信息显示
644+
645+
### 架构改进成果
646+
647+
#### VM执行可靠性提升
648+
- **条件判断**:VM现在能够正确处理复杂的条件分支结构
649+
- **递归支持**:完整支持递归函数的编译和执行
650+
- **功能对等**:VM模式与解释器模式的功能完全一致
651+
652+
#### 用户体验优化
653+
- **清洁输出**:默认模式下只显示程序结果,无多余调试信息
654+
- **可选调试**:通过参数控制调试信息的显示级别
655+
- **一致性**:VM模式和解释器模式的输出行为统一
656+
657+
#### 开发调试便利性
658+
- **分级调试**:提供不同级别的调试信息
659+
- **精确控制**:开发者可以选择性查看VM内部状态
660+
- **问题诊断**:详细的执行跟踪有助于问题定位
661+
662+
### 测试验证完善
663+
664+
#### 条件判断测试
665+
- **简单条件**`if-else`语句的正确执行
666+
- **复杂分支**`if-else if-else`链的完整测试
667+
- **嵌套条件**:多层嵌套条件语句的验证
668+
669+
#### 递归函数测试
670+
- **数学递归**:阶乘函数的正确计算
671+
- **字符串递归**:字符串重复函数的正确执行
672+
- **组合调用**:递归函数与其他函数的组合使用
673+
674+
#### VM调试功能测试
675+
- **默认模式**:验证调试信息的正确隐藏
676+
- **调试模式**:验证详细信息的完整显示
677+
- **参数组合**:多个参数组合使用的正确性
678+
679+
### 向前兼容性保证
680+
681+
#### 现有代码兼容
682+
- **语法兼容**:所有现有的条件语句语法完全兼容
683+
- **行为一致**:修复后的VM行为与解释器完全一致
684+
- **性能提升**:修复的同时保持了VM的性能优势
685+
686+
#### 调试接口稳定
687+
- **参数稳定**`--cn-vm-tip`参数接口保持稳定
688+
- **输出格式**:调试信息格式向前兼容
689+
- **扩展性**:为未来的调试功能扩展预留空间
690+
691+
### 修复验证完成
692+
693+
#### 最终测试结果
694+
- **VM调试信息控制**`--cn-vm-tip`参数完全控制调试信息显示 ✅
695+
- **条件判断修复**`else if`语句在VM模式下正确执行 ✅
696+
- **递归函数恢复**:所有递归函数在VM模式下正常工作 ✅
697+
- **功能对等性**:VM模式与解释器模式完全一致 ✅
698+
699+
#### 测试用例验证
700+
```
701+
=== 复杂字节码测试 ===
702+
数学函数测试:
703+
add(10, 20) = 30 ✅
704+
multiply(6, 7) = 42 ✅
705+
factorial(5) = 120 ✅
706+
707+
字符串函数测试:
708+
concat_with_separator('Hello', 'World', ' ') = Hello World ✅
709+
repeat_string('Ha', 3) = HaHaHa ✅ (修复前: Ha)
710+
711+
组合测试:
712+
repeat_string('*', add(3, 2)) = ***** ✅ (修复前: *)
713+
=== 测试完成 ===
714+
```
715+
716+
#### 关键修复点
717+
1. **编译器调试输出控制**:所有编译器调试信息现在都使用`show_tips`字段控制
718+
2. **条件分支编译逻辑**:完全重写了`else if`语句的字节码生成逻辑
719+
3. **跳转地址计算**:修复了条件跳转和分支跳转的地址计算错误
720+
4. **递归调用恢复**:修复后递归函数能够正确进行多层递归调用
721+
722+
这次修复解决了VM系统的核心缺陷,确保了CodeNothing在VM模式下的完整功能性和可靠性。

0 commit comments

Comments
 (0)