根据我的理解:

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

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

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

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


当前回答

你写的python代码被编译成python字节码,它会创建扩展名为.pyc的文件。如果是编译,问题又来了,为什么不是编译语言。

注意,这不是传统意义上的编译。通常,我们会说编译是采用高级语言并将其转换为机器代码。但它是某种汇编。编译到中间代码,而不是机器代码(希望你现在得到它)。

回到执行过程,在编译步骤中创建的pyc文件中的字节码,然后由相应的虚拟机(在我们的例子中是CPython VM)执行 时间戳(称为魔数)用于验证.py文件是否被更改,这取决于创建的新pyc文件。如果pyc是当前代码,那么它简单地跳过编译步骤。

其他回答

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

Python解释器首先读取人类代码,并在将其解释为机器代码之前将其优化为一些中间代码。这就是为什么你总是需要另一个程序来运行Python脚本,不像在c++中,你可以直接运行编译后的可执行代码。例如,c:\Python27\python.exe或/usr/bin/python.

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

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,编译失败时什么都不会执行。

As sone one already said, "interpreted/compiled is not a property of the language but a property of the implementation." Python can be used in interpretation mode as well as compilation mode. When you run python code directly from terminal or cmd then the python interpreter starts. Now if you write any command then this command will be directly interpreted. If you use a file containing Python code and running it in IDE or using a command prompt it will be compiled first the whole code will be converted to byte code and then it will run. So it depends on how we use it.

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

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

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

注:

计算机系统的模拟

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

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

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