Skip to content

Commit

Permalink
docs: add explanations for variable declaration instructions
Browse files Browse the repository at this point in the history
  • Loading branch information
ErnestThePoet committed May 12, 2024
1 parent 3081ab9 commit 5a7de2b
Showing 1 changed file with 3 additions and 0 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,9 @@ IR中的变量真的没有作用域吗?其实这样规定欠妥。如果变量
因为本虚拟机并不实际执行`FUNCTION``LABEL`指令,也不会将它们计算在执行步数内。而据本人观察,irsim不计入除了`main`函数外的所有`FUNCTION`指令,且会计入所有顺序执行到的`LABEL`指令。这就会使得部分中间代码在本虚拟机上显示的执行步数略少于在irsim上的。那么,到底哪一种较为合理呢?我认为,不考虑虚拟机对每条指令的具体实现,单就语义层面来看,`FUNCTION``LABEL`起到的都只是代码标号的作用,并不代表一次执行,因此不将它们计入执行步数是合理的。除此之外,本虚拟机的计步策略与irsim相同,可以放心地用来评估中间代码优化的成效。
- **单步执行中,被标注的那一行代表?**
代表的是下一条要被执行的指令,也就是再次点击单步执行后被执行的指令。注:irsim中,高亮的行是刚才执行完的指令,我认为自己的实现更直观,也更符合逻辑。
- **普通变量声明指令的执行逻辑?**
- 对于`t1 := #3`这样的变量声明指令,其执行逻辑是:如果当前函数的变量表中没有名为`t3`的变量,那么在栈上创建它并赋值为`3`;否则将已存在的变量赋值为`3`
- 对于`DEC v 8`这样的变量声明指令,其执行逻辑是:如果当前函数的变量表中没有名为`v`的变量,那么在栈上创建它;否则,检查之前创建变量`v`的IR指令的行号和当前指令的行号是否相同,如果相同,则不做任何操作,后续`v`将仍然指向之前创建的变量;如果不同,则报变量重复声明错误。这样就可以支持`DEC`指令在循环中的多次执行。
- **全局变量声明指令的执行逻辑?**
所有全局变量声明指令都在进入main函数之前执行,并计入执行步数。假如全局变量声明指令出现在了函数内部,那么在之后执行时,全局变量声明指令就会被跳过(但是根据C--语法生成的全局变量声明指令是不应该出现在一个函数内部的)。全局变量占用的内存空间被全部初始化为0。全局变量的作用域为整个IR程序,与声明位置无关。即使一行IR指令引用的全局变量是在它下面声明的,它也可以正常访问到该全局变量。
- **让我的实验三代码能生成全局变量声明指令容易吗?**
Expand Down

0 comments on commit 5a7de2b

Please sign in to comment.