内部でどのような処理が行われているかを表している
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で処理していく。なるほどー
そうすると、どれくらい作り込むかってところか…