根据我的理解:

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

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

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

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


当前回答

答案取决于使用的是哪种python实现。如果你正在使用CPython (python的标准实现)或Jython(用于与java编程语言集成),它首先被翻译成字节码,并根据你正在使用的python实现,这个字节码被定向到相应的虚拟机进行解释。PVM (Python虚拟机)用于CPython, JVM (Java虚拟机)用于Jython。

但假设你使用的是PyPy,这是另一个标准的CPython实现。它将使用即时编译器。

其他回答

这似乎是语义上的问题。我想大多数人都会推断编译的结果通常是机器代码。考虑到这一点,我对自己说,python是没有编译的。不过我可能错了,因为compile实际上意味着转换到较低级别,所以从源代码转换到字节码也是编译。

CPU实际上只能理解机器代码。对于解释型程序,解释器的最终目标是将程序代码“解释”为机器代码。然而,现代解释语言通常不会直接解释人类代码,因为它效率太低。

Python解释器首先读取人类代码,并在将其解释为机器代码之前将其优化为一些中间代码。这就是为什么你总是需要另一个程序来运行Python脚本,不像在c++中,你可以直接运行编译后的可执行代码。例如,c:\Python27\python.exe或/usr/bin/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实现。如果你正在使用CPython (python的标准实现)或Jython(用于与java编程语言集成),它首先被翻译成字节码,并根据你正在使用的python实现,这个字节码被定向到相应的虚拟机进行解释。PVM (Python虚拟机)用于CPython, JVM (Java虚拟机)用于Jython。

但假设你使用的是PyPy,这是另一个标准的CPython实现。它将使用即时编译器。

Python(解释器)被编译。

证明:它甚至不会编译你的代码,如果它包含语法错误。

示例1:

print("This should print") 
a = 9/0 

输出:

This should print
Traceback (most recent call last):
  File "p.py", line 2, in <module>
    a = 9/0
ZeroDivisionError: integer division or modulo by zero

代码编译成功。第一行执行(打印),第二行抛出ZeroDivisionError(运行时错误)。

示例2:

print("This should not print")
/0         

输出:

  File "p.py", line 2
    /0
    ^
SyntaxError: invalid syntax

结论:如果代码文件包含SyntaxError,编译失败时什么都不会执行。