【问题标题】:When using the Python Interpreter, is the compiler used at all?使用 Python Interpreter 时,是否使用了编译器?
【发布时间】:2015-04-27 21:27:37
【问题描述】:

Google's Python Class 中显示

Python 是一种动态的解释型(字节码编译型)语言

我知道解释器是什么,也知道字节码是什么,但两者似乎不适合。在doing some reading 之后,基本 Python 源代码在解释之前自动编译变得更清楚了;但出现了一些新问题。

使用Python Interpreter 时不会发生编译吗?如果有,什么时候?例如,如果您只是在命令行中键入代码,并且每次按 Enter 时都会运行,那么编译器什么时候有机会完成它的工作?

同样在上面链接到的问题中,@delnan 给出了一个相当广泛的编译器定义

更一般地说,编译器是将程序转换为 将一种编程语言转化为另一种编程中的程序 语言...JIT 编译器在运行时编译为本机代码

我想我的问题是:解释器和自动编译器有什么区别?稍微细化一下这个问题,如果 Python 是编译的,为什么不一直编译成机器码(或汇编,因为我知道编写可以产生纯机器码的编译器很困难)?

【问题讨论】:

  • 自动编译器是什么意思?
  • @igon 好吧,我红色 Python 有一个编译器,但在创建用 Python 编写的程序时,我肯定明确使用了它。 “Python 有一个编译器!你只是没有注意到它,因为它会自动运行。”来自programmers.stackexchange.com/questions/136942/…。我的观点是,这和口译员不一样吗?

标签: python compilation language-agnostic interpreter


【解决方案1】:

也许最好忘记语义,而只是尝试了解 Cpython 实际在做什么。当您调用 Cpython 二进制文件时,它会做很多事情。一般来说,您可以期望它将您编写的代码翻译成bytecode instructions 的序列。这是人们有时会引用 Python 代码的“编译”阶段。与您的手写代码相比,这些是一种更紧凑、更有效的方式来告诉解释器该做什么。通常,python 会缓存这些文件以便在.pyc 文件中重复使用(仅当关联的.py 文件较新时才会重新生成)。您可以将 python 字节码视为 python 虚拟机可以运行的指令集——在很多方面,它与您在 Java 中得到的并没有什么不同。当人们谈到编译语言时(例如C),编译器的工作就是将您的代码翻译成一组指令,这些指令将直接在您的计算机硬件上运行。像 Cpython 和 Java 这样的语言有一个额外的间接级别(例如虚拟机)。虚拟机直接在计算机硬件上运行,并负责解释特定领域的语言。

与标准的“编译”语言(例如CFortran)相比,这个阶段非常轻量级——而且python没有做很多“传统”编译器会做的检查(例如类型检查)。它几乎只检查语法并使用the peephole optimizer 进行一些非常简单的优化。

【讨论】:

    猜你喜欢
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 2014-02-08
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    相关资源
    最近更新 更多