在使用Python解释器时,编译器是否可以使用?
在Google的Python类中它读取
Python是一种动态的解释(字节码编译)语言
我知道一个解释器是什么,并且知道什么是字节码,但是这两者似乎不合适。 在做了一些阅读后,它变得更清晰了,基本上Python源代码在解释之前自动编译; 但出现了一些新问题。
使用Python解释器时不会编译? 如果是这样,什么时候? 例如,如果您只是在命令行输入代码,并且每次按Enter时都会运行代码,那么编译器何时有机会完成其工作?
同样在上面的问题中,@delnan给出了一个相当广泛的编译器定义
更一般地说,编译器是一种将一种编程语言中的程序转换为另一种编程语言中的程序的程序。JIT编译器在运行时编译为本机机器码
我想我的问题是:解释器和自动编译器有什么区别? 为了细化这个问题,如果编译Python,为什么不编译所有的机器代码(或汇编,因为我知道编写能够生成纯机器代码的编译器很困难)?
也许最好忘记语义,并试着学习Cpython实际上在做什么。 当您调用Cpython二进制文件时,它会执行一些操作。 一般来说,您可以期望它将您写入的代码转换为字节码指令序列。 这是人们有时会参考python代码的“编译”阶段。 这是一种更紧凑,更高效的方式来告诉口译员要做什么而不是手写代码。 通常,python会缓存这些文件以便在.pyc
文件中重用(如果关联的.py
文件较新,只能重新生成)。 您可以将python字节码视为python虚拟机可以运行的一组指令 - 从很多方面来说,这与Java获得的内容并不完全相同。 当人们谈论编译语言时(例如C
),编译器的工作就是将您的代码转换成一组将直接在您的计算机硬件上运行的指令。 Cpython和Java等语言具有额外的间接级别(例如虚拟机)。 虚拟机直接在计算机的硬件上运行,并负责解释域特定的语言。
与标准的“编译”语言(例如C
, Fortran
)相比,这个阶段真的很轻 - 而python并没有做很多“传统”编译器会做的检查(例如类型检查)。 它几乎只检查语法,并使用窥视优化器进行一些非常简单的优化。
上一篇: When using the Python Interpreter, is the compiler used at all?