StepfenShawn / Cantonese

粤语編程語言.The Cantonese programming language.
https://cantonese-community.github.io/
MIT License
1.15k stars 46 forks source link

vm if语句原理 #39

Open SatinWukerORIG opened 3 years ago

SatinWukerORIG commented 3 years ago

今天好好研究了一下虚拟机里的if语句,但好像不太能理解,您能笼统地解释一下这个if的工作原理吗? 万分感激!(^-^

StepfenShawn commented 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行

SatinWukerORIG commented 3 years ago

@StepfenShawn 谢谢,整个虚拟机的原理也搞明白了🤣 但我还有个疑问,就是 OP_POP_JMP_IF_FALSE 6 是用递归操作完成的吗? 还有这里的OP的全称是什么? 感谢您的解答!

StepfenShawn commented 3 years ago

OP_POP_JMP_IF_FALSE 6是对栈的索引进行操作实现跳转的,源码可以看jumpto(self, addr)函数 指令也叫做操作码,所以OP可以说是operation的意思

SatinWukerORIG commented 3 years ago

谢谢哦