89 lines
2.6 KiB
Python
89 lines
2.6 KiB
Python
class SimpleVM:
|
|
# 初始化方法
|
|
def __init__(self):
|
|
self.stack = []
|
|
self.locals = {}
|
|
self.globls = {}
|
|
|
|
def load_const(self, const):
|
|
# 将常量推到栈中
|
|
self.stack.append(const)
|
|
print(f"加载常量: {const} -> 栈: {self.stack}")
|
|
|
|
def store_name(self, name):
|
|
if not self.stack:
|
|
raise RuntimeError("栈为空")
|
|
# 取出值
|
|
value = self.stack.pop()
|
|
# 存储到字典中
|
|
self.locals[name] = value
|
|
print(f"存储变量: {name} = {value}")
|
|
|
|
def load_name(self, name):
|
|
if name in self.locals:
|
|
value = self.locals[name]
|
|
elif name in self.globls:
|
|
value = self.globls[name]
|
|
else:
|
|
raise RecursionError(f"name:{name} is not defined")
|
|
self.stack.append(value)
|
|
print(f"加载变量: {name} = {value} -> 栈: {self.stack}")
|
|
|
|
def binary_add(self):
|
|
if len(self.stack) < 2:
|
|
raise RecursionError("栈中元素不足")
|
|
#
|
|
a = self.stack.pop()
|
|
b = self.stack.pop()
|
|
result = a + b
|
|
self.stack.append(result)
|
|
print(f"加法: {a} + {b} = {result} -> 栈: {self.stack}")
|
|
|
|
def return_value(self):
|
|
if not self.stack:
|
|
return None
|
|
value = self.stack.pop()
|
|
print(f"返回: {value}")
|
|
return value
|
|
|
|
|
|
def vm_execution():
|
|
vm = SimpleVM()
|
|
# 输出即将执行的代码说明
|
|
print("执行代码: a = 10; b = 20; c = a + b")
|
|
# 构造指令序列
|
|
instructions = [
|
|
("LOAD_CONST", 10), # 加载常量10
|
|
("STORE_NAME", "a"), # 存储到变量a
|
|
("LOAD_CONST", 20), # 加载常量20
|
|
("STORE_NAME", "b"), # 存储到变量b
|
|
("LOAD_NAME", "a"), # 加载变量a
|
|
("LOAD_NAME", "b"), # 加载变量b
|
|
("BINARY_ADD",), # 执行加法
|
|
("STORE_NAME", "c"), # 存储到变量c
|
|
("LOAD_NAME", "c"), # 加载变量c
|
|
("RETURN_VALUE",), # 返回值
|
|
]
|
|
|
|
for instruction in instructions:
|
|
# 获取操作嘛
|
|
op = instruction[0]
|
|
# 获取操作参数
|
|
args = instruction[1:] if len(instruction) > 1 else []
|
|
# 判断不同指令,来调用不同的方法
|
|
if op == "LOAD_CONST":
|
|
vm.load_const(args[0])
|
|
elif op == "STORE_NAME":
|
|
vm.store_name(args[0])
|
|
elif op == "LOAD_NAME":
|
|
vm.load_name(args[0])
|
|
elif op == "BINARY_ADD":
|
|
vm.binary_add()
|
|
elif op == "RETURN_VALUE":
|
|
result = vm.return_value()
|
|
|
|
print(f"最终打印结果c={result}")
|
|
|
|
|
|
vm_execution()
|