前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python写的Python解释器(五)

Python写的Python解释器(五)

作者头像
哒呵呵
发布2018-08-06 11:31:31
8420
发布2018-08-06 11:31:31
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记

编译自:http://www.aosabook.org/en/500L/a-python-interpreter-written-in-python.html 作者:Taavi Burns 翻译:鸿 如有翻译问题或建议,请公众号留言

条件和循环 到目前为止,解释器仅仅只是简单的逐个执行指令。下面将会讲述需要多次执行某些指令,或者在特定条件下跳过它们的做法。在代码中编写循环和if语句时,解释器必须能够在指令进行跳转。Python在字节码中用GOTO语句处理循环和条件语句。再看一下函数cond的反汇编:

代码语言:javascript
复制
>>> dis.dis(cond)
  2           0 LOAD_CONST               1 (3)
              3 STORE_FAST               0 (x)
  3           6 LOAD_FAST                0 (x)
              9 LOAD_CONST               2 (5)
             12 COMPARE_OP               0 (<)
             15 POP_JUMP_IF_FALSE       22
  4          18 LOAD_CONST               3 ('yes')
             21 RETURN_VALUE
  6     >>   22 LOAD_CONST               4 ('no')
             25 RETURN_VALUE
             26 LOAD_CONST               0 (None)
             29 RETURN_VALUE 

代码第3行中的if x <5判断语句编译为四条指令:LOAD_FAST,LOAD_CONST,COMPARE_OP和POP_JUMP_IF_FALSE。 x < 5会生成代码来加载x,加载5并比较这两个值。指令POP_JUMP_IF_FALSE负责实现if。该指令将从解释器堆栈弹出顶部的值。如果这个值是真的,那么什么都不会发生。如果该值为false,则解释器将跳转到另一条指令。这条指令被称为跳转目标,它作为参数提供给POP_JUMP指令。在这里,跳转目标是22.第22行的指令会跳到第6行的LOAD_CONST(dis用>>标记跳转目标)。如果x < 5的结果为False,则解释器将直接跳转到第6行(返回“否”),而跳过第4行(返回“是”)。因此,解释器使用跳转指令来有选择地跳过指令集的一部分。

Python循环也依赖于跳跃。在下面的字节码中,注意while x < 5和if x < 10会生成几乎相同的字节码。在两种情况下,都会先比较值,然后POP_JUMP_IF_FALSE控制下一个执行的指令。在第4行的末尾指令JUMP_ABSOLUTE总是将解释器返回循环顶部的指令9。当x < 5变为假时,则POP_JUMP_IF_FALSE跳过循环结尾处的解释器到指令34。

代码语言:javascript
复制
>>> def loop():
...      x = 1
...      while x < 5:
...          x = x + 1
...      return x
...
>>> dis.dis(loop)
  2           0 LOAD_CONST               1 (1)
              3 STORE_FAST               0 (x)
  3           6 SETUP_LOOP              26 (to 35)
        >>    9 LOAD_FAST                0 (x)
             12 LOAD_CONST               2 (5)
             15 COMPARE_OP               0 (<)
             18 POP_JUMP_IF_FALSE       34
  4          21 LOAD_FAST                0 (x)
             24 LOAD_CONST               1 (1)
             27 BINARY_ADD
             28 STORE_FAST               0 (x)
             31 JUMP_ABSOLUTE            9
        >>   34 POP_BLOCK
  5     >>   35 LOAD_FAST                0 (x)
             38 RETURN_VALUE
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档