《Python源码剖析》读书笔记-6 Small Python


第6章 最简单的Python模拟——Small Python

  • 这一章模拟了一个python解释器,这个解释器只能处理整数和字符串,以及赋值和加法操作。
  • 其中类型对象的定义、创建、加法操作等和之前几章讲的没有不同,只是更为简化。
  • 其中出现了一个关键的字典对象m_LocalEnvironment
  • 这个字典以字符串为键,以PyObject*为值,保存了python运行时的所有已经定义的变量。它的作用是将一个表达式中的变量名和内存中的变量对象联系起来。
  • 例如,在small python中写下这么一段程序:

    1
    2
    3
    a = 1#1
    b = 2#2
    c = a + b; #3
  • 在#1处,m_LocalEnvironment的内部情况可以表示为:

    1
    2
    3
    {
    "a"->{ref_count=1, type=&PyInt_Type, ob_ival=1},
    }
  • 在#2处,m_LocalEnvironment的内部情况可以表示为:

    1
    2
    3
    4
    {
    "a"->{ref_count=1, type=&PyInt_Type, ob_ival=1},
    "b"->{ref_count=1, type=&PyInt_Type, ob_ival=2},
    }
  • 那么在#3处,当smallpython解释器遇到a和b这两个变量名时,就会去m_LocalEnvironment字典内部查询它们到底代表了什么样的具体对象,然后再通过PyInt_Type中对于加法的定义计算这个两个对象的加法,将其结果赋给c,同时也要在m_LocalEnvironment对象中为变量c添加一项,此时,m_LocalEnvironment的内部情况可以表示为:

    1
    2
    3
    4
    5
    {
    "a"->{ref_count=1, type=&PyInt_Type, ob_ival=1},
    "b"->{ref_count=1, type=&PyInt_Type, ob_ival=2},
    "c"->{ref_count=1, type=&PyInt_Type, ob_ival=3},
    }

Comments