Files
python/13-17/lianxi-01xuniji.py
2026-05-06 11:21:42 +08:00

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()