01. 前言

Python程序的代码是如何组织的,在代码完成编写后,又是如何运行的,它其中的原理是怎么回事,大家对这些问题一定很感兴趣。

接下来,兔子先生带着大家一探究竟。

02. Python的总体架构

从顶层设计上来看,Python可以分为三大部分:

  • 代码文件 File Groups - 包括模块、库及用户自定义的模块。
  • 解释器 Interpreter - 又称Python虚拟机,对代码分析理解,翻译成字节流,并运行这些字节代码。
  • 运行环境 Runtime Env - 包括运行时的对象、基础类型结构、内存分配器和实时的运行状态信息。

其中,最左边的python的库,模块以及用户自定义的模块,都依赖于python解释器来实现,而python解释器主要包括扫描器,分词器,编译器和代码生成四部分,我们写一个python文件之后,由python解释器执行,其大致执行过程如下:
1、扫描器扫描python文件,将扫描结果发给分词器;
2、在扫描过程中识别出文件中的对象,类型和结构(注:在python中类型和结构都是对象);
3、分词器将结果发给编译器,编译器在此时生成相应对象同时给对象分配内存空间;
4、编译之后将代码生成,进行内存管理并处理当前状态。
5、对象、类型、结构体、内存管理以及当前状态构成了python极其复杂的runtime运行时。
还有,很多人会有疑问,python是动态语言,内存到底是如何管理的,初来乍到,我也不太明白,由于python的各种历史原因,python的内存处理和线程管理非常复杂,打开源码看看,如果出现类似object_new这样的东西,那么他的内存就是用C++中的new来开辟的,如果是object_malloc这样的东西,则表示内存是用C中的malloc来实现的。
python属于脱管型的语言,内存不需要我们手动处理,方便了很多,其实,python在底层是用自动引用计数器来实现的,python中创建小对象时,往往直接在内存池中创建,而大对象则是使用new/malloc从内存中再创建一个。针对并不复杂的对象关系时,比如只有一个对象时,python是不会运行链路检测的,而如果对象很多,过系又很复杂,就会有一个链路检测,以防出现循环引用和死循环的问题,当释放内存时,则遵守自动引用计数的规则,非常了不起。

参考链接

https://www.cnblogs.com/skyfree/p/3834030.html

03. File Groups

File Groups就是咱们的代码,在Python的代码的编写过程中,会包含自己编写的代码模块、依赖核心的模块、第三方模块和库文件(Linux下是so库,而Windows下面则是dll库)

比如下面一段代码:

from datetime import date
now = date.today()import requests
r = requests.get('https://www.xtuz.net')

其中 datetime 就是核心模块, requests 则属于第三方模块,这段代码本身就属于用户的自定义代码模块了。

04. Interpreter

Scanner 负责词法分析的工作,将代码一行一行切分为 token,Parser 则负责语法分析,将 Token 组织为抽象语法树,Compiler 则将语法树转化为指令集合的字节码流,最后由 Code Evaluator 来执行这些字节码。

下图是.pyc文件内容,即字节码流。

05. Runtime Env

Object 和 Type Structure 分别是程序在运行过程中生成的对象和Python中的自带内建对象,如int、List、dict等。

而 Memory Allocator 则负责申请创建对象需要的内存,本质就是封装了 C 语言里面的 malloc() 函数。

Current State 负责维护运行时的各类状态信息,以便在程序执行过程中如果发生状态变化(正常态和异常态)时,仍然能正常运行。

更多内容

原文来自兔子先生网站:https://www.xtuz.net/detail-130.html

