Pan*_*yay 168 python interpreted-language
根据我的理解:
一个解释语言是高级语言运行和由解释器执行(程序将高级语言转换成机器代码,然后执行)在旅途中; 它一次处理一点程序.
甲编译语言是一种高级语言,其代码由编译器,然后通过一个执行器(另一个程序用于运行代码)执行(其高级语言转换成机器代码的程序)首先被转换为机器代码.
如果我的定义错了,请纠正我.
现在回到Python,我对此感到困惑.在任何地方,您都了解到Python是一种解释型语言,但它被解释为某些中间代码(如字节代码或IL)而不是机器代码.那么哪个程序执行IM代码?请帮助我理解如何处理和运行Python脚本.
小智 209
首先,解释/编译不是语言的属性,而是实现的属性.对于大多数语言而言,大多数(如果不是全部)实现都属于一个类别,因此可以保存一些单词,说语言也被解释/编译,但它仍然是一个重要的区别,因为它有助于理解,因为有很多语言两种类型的可用实现(主要在函数式语言领域,请参阅Haskell和ML).此外,有C语言解释器和项目试图将Python的子集编译为C或C++代码(以及随后的机器代码).
其次,编译不限于提前编译到本机机器代码.更一般地说,编译器是一种程序,它将一种编程语言中的程序转换为另一种编程语言的程序(可以说,如果应用了重要的转换,你甚至可以使用相同的输入和输出语言编译器).JIT编译器在运行时编译为本机机器代码,这可以使编译速度非常接近甚至更好(取决于基准测试和所比较的实现的质量).
但是要停止挑剔并回答你想要问的问题:实际上(阅读:使用一些有点流行和成熟的实现),Python被编译.没有提前编译到机器代码(即由受限和错误"编译",但唉常见定义),"仅"编译为字节码,但它仍然编译至少有一些好处.例如,语句a = b.c()被编译为字节流,当"反汇编"时,它看起来有点像load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a).这是一个简化,它实际上不太可读,而且更低级 - 您可以试验标准库dis模块,看看真实的交易是什么样的.解释这比从更高级别的表示解释更快.
该字节码要么被解释(请注意,在理论和实际性能上,直接解释和首次编译到某些中间表示并解释它之间存在差异),与参考实现(CPython)一样,或者解释和编译为与PyPy一样,在运行时优化机器代码.
Jer*_*emy 29
CPU只能理解机器代码.对于解释程序,解释器的最终目标是将程序代码"解释"为机器代码.但是,通常现代解释语言不会直接解释人类代码,因为它效率太低.
Python解释器首先读取人工代码并在将其解释为机器代码之前将其优化为一些直接代码.这就是为什么你总是需要另一个程序来运行Python脚本,这与C++不同,你可以直接运行可执行文件.例如c:\ Python27\python.exe或/ usr/bin/python.
qua*_*est 27
答案取决于正在使用的python实现.如果你正在使用让我们说CPython(python的标准实现)或Jython(目标是与java编程语言集成)它首先被翻译成字节码,并且根据你正在使用的python的实现,这个bycode被定向到相应的用于解释的虚拟机.用于CPython的PVM(Python虚拟机)和用于Jython的JVM(Java虚拟机).
但是让我们假设您正在使用PyPy,这是另一个标准的CPython实现.它将使用即时编译器.
chi*_*oni 13
是的,它既是编译型语言,又是解释型语言。 那为什么我们一般称它为解释型语言呢?
看看它是如何编译和解释的?
首先我想告诉你,如果你来自 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 中 Just-In-Time 编译器的作用
在 JVM 中,存在 Java 解释器,它逐行解释字节码以获得用于执行目的的本机机器代码,但是当 Java 字节码由解释器执行时,执行速度总是较慢。那么解决方法是什么呢?解决方案是即时编译器,它生成本机代码,其执行速度比可解释的要快得多。一些 JVM 供应商使用Java Interpreter,一些使用Just-In-Time compiler。参考资料:点此
在 python 中绕过解释器以实现快速执行使用另一个 python 实现(PyPy)而不是CPython。 单击此处查看包括PyPy在内的其他 Python 实现。
Joh*_* S. 10
根据python.org,它是一名翻译.
https://www.python.org/doc/essays/blurb/
Python是一种解释性的,面向对象的高级编程语言......
...
由于没有编译步骤......
...
Python解释器和广泛的标准库可用...
...
相反,当解释器发现错误时,它会引发异常.当程序没有捕获异常时,解释器打印堆栈跟踪.
对于刚开始使用 python 工作的人来说,这是一个很大的困惑,这里的答案有点难以理解,所以我会让它更容易一些。
当我们指示 Python 运行我们的脚本时,在我们的代码真正开始运行之前,Python 会执行几个步骤:
当我们执行一些源代码时,Python 将其编译为字节码。编译是一个翻译步骤,字节码是源代码的低级平台无关表示。
请注意,Python 字节码不是二进制机器码(例如,Intel 芯片的指令)。
实际上,Python 通过将源代码的每个语句分解为单独的步骤将它们转换为字节码指令。执行字节码转换以加快执行速度。字节代码可以比原始源代码语句运行得更快。它有 .pyc 扩展名,如果它可以写入我们的机器,它将被写入。
因此,下次我们运行相同的程序时,Python 将加载 .pyc 文件并跳过编译步骤,除非它被更改。Python 会自动检查源代码和字节码文件的时间戳,以了解何时必须重新编译。如果我们重新保存源代码,下次运行程序时会自动再次创建字节码。
如果 Python 无法将字节码文件写入我们的机器,我们的程序仍然可以运行。字节码在内存中生成,并在程序退出时简单地丢弃。但是因为 .pyc 文件加快了启动时间,我们可能需要确保它是为较大的程序编写的。
让我们总结一下幕后发生的事情。 当 Python 执行程序时,Python 将 .py 读入内存,并解析它以获得字节码,然后继续执行。对于程序导入的每个模块,Python 首先检查是否有预编译的字节码版本,在 .pyo 或 .pyc 中,具有与其 .py 文件对应的时间戳。Python 使用字节码版本(如果有)。否则,它会解析模块的 .py 文件,将其保存到 .pyc 文件中,并使用它刚刚创建的字节码。
字节码文件也是传送 Python 代码的一种方式。如果 Python 能找到的所有文件都是 .pyc 文件,那么它仍然会运行程序,即使原始 .py 源文件不存在。
Python 虚拟机 (PVM)
一旦我们的程序被编译成字节码,它就会被运送到 Python 虚拟机 (PVM) 上执行。PVM 不是一个单独的程序。它不需要自己安装。实际上,PVM 只是一个大循环,它通过我们的字节码指令一条一条地迭代,以执行它们的操作。PVM 是 Python 的运行时引擎。它始终作为 Python 系统的一部分出现。它是真正运行我们的脚本的组件。从技术上讲,它只是所谓的 Python 解释器的最后一步。
小智 6
If ( 你知道 Java ) {
Python 代码像 java 一样被转换成字节码。
每次尝试访问该字节码时都会再次执行该字节码。
} else {
Python 代码最初被翻译成一种叫做字节码的东西
,它非常接近机器语言,但不是真正的机器代码,
所以每次我们访问或运行它时,都会再次执行字节码
}
这实际上取决于所使用的语言的实现!不过,任何实现都有一个共同的步骤:您的代码首先被编译(翻译)为中间代码 - 介于您的代码和机器(二进制)代码之间的代码 - 称为字节码(存储到 .pyc 文件中)。请注意,这是一次性步骤,除非您修改代码,否则不会重复。
每次运行程序时都会执行该字节码。如何?那么,当我们运行该程序时,该字节码(在 .pyc 文件内)将作为输入传递给虚拟机 (VM) 1(允许执行我们的程序的运行时引擎),然后执行该程序。
根据语言实现,VM 将解释字节码(在 CPython 2实现的情况下)或 JIT 编译3 (在 PyPy 4实现的情况下)。
注意事项:
1计算机系统仿真
2字节码解释器;该语言的参考实现,用 C 和 Python 编写 - 最广泛使用
3程序执行期间(运行时)进行的编译
4字节码JIT编译器;CPython 的替代实现,用 RPython(受限 Python)编写 - 通常运行速度比 CPython 更快
| 归档时间: |
|
| 查看次数: |
142425 次 |
| 最近记录: |