什么是.pyc?(相比java 中.class)

初识.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字节码。 这里作为简单学习,就不详述了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值