据我了解:
An 解释的语言是由解释器(将高级语言转换为机器代码然后执行的程序)实时运行和执行的高级语言;它一次处理一点程序。
A compiled语言是一种高级语言,其代码首先由编译器(将高级语言转换为机器代码的程序)转换为机器代码,然后由执行器(另一个运行代码的程序)执行。
如果我的定义有误,请纠正我。
现在回到Python,我对此有点困惑。无论你在哪里都知道Python是一种解释性语言,但它被解释为一些中间代码(如字节码或IL)并且not到机器代码。那么哪个程序执行 IM 代码呢?请帮助我了解 Python 脚本是如何处理和运行的。
首先,解释/编译不是语言的属性,而是实现的属性。对于大多数语言来说,大多数(如果不是全部)实现都属于一个类别,因此人们可能会节省几句话,说该语言也是解释/编译的,但这仍然是一个重要的区别,既因为它有助于理解,又因为有相当多的语言具有两种可用的实现(主要在函数式语言领域,请参阅 Haskell 和 ML)。此外,还有一些 C 解释器和项目尝试将 Python 的子集编译为 C 或 C++ 代码(随后编译为机器代码)。
其次,编译不限于提前编译为本机机器代码。更一般地说,编译器是一种将一种编程语言的程序转换为另一种编程语言的程序的程序(可以说,如果应用了重大转换,您甚至可以拥有具有相同输入和输出语言的编译器)。 JIT 编译器编译为本机机器代码在运行时,这可以提供非常接近甚至优于提前编译的速度(取决于基准和比较的实现的质量)。
但为了停止挑剔并回答你想问的问题:实际上(阅读:使用某种流行且成熟的实现),Python 是compiled。没有提前编译为机器代码(即“编译”受限制和错误,但可惜常见的定义),“仅”编译为bytecode http://en.wikipedia.org/wiki/Bytecode,但它仍然是至少具有一些好处的编译。例如,声明a = b.c()
被编译为字节流,当“反汇编”时,看起来有点像load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)
。这是一种简化,实际上可读性较差,而且级别较低 - 您可以尝试使用标准库dis module http://docs.python.org/library/dis.html看看真正的交易是什么样子的。解释这一点比解释更高级别的表示更快。
该字节码要么像参考实现 (CPython) 一样被解释(请注意,直接解释和首先编译为某种中间表示形式并解释它之间在理论上和实际性能上都存在差异),要么被解释并编译为在运行时优化机器代码,如PyPy http://pypy.org/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)