Python是解释型语言吗(像JavaScript或PHP)?
Python在运行时是严格解释的吗?还是说它可以用来开发像Java应用程序或C程序那样在后台运行的程序?
6 个回答
从技术上讲,Python会先被编译成一种叫字节码的东西,然后在一个叫虚拟机的环境中运行。如果Python的编译器能把字节码写成一个.pyc文件,它通常会这么做。
不过,Python没有像Java或C那样明确的编译步骤。从开发者的角度来看,Python就像是直接在解释.py文件一样。此外,Python还提供了一个交互式的命令行,你可以在里面输入Python语句,立刻看到执行结果。所以,Python的工作流程更像是一种解释型语言,而不是编译型语言。对我(还有很多其他开发者来说),这种工作流程的区别比有没有中间的字节码步骤更重要。
正如各种不同的回答所说,解释型和编译型之间的界限已经不再像这些术语刚出现时那么清晰。实际上,把语言简单地归为解释型或编译型也是有点错误的,因为同一种语言的不同实现可能会有不同的表现。现在你可以找到既有C/C++ 解释器,也有JavaScript 编译器。
即使在查看某种实现时,事情也并不是那么简单。这里有不同层次的解释。以下是解释型和编译型之间的一些区别:
纯解释。字面意思就是这样。读取一行源代码,然后立即执行它。实际上,很多主流语言并不这样做,基本上只有像 shell 脚本这样的东西。
词法分析 + 解释。这是对上面方法的一种简单优化。与其每次从头解释每一行,不如先将其进行词法分析(也就是说,把像“print 52 + x”这样的字符串转换成一串标记,比如
[PRINT_STATEMENT, INTEGER(52), PLUS_SIGN, IDENTIFIER('x')]
),这样就可以避免重复进行那种状态的解释。很多基本语言的版本都是这样工作的。字节码编译。这是像 Java 和 C# 这样的语言所采用的方法(不过下面会提到)。代码被转换成“虚拟机”的指令。这些指令随后会被解释执行。这也是 Python(或者说是最常用的实现 CPython)所采用的方法。Jython 和 IronPython 的实现也采用这种方法,但分别编译成 Java 和 C# 虚拟机的字节码。
字节码 + 即时编译。和上面一样,但不是解释字节码,而是在执行时将要执行的代码从字节码编译出来,然后运行。在某些情况下,这实际上可以比本地编译更快,因为它可以在运行时分析代码,并利用当前处理器的特定功能(而静态编译可能需要为最低配置的 CPU 编译)。Java 和 C# 的后续版本采用了这种方法。Psyco 为 Python 实现了这一点。
本地机器代码编译。代码被编译成目标系统的机器代码。你可能会认为这样就完全消除了解释,但即使在这里也有一些细微的差别。有些机器代码指令实际上并不是直接在硬件中实现的,而是通过微代码实现的——甚至机器代码有时也是被解释的!
这里有几个问题:
- 首先,Python并不是纯粹的解释型语言。它的标准版本会先把代码编译成字节码,然后再在一个虚拟机里执行。很多现代的JavaScript引擎也是这样做的。
- 不管是用什么方式(解释器、虚拟机还是机器代码),你想要的任何东西都可以在后台运行。如果你愿意,可以在后台运行一些脚本。