it-swarm.cn

是Python解释还是编译的?

这只是我在阅读有关解释和编译语言时的一个奇迹。

Ruby无疑是一种解释语言,因为源代码是在执行时由解释器处理的。
相反[〜#〜] c [〜#〜]是一种编译语言,因为必须编译源代码首先根据机器,然后执行。这样可以更快地执行。

现在来到Python

  • 导入时= python代码(somefile.py))创建文件( somefile.pyc)在同一目录中。让我们说导入是在python Shell或Django模块。导入后,我稍稍更改了代码并再次执行导入的功能,以发现它仍在运行旧代码。这表明* .pyc文件已编译python与可执行文件相似的文件虽然我无法直接执行* .pyc文件,但在编译C文件后创建了文件。
  • 当直接执行python文件(somefile.py))(./somefile.py或python somefile.py))时,不会创建.pyc文件,并且代码将按指示解释的行为的方式执行。

这些建议python)代码每次在新进程中导入时都会编译,以创建.pyc,而直接执行时会对其进行解释。

那么我应该将其视为哪种类型的语言?解释还是编译?以及它的效率与解释和编译语言相比如何?

根据Wiki的 解释语言 页面,它被列为编译为虚拟机代码的语言,这是什么意思?

82
crodjer

值得注意的是语言不会被解释或编译,而是语言实现解释或编译代码。您注意到Ruby是一种“解释语言”,但是您可以编译Rubyàla MacRuby ,所以不是总是一种解释语言。

几乎每个Python实现都由解释器(而不是编译器)组成。您看到的.pyc文件是Python机器(类似于Java的.class文件)。它们与C编译器为本机机器体系结构生成的机器代码不同。某些Python实现,但是实时编译器的编译器,它将编译Python=字节码成为本机代码。

(我之所以说“几乎每个”,是因为我不知道任何适用于Python的本机编译器,但我不想宣称任何地方都不存在。)

83
mipadi

Python将被解释为字节码。 .py源代码首先被编译为.pyc。可以解释此字节码(官方CPython),或编译JIT(PyPy)。 Python源代码(.py)也可以编译为不同的字节码,例如IronPython(.Net)或Jython(JVM)。 Python=语言有多种实现。正式的是字节码解释的一种。还有JIT编译的字节码实现。

为了比较各种语言实现的速度,您可以尝试 这里

36
aufather

编译与解释在某些情况下可能会有所帮助,但从技术角度讲,这是错误的二分法。

编译器(广义上)是转换器。它将程序A转换为程序B,并在以后使用机器M执行。

解释器(广义上)是执行器。它是执行程序A的机器M。尽管我们通常从此定义中排除物理机器(或行为与物理机器相似的非物理机器)。但是从理论上讲,这种区分有些武断。


例如,以 re.compile 。它将正则表达式“编译”为中间形式,并且解释/评估/执行该中间形式。


最后,这取决于您在说什么级别的抽象以及您关心的是什么。人们说“已编译”或“解释”是对该过程中最有趣的部分的广义描述,但实际上,大多数程序都是以一种或另一种方式进行编译(翻译)和解释(执行)的。

CPython(最流行的Python语言)实现)对于执行代码最为有趣。因此,CPython通常被描述为解释性的。尽管这是一个松散的标签。

11
Paul Draper

虚拟机代码是原始源代码(字节代码)的更紧凑版本。由于它不是机器代码,因此仍需要由虚拟机解释。但是,与人类编写的原始代码相比,它更容易解析。

某些虚拟机会在首次解释虚拟机代码时生成机器代码(只是及时编译-JIT)。以下调用将直接使用此机器代码,从而加快执行速度。

据我所知Ruby=> = 1.9也使用像Python的虚拟机。

7
LennyProgrammers

Python运行时在虚拟机上运行自定义对象代码(字节码)。

编译过程将源代码转换为目标代码。

为了加快处理速度,目标代码(或字节代码,如果您愿意)存储在磁盘上,以便下次程序运行时可以重新使用。

5
ykombinator