我已经明白这一点
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 是:它们都有一个典型的实现策略,首先生成字节码,然后通过虚拟机/解释器。
更有可能关注的是编译过程的“繁重”、缓慢和隆重。 CPython 被设计为尽可能快地编译,尽可能轻量级,尽可能少的仪式——编译器几乎不做错误检查和优化,因此它可以在少量内存中快速运行,这反过来又让它在需要时自动和透明地运行,大多数时候用户甚至不需要知道正在进行编译。 Java 和 C# 通常在编译期间接受更多工作(因此不执行自动编译),以便更彻底地检查错误并执行更多优化。这是灰度的连续统一体,而不是黑色或白色的情况,将阈值设置在某个给定级别并说只有在该级别之上才称其为“编译”!-)