Python写的Python解释器(五)

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

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

>>> 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。

>>> 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

原文发布于微信公众号 - 鸿的学习笔记(shujuxuexizhilu)

原文发表时间:2018-05-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码匠的流水账

聊聊storm的IWaitStrategy

storm-2.0.0/storm-client/src/jvm/org/apache/storm/policy/IWaitStrategy.java

13650
来自专栏函数式编程语言及工具

Scalaz(20)-Monad: Validation-Applicative版本的Either

  scalaz还提供了个type class叫Validation。乍看起来跟\/没什么分别。实际上这个Validation是在\/的基础上增加了Applic...

20180
来自专栏androidBlog

AsyncTask 使用及封装实践

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

19210
来自专栏跟着阿笨一起玩NET

[C#]工具类—FTP上传下载

  不错的文章:http://www.cnblogs.com/greatverve/archive/2012/03/03/csharp-ftp.html

36310
来自专栏小樱的经验随笔

Codeforces 768B Code For 1

B. Code For 1 time limit per test:2 seconds memory limit per test:256 megabytes ...

38380
来自专栏码匠的流水账

聊聊storm的IWaitStrategy

storm-2.0.0/storm-client/src/jvm/org/apache/storm/policy/IWaitStrategy.java

8210
来自专栏机器学习与自然语言处理

03-树3. Tree Traversals Again (25)将先序遍历和中序遍历转为后序遍历

03-树3. Tree Traversals Again (25) 题目来源:http://www.patest.cn/contests/mooc-ds/03-...

35490
来自专栏技术栈大杂烩

Python的Sequence切片下标问题

在python中, 切片是一个经常会使用到的语法, 不管是元组, 列表还是字符串, 一般语法就是:

13020
来自专栏奔跑的蛙牛技术博客

java并发-原子性

java.util.concurrent.atomic 包中提供了很多高级的指令,来保证操作的原子性 Atomiclnteger 类提供了方法 increme...

20630
来自专栏杨龙飞前端

js,timeout,promise执行顺序

27420

扫码关注云+社区

领取腾讯云代金券