Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vm if语句原理 #39

Open
SatinWukerORIG opened this issue Jul 26, 2021 · 4 comments
Open

vm if语句原理 #39

SatinWukerORIG opened this issue Jul 26, 2021 · 4 comments

Comments

@SatinWukerORIG
Copy link
Contributor

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

@StepfenShawn
Copy link
Owner

你说的是栈式虚拟机(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
Copy link
Contributor Author

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

@StepfenShawn
Copy link
Owner

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

@SatinWukerORIG
Copy link
Contributor Author

谢谢哦

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants