Python如何运行程序
Python运行脚本时,第一步是编译成所谓的“字节码”,之后将其转发到“虚拟机”中。
1、字节码编译:
当程序执行时,Python内部(对大多数用户是完全隐藏的)会先将源代码(文件中的语句)编译成所谓字节码的形式。编译是一个简单的翻译步骤,而且字节码是源代码底层的、与平台无关的表现形式。概括的说,Python通过把每一条源语句分解为单一步骤来将这些源语句翻译成一组字节码指令。这些字节码可以提高执行速度:比起文本文件中原始的源代码语句,字节码的运行速度要快得多。
如果Python进程在机器上拥有写入权限,那么它将把程序的字节码保存到一个以.pyc为扩展名的文件(“.pyc就是编译过的“.py”源代码)。Python保存字节码是作为一种启动速度的优化。下一次运行程序时,如果你在上次保存字节码之后没有修改过源代码的话,Python将会加载,pyc文件并跳过编译这个步骤。当Python必须重编译时,它会自动检查源文件和字节码文件的时间戳:如果你又保存了源代码,下次程序运行时,字节码将自动重新创建。
如果Python无法在机器上写入字节码,程序仍然可以工作:字节码将会在内存中生成并在程序结束时简单地丢弃。
2、Python虚拟机(PVM)
一旦程序编译成字节码(或字节码从已存在的.pyc文件中载入),之后的字节码发送到通常称为Python虚拟机(Python Virtual Machine, PVM)上来执行。PVM不是一个独立的程序,不需要安装。事实上,PVM是迭代运行字节码指令的一个大循环,一个接一个地完成操作。PVM是Python的运行引擎,它时常表现为Python系统的一部分,并且它是实际运行脚本的组件。从技术上讲,它才是所谓“Python解释器”的最后一步。
图2-2描述介绍的运行时的结构。这些复杂性是有意对Python程序员隐藏起来的。字节码的编译是自动完成的,而且PVM也仅仅是安装在机器上的Python系统的一部分。程序员只需简单的编写代码并运行包括有语句的文件。
注意:
(1)性能的含义
Pyhton与C和C++等完全编译语言相比不同之处:
a.Python的工作中没有“build”或“make”的步骤,代码在写好后立即运行;
b.Python字节码不是机器的二进制编码(例如,Intel芯片的指令)。
Python代码无法运行像C或C++代码一样快,原因是PVM循环(而不是CPU芯片)仍然需要解释字节码,并且字节码指令与CPU指令相比需要更多的工作。
纯Python代码的运行速度比传统解释语言快,原因是和其他经典的解释器不同,这里仍有内部的编译步骤:Python并不需要反复地重分析和重分解每一行语句。
(2)开发的含义
Python执行模块的另一个情况是其开发和执行的环境实际上并没有区别。在Python中,编译器总是在运行时出现,并且是运行程序系统的一部分。
在Python中真正拥有的只有运行时:完全不需要初始的编译阶段,所有的事情是在程序运行时发生的,这甚至还包括了建立函数和类的操作以及连接的模块,这些事情对于静态语言往往是发生在执行之前的。