我注意到Python的字节码here中有一个有趣的特点。
CONTINUE_LOOP
操作码接受target
参数,该参数表示循环继续执行的指令,即FOR_ITER
指令。
然而,BREAK_LOOP
操作码不会这样做。它只会突破当前(最里面的)循环。
这背后的原因是什么?为什么continue
而不是break
外循环?
答案 0 :(得分:9)
你误解了目标。处理嵌套循环不需要该值。相反,目标标记字节码流中的点在指令之后移动到。 BREAK_LOOP
不需要这样的目标,因为该值已在其他地方定义。
CONTINUE_LOOP
结束循环,因此在循环后继续执行。 SETUP_LOOP
instruction已经定义了端点,因此解释器不需要任何其他信息来执行此操作码。
CONTINUE_LOOP
需要告知在哪里继续。在大多数循环中,使用JUMP_ABSOLUTE
opcode,CONTINUE_LOOP
在此处回应该指令。 try
记录更多信息来处理try: ... except:
语句(跟踪堆栈展开)。
在评估循环中,异常处理(try
: ... finally:
和with ...:
)以及上下文管理器(async with ...:
和BREAK_LOOP
)使用的通用概念帧块,它有一个为其记录的出口点,这是break
指令依赖于此处的内容。不必跟踪偏移量就这样简单,避免编译器和评估循环不得不重复(退出点也用于其他场景,而不仅仅是ERROR in ./~/css-loader!./~/sass-loader/lib/loader.js!./app/css/bootstrap.css
Module not found: Error: Can't resolve '../fonts/glyphicons-halflings-regular.woff2' in '/Users/me/reactjs_dutchboiler/app/css'
@ ./~/css-loader!./~/sass-loader/lib/loader.js!./app/css/bootstrap.css 6:4720-4774
@ ./app/css/bootstrap.css
@ ./app/app.jsx
@ multi (webpack)-dev-server/client?http://localhost:8080 webpack/hot/dev-server ./app/app.jsx
语句)。
但是跳转更通用,因此它们的偏移更易于跟踪与指令本身相关联。