zoukankan      html  css  js  c++  java
  • 编程语言学习3——python

    《python源码剖析》一书的学习——

      python的执行:

        *.py源文件—(解释器编译)—>*.pyc字节码文件——>虚拟机解释执行

      在这里解释器或者叫虚拟机,完全承担着从py源码文件获取命令执行的工作。python看起来就像解释型语言一样,由编译器解释执行。

      解释器:词法分析器(Scanner)、语法分析器(Parser,得到AST语法树)、Compiler(生成字节码文件)、Code Evaluator(读取字节码文件,解析执行)。

      而解释器是用C语言编写的,python语言的最终执行都是解释器读取、理解了python语句后,用C语言执行的。C语言编写的解释器,对于python代码有着一个整体、全面的组织结构。首先就是PyObject。

      PyObject是python的基石。python中一切皆对象,是说python中的概念——模块(文件)、类、类型、函数、整数、字符串等等,都被称为对象,在C中都有着相似的结构组织——即在C中这些结构的开头都有一个PyObject的结构,用来存储对象的引用计数和对象类型,如下图:

     变长对象(string/list/dictionary)、定长对象(int、float、bool)。在对象结构的开始都有两个值。

      新建python对象,是C语言在堆内存处单独分配一块内存,来存储python对象。而在python对象是通过对象引用来使用的,对象引用即PyObjec*这个指针。PyObject*指针可以作为python中所有对象的引用,具体使用时,会通过ob_type元素的内容来决定后面的内容的读取和使用方式。ob_refcnt是记录程序中对象的引用个数的, 个数为0时就可以考虑将该对象占用的对内存释放,这是python为动态类型语言的基础所在。

      

      python中一切皆对象——

          像1、"a"、True、1.2等值是对象,而且是可以和C语言中的具体数据类型对应,只需要在其结构的后面加上一个C语言对应的元素即可,而ob_type则是具体的类型对象(python中类型也是对象)。如上图的int的结构中obj_ival就是一个C语言中的long类型的元素,1是PyInt_Type的实例。

          整型、字符串、序列等类型也是对象。他们都是PyType_Type的实例对象,不过类型对象不利用ob_refcnt这个引用计数来进行内存清理,类型对象一直存在的,是静态初始化的对象。

      解释器运行字节码文件:

      字节码文件读取到解释器中是一个PyCodeObject的结构,同python中其他对象一样,开始部分也是一个PyObject的结构,后面会存储包括指令集合等一些信息。每进入一个新的命名空间(作用域),就是一个新的代码块,就会新建一个对应的PyCodeObject对象。一个py文件、一个类结构、一个函数都会对应一个PyCodeObject对象。

      

  • 相关阅读:
    逻辑结算的结果是什么类型?比较运算的值是什么类型?
    算术运算有哪些?逻辑运算有哪些?比较运算有哪些?
    为什么要强制类型转换?什么情况下使用强制类型转换?说说强制类型转换的优点和缺点
    Java中如何强制类型转换
    基本数据类型和引用类型的区别
    Go switch语句
    Go 循环
    Go if_else语句
    Go 包
    Go 函数
  • 原文地址:https://www.cnblogs.com/z964166725/p/5677846.html
Copyright © 2011-2022 走看看