内部でどのような処理が行われているかを表している
class PVM:
def __init__(self):
self.stack = []
self.output = []
def LOAD_NAME(self, name):
self.stack.append(name)
def LOAD_CONST(self, const):
self.stack.append(const)
def CALL(self, arg_count):
args = [self.stack.pop() for _ in range(arg_count)]
func = self.stack.pop()
result = func(*args)
if result is not None:
self.stack.append(result)
def POP_TOP(self):
if self.stack:
self.stack.pop()
def simulate(self, instructions):
for instr, arg in instructions:
match instr:
case "LOAD_NAME":
self.LOAD_NAME(arg)
case "LOAD_CONST":
self.LOAD_CONST(arg)
case "CALL":
self.CALL(arg)
case "POP_TOP":
self.POP_TOP()
self.output.append(list(self.stack))
return self.output
instructions = [
("LOAD_NAME", print),
("LOAD_CONST", "Hello, World"),
("CALL", 1),
("POP_TOP", None),
]
pvm = PVM()
stack_states = pvm.simulate(instructions)
print(stack_states)
$ python3 pvm.py
Hello, World
[[
関数と変数をスタックに格納してpopとpushで処理していく。なるほどー
そうすると、どれくらい作り込むかってところか…