Open SatinWukerORIG opened 3 years ago
你说的是栈式虚拟机(stack_vm.py)吗? 直接分析if语句的例子吧:
讲嘢: |A| 系 3
如果 |A 系 3| 嘅话 -> {
畀我睇下 "A 系 3" 点样先?
}
用debug看一下会生成什么指令:
> python3 src/cantonese.py examples/basic/if.cantonese -stack_vm -debug
1 OP_LOAD_CONST 0
2 OP_NEW_NAME 0
3 OP_LOAD_CONST 1
4 OP_POP_JMP_IF_FALSE 6
5 OP_LOAD_CONST 2
6 OP_PRINT_ITEM None
7 OP_RETURN None
在分析指令前, 首先要知道栈这个数据结构, 你可以把它看做成一个数组
第一行OP_LOAD_CONST 0
的作用是从常量表
的第0处取值(3)并压入栈中(相当于list的append)
第二行OP_NEW_NAME 0
弹出栈中的一个值, 在将值给变量表
第0处(A)存储的变量(相当于list的pop)
于是这就完成赋值操作了
第三行OP_LOAD_CONST 1
从常量表
的第1处取值(A 系 3)并压入栈中
考虑到第三行压入栈的是一个bool的值, 所以第四行OP_POP_JMP_IF_FALSE 6
从栈中弹出一个值(这里是True), 如果为False
就会直接跳到第7(6 + 1)行执行,当然因为这里是True
, 所以不会跳,一直按顺序执行到第7行
@StepfenShawn 谢谢,整个虚拟机的原理也搞明白了🤣 但我还有个疑问,就是 OP_POP_JMP_IF_FALSE 6 是用递归操作完成的吗? 还有这里的OP的全称是什么? 感谢您的解答!
OP_POP_JMP_IF_FALSE 6
是对栈的索引进行操作实现跳转的,源码可以看jumpto(self, addr)
函数
指令也叫做操作码,所以OP可以说是operation
的意思
谢谢哦
今天好好研究了一下虚拟机里的if语句,但好像不太能理解,您能笼统地解释一下这个if的工作原理吗? 万分感激!(^-^)