首页 > 编程语言 >Python3虚拟机和对象

Python3虚拟机和对象

时间:2024-12-15 16:43:56浏览次数:8  
标签:字节 CRT 对象 虚拟机 机器码 Python glibc Python3

2024年最推荐的python3版本为3.11

python虚拟机和对象

Python对象和虚拟机_v4.pdf

Python虚拟机的原理
• 字节码生成
• 虚拟机运行

Python对象的实现
• 数据结构
• 类型系统
• 内存管理

Python虚拟机

image-20241009180202664

字节码和机器码有什么区别

字节码和机器码是计算机程序执行的两种不同形式,它们之间的主要区别在于它们的执行方式和平台依赖性。

  1. 字节码:字节码是一种中间代码,它不是直接在硬件上执行的,而是需要通过特定的虚拟机(如Java虚拟机或Python解释器)来解释执行。字节码通常是跨平台的,这意味着同一份字节码可以在任何安装了相应虚拟机的系统上运行,无论这个系统的硬件和操作系统是什么。

  2. 机器码:机器码是直接在硬件上执行的代码,它是特定于某种处理器架构的。机器码通常是由编译器从源代码生成的,它是非常低级的代码,直接对应于处理器的指令集。因为机器码是特定于处理器的,所以它通常不能在不同的硬件平台上运行。

总的来说,字节码和机器码的主要区别在于它们的执行方式和平台依赖性。字节码需要通过虚拟机来执行,而机器码直接在硬件上执行。字节码通常是跨平台的,而机器码是特定于某种处理器架构的。

字节码

怎么查看字节码?

使用compiler explorer,开源免费,在线使用:Compiler Explorer (godbolt.org)

image-20241009180959793

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语言的运行时库,但它们在使用和功能上有一些区别。

  1. glibc(GNU C Library)是GNU项目的一部分,它是Linux系统中最常用的C库。glibc实现了C语言的标准库,并提供了许多GNU特有的扩展功能。glibc不仅包含了C运行时库的功能,还包含了对操作系统服务的封装,例如文件操作、进程管理、网络访问等。

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

image-20241014130806088

标签:字节,CRT,对象,虚拟机,机器码,Python,glibc,Python3
From: https://www.cnblogs.com/zhaoqingqing/p/18608130

相关文章

  • Python3类型安全type hint
    typehint大纲什么是类型安全以及我们为什么需要类型安全如何使用Python3的typehint老项目如何逐步引入typehintTypehint在运行时的应用疑问typehint在编译时会被去掉吧?是的,Python的类型提示(TypeHints)只是一种语法糖,它们不会影响Python代码的运行。类型提......
  • Python3 输入和输出
    介绍Python的输入输出。输出格式美化Python两种输出值的方式:表达式语句和print()函数。第三种方式是使用文件对象的write()方法,标准输出文件可以用sys.stdout引用。如果你希望输出的形式更加多样,可以使用str.format()函数来格式化输出值。如果你希望将输出......
  • zblog函数GetCategoryByID:通过分类ID获取分类对象数据
    函数位置:zblogphp.php文件,大约3300行。函数参数:$id:整数类型,要获取数据的分类ID。函数输出:返回一个对象,包含指定分类的所有值。示例:if($zbp->GetCategoryByID(1)->ID!=0){//存在ID是1的分类echo$zbp->GetCategoryByID(1)->Name;}其他数......
  • 写一个方法js将数组对象中某个属性值相同的对象合并成一个新对象
    在前端开发中,处理数组对象并合并具有相同属性值的对象是一个常见的需求。以下是一个使用JavaScript实现的方法,将数组对象中某个属性值相同的对象合并成一个新对象。假设我们要合并的属性名为keyField,并且我们希望将其他属性的值合并为一个数组。/***合并数组中具有相同属性......
  • 【C++指南】类和对象(七):友元
           ......
  • python3安装pandas
    检查安装环境检查python版本python--version检查pip版本pip--version检查安装列表piplist安装pandaspip3installpandas这是从官方下载安装,速度比较慢,可以使用国内镜像站清华:https://pypi.tuna.tsinghua.edu.cn/simple阿里云:http://mirrors.aliyun.com/py......
  • Gin存储文件与oss对象存储(二)
    Gin存储文件与oss对象存储(二)原创 何泽丰 ProgrammerHe  2024年12月13日20:53 广东 听全文Gin存储文件与oss对象存储(二)概述朋友们大家好啊,这一篇笔记我们来简单记录一下前端在Vue2项目中base64转图片,在文件上传时实现分片上传、断点续传功能;最后将视频文件存......
  • 对象输入输出流,进行文件的读写
     packagecn.edu.sdut.acm;importjava.io.*;importjava.util.*;classStudentimplementsSerializable{//让Student对象可序列化Stringid;Stringname;StringstuClass;intage;publicStudent(Stringid,Stringname,StringstuClass,......
  • python面向对象高级编程:使用元类
    在Python中,元类(Metaclass)是创建类的“类”。换句话说,元类是用来控制类的行为的。虽然元类在Python中不常用,但在某些高级编程场景中,它们可以提供强大的功能,如自动注册类、验证类定义、修改类属性等。1.导入必要的模块虽然元类不需要导入额外的模块,但你需要了解如何使用内置的......
  • python面向对象高级编程:使用枚举类
    在Python中,枚举类(Enum)是一种特殊的数据类型,它允许我们定义一组命名的常量。使用枚举类可以使代码更加清晰和易于维护,特别是在处理一组相关常量时。Python的enum模块提供了创建枚举类的功能。以下是如何在Python中使用枚举类的一些高级编程技巧:1.导入enum模块首先,我们需要导......