Python源码剖析 - Python的总体架构相关推荐

  1. python源码剖析—— python中的列表对象

    1. PyListObject对象 PyListObject 对象可以有效地支持插入,添加,删除等操作,在 Python 的列表中,无一例外地存放的都是 PyObject 的指针.所以实际上,你可以这 ...

  2. python源码剖析—— python中的字节码对象初探

    一.代码对象 每个初学python的人都会认为python是一种解释型语言,这个不能说错.但是python并不是真的对执行的python代码的每一行进行解释,虽然我们有一个所谓的"解释器&q ...

  3. Python源码剖析[19] —— 执行引擎之一般表达式(2)

    Python源码剖析 --Python执行引擎之一般表达式(2) 本文作者: Robert Chen(search.pythoner@gmail.com ) 3.2     Simple.py 前面我 ...

  4. Python源码剖析[1] —— 编译Python

    [ 绝对原创,转载请注明出处] 注意 :第一部分Python总体架构采用了网络文档<The Architecture of Python>,这是网络上唯一可见的以剖析Python实现为己任 ...

  5. Python源码剖析:前言

    第0章:前言 0.0 我的前言  在几个月学习的中,已经学习了python基本.进阶的语法,如果有读者不清楚的话,可以参考我之前的专栏<python进阶>.  而在这个专栏<pyth ...

  6. Python发展的新时代—冯大辉先生谈《Python源码剖析》

    Python 3.0 beta 1终于在 6 月 18 号发布了,依照Python一贯主张的简洁,标准,统一精神,Beta版的新特性让我们惊喜的发现,Python正如我们所期望的那样已经进入了一个蓬勃 ...

  7. Python源码剖析[16] —— Pyc文件解析

    Python源码剖析[16] -- Pyc文件解析 2008-02-28 18:29:55|  分类: Python |举报 |字号 订阅 Python源码剖析 --Pyc文件解析 本文作者: Rob ...

  8. python源码剖析 豆瓣_在数据分析师的分析中豆瓣的书那些值得读

    最近总是有人问我有什么书好推荐看看,特烦.但是看到那么多人问,看来挺多人有这个需求,便想了一下,如何通过数据分析找到值得看的书.通过爬取某个标签例如产品,运营获取对应已经打了标签的书,获取书对应的评分 ...

  9. python字符串代码对象_Python源码剖析 - Python中的字符串对象

    1. 前言 我们已经在 [Python中的整数对象] 章节中对定长对象进行了详细的讲解,接下来我们将介绍变长对象,而字符串类型,则是这类对象的典型代表. 这里必须先引入一个概念: Python 中的变 ...

  10. 《Python源码剖析》读书笔记

    <Python源码剖析>电子书下载 http://download.csdn.net/detail/xiarendeniao/5130403 Python源码在官网有下载链接,用ctags ...

最新文章

  1. 程序员的周末:纯野的一天
  2. web中常见乱码问题详解
  3. 武大上交发布首篇「图像匹配」大领域综述!涵盖 8 个子领域,汇总近 20年经典方法
  4. 创建订单 - 保存订单与子订单数据
  5. 传统家电在智能家居变革的五大优势
  6. 谷歌gcp 远程计算机_引导性GCP:带有Google Cloud Pub / Sub的Spring Cloud Stream
  7. 可遇不可求的Question之不支持一个STA 线程上针对多个句柄的WaitAll
  8. cmd编译java文件中文乱码_乱码 HelloWorld 世界你好 cmd 执行输出的中文java 显示乱码 解决 另附 win无法执行编译运行javac java编译文件的解决方案...
  9. 缓存击穿、缓存穿透、缓存雪崩简单总结
  10. Apache HttpClient 客户端使用详解
  11. 【优化调度】基于matlab粒子群算法求解水火电系统经济、环境运行单目标调度优化问题【含Matlab源码 1138期】
  12. 简单工具之 ---- IP地址快速修改脚本
  13. 怎样用Python的Numpy库求反正切
  14. log4j2远程执行漏洞原理以及解决方案
  15. 3、vue-路由、拦截器和嵌套路由
  16. 有哪些产品适合做引流?什么样的产品才适合做引流款
  17. 很搞笑,今天才弄清楚什么是二级域名和三级域名的区别
  18. php正方系统,正方教务系统快速自动评教脚本
  19. 通用课程表教师表php,利用Access实现学校课程表的科学管理
  20. 双向长短期记忆网络(BiLSTM)详解

热门文章

  1. plc vb c语言编程,【实例】VB实现plc与上位机通讯应用程序
  2. PLC编程器的功能有什么功能?
  3. Python—2022 |已有文章汇总 | 持续更新,直接看这篇就够了
  4. ubuntu 10.04解决Skype中麦克风不工作问题
  5. 贪心算法c语言部分背包,c语言背包问题_背包问题贪心算法_背包问题 贪心算法(13)...
  6. html是什么文本文件,纯文本文件是什么意思
  7. JAX-RS之Jersey入门
  8. android自定义组件(手机加速球+水面波动效果)
  9. python如何抓取微博定时热搜
  10. 实验2 黑盒测试方法:等价类划分法+边界值分析方法