如果解释Python,什么是.pyc文件?

2022-09-05 01:00:47

Python是一种解释型语言。但是为什么我的源目录包含Windows标识为“已编译的Python文件”的文件?.pyc


答案 1

我被赋予了理解Python是一种解释型语言......

这个流行的模因是不正确的,或者更确切地说,是基于对(自然)语言水平的误解而构建的:类似的错误是说“圣经是一本精装书”。让我解释一下这个比喻...

“圣经”是“一本书”,意思是一(实际的,物理对象被识别为)书籍;被确定为“圣经副本”的书应该有一些基本的共同点(内容,尽管即使是那些也可以是不同的语言,有不同的可接受的翻译,脚注和其他注释的水平) - 然而,这些书完全允许在无数方面有所不同,而这些方面却不是 被认为是基本的 - 装订的种类,装订的颜色,印刷中使用的字体,插图(如果有),宽可写边距或不,内置书签的数量和种类,等等,等等。

很有可能,圣经的典型印刷版确实是精装本的——毕竟,这是一本通常意味着一遍又一遍地阅读的书,在几个地方加书签,通过拇指寻找给定的章节和经文指针,等等,等等,一个好的精装装本可以使给定的副本在这种使用下持续更长时间。然而,这些都是平凡的(实际)问题,不能用来确定给定的实际书籍对象是否是圣经的副本:平装印刷是完全可能的!

类似地,Python是“一种语言”,在定义一类语言实现的意义上,这些语言实现在某些基本方面(语法,大多数语义,除了那些明确允许它们不同的部分)都是相似的,但完全允许在几乎每个“实现”细节上都有所不同 - 包括它们如何处理它们所给出的源文件, 他们是否将源代码编译为一些较低级别的表单(如果是这样,哪种形式 - 以及他们是否将此类编译表单保存到磁盘或其他地方),他们如何执行所述表单,等等。

经典的实现,CPython,通常简称为“Python” - 但它只是几个生产质量的实现之一,与微软的IronPython(编译为CLR代码,即“.NET”),Jython(编译为JVM代码),PyPy(用Python本身编写,可以编译成各种各样的“后端”形式,包括“即时”生成的机器语言)并排。它们都是Python(==“Python语言的实现”),就像许多表面上不同的书籍对象都可以是圣经一样(==“圣经的副本”)。

如果你对CPython特别感兴趣:它将源文件编译成特定于Python的较低级别形式(称为“字节码”),在需要时自动执行此操作(当没有与源文件对应的字节码文件,或者字节码文件比源文件早或由不同的Python版本编译时),通常将字节码文件保存到磁盘(以避免将来重新编译它们)。OTOH IronPython通常会编译为CLR代码(是否将它们保存到磁盘,取决于)和Jython编译为JVM代码(是否将它们保存到磁盘 - 如果它确实保存它们,它将使用扩展名)。.class

然后,这些较低级别的表单由适当的“虚拟机”(也称为“解释器”)执行 - CPython VM,.Net运行时,Java VM(又名JVM),视情况而定。

因此,从这个意义上说(典型的实现是做什么的),Python是一种“解释型语言”,当且仅当C#和Java是:它们都有一个典型的实现策略,首先生成字节码,然后通过VM/解释器执行它。

更有可能的是,重点在于编译过程的“沉重”,缓慢和高度仪式。CPython旨在尽可能快地编译,尽可能轻巧,尽可能少地进行仪式 - 编译器很少进行错误检查和优化,因此它可以在少量内存中快速运行,这反过来又可以在需要时自动透明地运行,而用户甚至不需要知道正在进行编译, 大多数时候。Java 和 C# 通常在编译期间接受更多工作(因此不执行自动编译),以便更彻底地检查错误并执行更多优化。这是灰度连续体,而不是非黑即白的情况,在某个给定级别设置阈值并说只有高于该级别,您才称之为“编译”是完全武断的!


答案 2

它们包含字节码,这是Python解释器将源代码编译为的。然后,此代码由 Python 的虚拟机执行。

Python的文档是这样解释这个定义的:

Python是一种解释型语言,而不是编译语言,尽管由于字节码编译器的存在,区别可能很模糊。这意味着源文件可以直接运行,而无需显式创建随后运行的可执行文件。