擅长:python、mysql、java
<p>首先,解释/编译不是语言的属性,而是实现的属性。对于大多数语言来说,大多数(如果不是所有的话)实现都属于一个类别,因此可以省去几个词,说该语言也被解释/编译了,但这仍然是一个重要的区别,因为它有助于理解,而且有相当多的语言具有这两种类型的可用实现(主要是在函数语言领域中,参见Haskell和ML)。此外,还有C编译器和项目试图将Python的子集编译成C或C++代码(随后是机器代码)。
<p>其次,编译并不局限于对本机代码的提前编译。更一般地说,编译器是将一种编程语言中的程序转换为另一种编程语言中的程序的程序(可以说,如果应用了重要的转换,您甚至可以使用具有相同输入和输出语言的编译器)。JIT编译器在运行时</em>编译为本机机器代码<em>,这可以使速度非常接近甚至优于提前编译(取决于基准测试和比较的实现质量)</p>
<p>但是,为了停止挑剔并回答您想要问的问题:实际上(阅读:使用一个比较流行和成熟的实现),Python是<strong>编译的</strong>。没有提前编译成机器代码(即,根据受限和错误的,但很遗憾的是,常见的定义是“编译”),“仅”编译成<a href="http://en.wikipedia.org/wiki/Bytecode" rel="noreferrer">bytecode</a>,但它仍然是编译,至少有一些好处。例如,语句<code>a = b.c()</code>被编译成一个字节流,当“反汇编”时,它看起来有点像<code>load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)</code>。这是一种简化,实际上可读性较低,层次较低-您可以使用标准库<a href="http://docs.python.org/library/dis.html" rel="noreferrer">^{<cd3>} module</a>看看真正的交易是什么样子的。解释这件事比从更高层次的代表那里解释要快</p>
<p>该字节码要么被解释(请注意,直接解释,要么首先编译为某种中间表示形式,然后再进行解释,两者在理论和实际性能上都有区别),就像参考实现(CPython)一样,或在运行时解释并编译为优化的机器代码,如<a href="http://pypy.org/" rel="noreferrer">PyPy</a></p>