什么是.pyc?
- 初识.pyc
- 对比一下java
- 解释型语言和编译型语言的区别
- python 运行过程
- .py的基本运行机制
- 什么是pyc?——字节码
初识.pyc
在研究python解释器的时候,遇到了.pyc文件,猜想是解释型语言解析产生的中间文件,如java一般,那么我想系统研究一下。
对于python这一解释型语言,我在java后学习,似乎不需要使用如javac命令。
对比一下java
相对于java,我们知道运行之前,先得对javac编
javac是一个编译命令,将java源文件编译成.class 字节码。
例如 javac hello.java 产生hello.class文件
.class 是java的字节码文件。
通过java来运行。
解释型语言和编译型语言的区别
计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。
- 编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。
- 解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。
编译型语言效率较高,但没有跨平台特性。而解释型语言效率低,但可以更好进行跨平台。
Java 比较神奇,他是一种先编译后解释:体现的是一种效率与跨平台特性的综合。
python 运行过程
.py的基本运行机制
在很多工作上Python的运行流程基本上取决于用户,因此源码不需要编译成二进制代码(否则无法实现大部分贴近用户的特性),而直接从源码运行程序。当我们运行python文件程序的时候,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码。
什么是pyc?——字节码
Python文件在经过解释器解释后生成字节码对象PyCodeObject,pyc文件可以理解为是PyCodeObject对象的持久化保存方式。
1)关于PyCodeObject和pyc文件:在硬盘上看到的pyc文件,其实PyCodeObject才是Python编译器真正编译成的结果。
当python程序运行时,编译的结果是保存在位于内存中的
2)PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
3)当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。所以,我们可以说pyc文件其实是PyCodeObject的一种持久化保存方式。
运行的字节码去哪了?
- 完成模块的加载和链接;
- 将源代码翻译为PyCodeObject对象(这货就是字节码),并将其写入内存当中(方便CPU读取,起到加速程序运行的作用);
- 从上述内存空间中读取指令并执行;
- 程序结束后,根据命令行调用情况(即运行程序的方式)决定是否将PyCodeObject写回硬盘当中(也就是直接复制到.pyc或.pyo文件中);
- 之后若再次执行该脚本,则先检查本地是否有上述字节码文件。有则执行,否则重复上述步骤。
当然, 肯定运行pyc会比较与源码的修改时间。
当然,最后你也可以通过指令或者代码决定程序是否产生.pyc字节码。 这里作为简单学习,就不详述了。