根据我的理解:

解释型语言是一种高级语言,由解释器(将高级语言转换为机器代码并执行的程序)运行并执行;它每次处理一点点程序。

编译语言是一种高级语言,其代码首先由编译器(将高级语言转换为机器代码的程序)转换为机器代码,然后由执行器(另一个运行代码的程序)执行。

如果我的定义错了,请指正。

现在回到Python,我对此有点困惑。你知道Python是一种解释性语言,但它被解释为一些中间代码(如字节码或IL),而不是机器代码。那么,哪个程序执行IM代码呢?请帮助我了解Python脚本是如何处理和运行的。


当前回答

是的,它既是编译语言也是解释语言。那为什么我们一般称它为解释语言呢?

看到它是如何编译和解释的了吗?

首先我想说的是,如果你来自Java世界,你会更喜欢我的回答。

在Java中,源代码首先通过javac编译器转换为字节码,然后定向到JVM(负责生成用于执行的本机代码)。现在我想向你展示,我们将Java称为编译语言,因为我们可以看到它确实编译源代码,并通过以下方式提供.class文件(除了字节码之外什么都没有):

javac Hello.java ------->生成Hello.class文件

java Hello -------->将字节码定向到JVM执行

同样的事情也发生在python中,即首先通过编译器将源代码转换为字节码,然后定向到PVM(负责生成用于执行的本机代码)。现在我想向你们展示,我们通常称Python为解释语言,因为编译是在幕后进行的 当我们运行python代码时:

python Hello.py ------->直接执行代码,如果代码语法正确,我们可以看到输出

@ python Hello.py看起来像是直接执行,但实际上它首先生成由解释器解释的字节码,以产生用于执行目的的本机代码。

CPython-承担编译和解释的责任。

如果你需要更多的细节,看看下面的几行:

正如我提到的,CPython编译源代码,但实际的编译是在cython的帮助下进行的,然后在CPython的帮助下进行解释

现在让我们稍微讨论一下即时编译器在Java和Python中的作用

在JVM中存在Java解释器,它逐行解释字节码以获得用于执行的本机机器码,但当Java字节码由解释器执行时,执行将总是较慢。那么解决方案是什么呢?解决方案是即时编译器,它产生的本机代码可以执行得比解释快得多。一些JVM供应商使用Java解释器,一些使用即时编译器。参考资料:按此处

在python中,要绕过解释器来实现快速执行,请使用另一个python实现(PyPy)而不是CPython。 点击这里查看python的其他实现,包括PyPy。

其他回答

对于新手

在运行脚本之前,Python会自动将脚本编译为已编译的代码,即所谓的字节代码。

运行脚本不被认为是导入,也不会创建.pyc。

例如,如果你有一个脚本文件abc.py,它导入了另一个模块xyz.py,当你运行abc.py时,xyz.py, xyz.py。Pyc将被创建,因为xyz被导入,但没有abc。Pyc文件将被创建,因为abc.py没有被导入。

如果(你懂Java) { Python代码像java一样被转换成字节码。 每次您尝试访问该字节码时,都会再次执行它。 }其他{ Python代码最初被翻译成一种叫做字节码的东西 接近机器语言,但不是真正的机器代码 因此,每次我们访问或运行它时,字节码都会再次执行 }

几乎,我们可以说Python是一种解释型语言。但是我们在python中使用了一次性编译过程的一部分,将完整的源代码转换为类似java语言的字节码。

这真的取决于所使用的语言的实现!不过,在任何实现中都有一个常见的步骤:您的代码首先被编译(翻译)为中间代码——介于您的代码和机器(二进制)代码之间的东西——称为字节码(存储在.pyc文件中)。注意,这是一个一次性步骤,除非修改代码,否则不会重复。

这个字节码在每次运行程序时都会被执行。怎么做?当我们运行程序时,这个字节码(在.pyc文件中)作为输入传递给虚拟机(VM)1——允许我们的程序被执行的运行时引擎——由虚拟机执行。

根据语言实现,VM将解释字节码(在CPython2实现的情况下)或JIT-compile3字节码(在PyPy4实现的情况下)。

注:

计算机系统的模拟

2字节码解释器;该语言的参考实现,用C和Python编写,使用最广泛

在程序执行期间(在运行时)进行的3个编译

4字节码JIT编译器;CPython的替代实现,用RPython (Restricted Python)编写——通常比CPython运行得更快

根据Python官方网站,它是解释的。

https://www.python.org/doc/essays/blurb/

Python是一种解释性的、面向对象的高级编程语言……

...

因为没有编译步骤…

...

Python解释器和广泛的标准库是可用的…

...

相反,当解释器发现错误时,它会引发 例外。当程序没有捕获异常时, 解释器输出堆栈跟踪。