作者:不会遗忘528_757 | 来源:互联网 | 2023-02-02 04:43
我注意到Python的字节码在这里有一个有趣的特点.
该CONTINUE_LOOP
操作码取入一个target
将表示循环的指令继续执行,这是一个参数FOR_ITER
的指令.
该BREAK_LOOP
操作码,但是,并没有做到这一点.它只会突破当前(最里面)的循环.
这背后的原因是什么?为什么它可能continue
而不是break
外循环?
1> Martijn Piet..:
你误解了目标.处理嵌套循环不需要该值.相反,目标标记字节码流中的点在指令之后移动到.BREAK
不需要这样的目标,因为该值已在其他地方定义.
BREAK_LOOP
结束循环,因此循环后继续执行.该SETUP_LOOP
指令已经定义了端点,因此解释器不需要任何其他信息来执行该操作码.
CONTINUE_LOOP
另一方面需要被告知在哪里继续.在大多数循环中,使用JUMP_ABSOLUTE
操作码,并CONTINUE_LOOP
在此处回应该指令.CONTINUE_LOOP
记录更多信息来处理try
语句(跟踪堆栈展开).
在评估循环中,异常处理(try: ... except:
和try
: ... finally:
)以及上下文管理器(with ...:
和async with ...:
)使用帧块的通用概念,其具有为其记录的出口点,这是BREAK_LOOP
指令依赖于此处的内容.不必跟踪偏移量就这样简单,并避免编译器和评估循环不得不重复(退出点也用于其他场景,而不仅仅是break
语句).
但是跳转更通用,因此它们的偏移更容易跟踪与指令本身相关联.