Python3虚拟机和对象
2024年最推荐的python3版本为3.11
python虚拟机和对象
Python对象和虚拟机_v4.pdf
Python虚拟机的原理
• 字节码生成
• 虚拟机运行
Python对象的实现
• 数据结构
• 类型系统
• 内存管理
Python虚拟机
字节码和机器码有什么区别
字节码和机器码是计算机程序执行的两种不同形式,它们之间的主要区别在于它们的执行方式和平台依赖性。
-
字节码:字节码是一种中间代码,它不是直接在硬件上执行的,而是需要通过特定的虚拟机(如Java虚拟机或Python解释器)来解释执行。字节码通常是跨平台的,这意味着同一份字节码可以在任何安装了相应虚拟机的系统上运行,无论这个系统的硬件和操作系统是什么。
-
机器码:机器码是直接在硬件上执行的代码,它是特定于某种处理器架构的。机器码通常是由编译器从源代码生成的,它是非常低级的代码,直接对应于处理器的指令集。因为机器码是特定于处理器的,所以它通常不能在不同的硬件平台上运行。
总的来说,字节码和机器码的主要区别在于它们的执行方式和平台依赖性。字节码需要通过虚拟机来执行,而机器码直接在硬件上执行。字节码通常是跨平台的,而机器码是特定于某种处理器架构的。
字节码
怎么查看字节码?
使用compiler explorer,开源免费,在线使用:Compiler Explorer (godbolt.org)
func.code.co_code就是字节码它是二进制字节码,把它复制进compiler explorer中
Include/opcode.h
注:python3.13之后?master分支放在opcode_ids.h中
• 常见指令
• 读 – LOAD_XXX: 变量, 属性,不是read
• 写 – STORE_XXX: 变量, 属性,也不是save
• 创建 – BUILD_XXX: list, tuple, dict, class,所以引擎里都使用buildxx
• 操作符 – XXX_OP: is, in, 数字操作符, 比较
• 函数调用 – CALL, PRECALL: foo(), self.foo()
• …
pycache
python2在当前目录下,python3在下面
保存的是meta info,加快速度
pystats
借用pystats,找到优化方向
ast树
把源代码解析成树,然后再对树进行处理
Frame中必须保存call Stack
Python虚拟机源码调试
CPython 3.11 -> ceval.c
Window: VisualStudio
扩展资料
运行库
glibc和CRT都是C语言的运行时库,但它们在使用和功能上有一些区别。
-
glibc(GNU C Library)是GNU项目的一部分,它是Linux系统中最常用的C库。glibc实现了C语言的标准库,并提供了许多GNU特有的扩展功能。glibc不仅包含了C运行时库的功能,还包含了对操作系统服务的封装,例如文件操作、进程管理、网络访问等。
-
CRT(C Runtime Library)是一个更通用的概念,它指的是C语言程序运行时所需要的一些基本函数库和运行环境。CRT可以是静态链接库,也可以是动态链接库。在Windows系统中,CRT通常包含在一些动态链接库(DLL)中,例如msvcrt.dll。
总的来说,glibc和CRT都提供了C语言程序运行所需的基本函数和环境,但glibc更专注于Linux系统,而CRT是一个更通用的概念,可以用于多种操作系统。
Python对象
一切皆为对象
• None, int, float, str, list, tuple, dict, class, instance, ..
• type – 顶层metaclass
• object – 顶层基类
PyObject* 万能类型,函数签名统一,使用py*传递再进行转换
顶层metaclass
内存管理
python3 dict中使用新的管理方式,同一个实例下,keys不变,只需要修改values
释放了python对象,内存却没有返还给系统?
因为python的内存返还最小单位不是block,而是整块
三层结构
• Block: 8B 512B
• Pool: 4KiB
• Arena: 1MiB