凭什么别的虚拟机叫虚拟机,Python的叫解释器?

4,826 阅读3分钟

为什么Java里面的JVM就叫虚拟机,Python的叫解释器呢?讲道理,这个格调听着有差一条街的

一个.py文件运行的生命周期

1)python.exe解释器先把.py文件中的code编译为字节码。

2)字节码文件再被python.exe执行:这个时候解释器接收到的字节码文件都是PyCodeObject为单位的,一个一个执行。什么是PyCodeObject,举个例子好比,你有一个孩子(对象),你的孩子的乐园就是家+你家花园(作用域),那么这就是一个PyCodeObject对象,解释器就以这样的对象为单位来划分。但是如果有一段代码表示的是:你的孩子去别人家的后花园玩耍,那么一个PyCodeObject就不够描述这一件事情了,所以就必须在怼一个PyCodeObject出来来描述这样的代码,所以就成了翻译两个PyCodeObject对对象。 PyCodeObject中装的什么?装的不是空气,也不是充气的,装的是所有的静态变量的信息和字节码,不包括环境(PyFrameObject),我之前的例子只是想说明白PyCodeObject划分的原则,就是一个对象不够描述一件事,所以就会划分另一个对象。这些PyCodeObject,Base在PyFrameObject上运行,每一个PyFrameObject对象中都维护了一个PyCodeObject表示每一个PyFrameObject的动态内存空间和源码的一段Code相对应。所以解释器会根据上下文(PyFrameObject)来执行

字节码

字节码在解释器中的形式为PyCodeObject,在磁盘中表示为.pyc文件

线程和进程的模拟

操作系统里面最重要的两个概念是进程和线程,Python中使用的是PyInterpreterState和PyThreadState来表示的,解释器启动后会执行一些Initsettings,最后进入PyEvalFrame函数,它的作用就是不断的读取PyCodeObject对象

.pyc文件

不是所有的.pyc文件都会产生.pyc文件,python解释器默认会重用的代码才具有保留价值,什么叫重用,当时是被Import了,或者你自己使用python内置的complie方法来编译.pyc

Python内存管理

为了提高效率,python引入了内存池机制,将不用的存放在内存池而不是返回给OS,Pymalloc用于管理小块的内存申请和释放(对象小于256k),大于256的大块内存由底层的malloc、free等函数内存管理和分配的函数进行操作

最后,题目的问题:那就来对比下Java和Python

·首先Java是静态语言内部的编译器进行翻译JavaCode为字节码文件,然后由执行器执行字节码文件。而Python的编译器,美其名曰打工皇帝,身兼数职,一遍翻译一边执行,这叫动态语言,并且居然翻译成字节码Python的字节码都比Java的短,虽然是打工皇帝但是一个人的力量还是不如JVM分工的快。不过他俩都是跨平台的就是因为虚拟机的机制,就像平头插座插不了三角头,但是装个转换器啦。使用转换器的原因就是要提供一个和宿主平台无关的编译环境,所以java不是解释语言也不是编译语言,它属于二合一,但是python作为动态语言也提供了各种优化机制保留.pyc文件等等,所以现在编译语言跟解释语言的界限越来越不明显,这么来看她确实该叫解释器,翻译加运行,好比我给你说这句话不是说而已还要你懂....Anyway虽然有些生搬硬套了但是,讲道理python虚拟机多学学也不错,知道这些面试感觉足够了~