至此,一个简单的编译器已经做好了,学到了不少,不过真正的编译器才刚刚开始。
有点遗撼的是:在代码生成的过程中,并没有采用回填技术,而是简单地增加标号,然后在tm“虚拟机”中重新根据标号整理顺序
如
if x < 9 then
write x
end
生成如下:
* TINY Compilation to TM Code
* File: test.tm
* Standard prelude:
0: LD 6,0(0) load maxaddress from location 0
1: ST 0,0(0) clear location 0
2: LD 0,0(5) load id value
3: ST 0,0(6) op: push left
4: LDC 0,9(0) load const
5: LD 1,0(6) op: load left
6: SUB 0,1,0 op <
7: JLT 0,2(7) br if true
8: LDC 0,0(0) false case
9: LDA 7,1(7) unconditional jmp
10: LDC 0,1(0) true case
12: LD 0,0(5) load id value
13: OUT 0,0,0 write ac
11: JEQ 0,3(7) if: jmp to else
14: LDA 7,0(7) jmp to end
15: HALT 0,0,0
在tm“虚拟机”机中会重排成如下所示:
0: LD 6, 0(0)
1: ST 0, 0(0)
2: LD 0, 0(5)
3: ST 0, 0(6)
4: LDC 0, 9(0)
5: LD 1, 0(6)
6: SUB 0,1,0
7: JLT 0, 2(7)
8: LDC 0, 0(0)
9: LDA 7, 1(7)
10: LDC 0, 1(0)
11: JEQ 0, 3(7)
12: LD 0, 0(5)
13: OUT 0,0,0
14: LDA 7, 0(7)
15: HALT 0,0,0
另外,我想说:简单的虚拟机也不过如此,只要敢想,一切都是可能的。
|
文件: | 代码生成及虚拟机tm.rar |
大小: | 23KB |
下载: | 下载 |
|
阅读(1053) | 评论(0) | 转发(0) |