解释绑定、编译绑定和后期绑定

2022-09-04 19:29:25

Python被编译成一个中间字节码(pyc),然后执行。因此,有一个汇编,然后是解释。然而,长期的Python用户说Python是一种“后期绑定”的语言,它不应该被称为解释型语言。

  1. Python与另一种解释型语言有何不同?

  2. 你能告诉我在Python上下文中“后期绑定”是什么意思吗?

Java是另一种语言,它首先将源代码编译为字节码,然后解释为字节码。

  1. Java是解释型/编译型语言吗?

  2. 它在编译/执行方面与Python有何不同?

  3. Java据说没有“后期绑定”。这与Java程序比Python快一点有什么关系吗?

如果你能给我一些链接,让我链接到人们已经讨论过这个问题的地方,那就太好了。我很想阅读更多关于这个。谢谢。


答案 1

Python与另一种解释型语言有何不同?

这涉及到头发分裂。解释型语言和“托管代码”语言(如 C# 和虚拟机语言(如 Java))形成了一个奇怪的连续体。有些人会说所有语言都是“解释”的--甚至是机器语言。毕竟,CPU的电子电路“解释”了机器语言。

你能做的最好的事情就是说“解释”意味着有一个可见的软件层解释你的应用程序字节码。“未解释”意味着您的软件(或多或少)由底层硬件直接执行。“托管代码”的人可以自由地继续分裂这根头发。

你能告诉我在Python上下文中“后期绑定”是什么意思吗?

变量未声明为具有类型。该变量尽可能晚地绑定到类型 - 具有实际对象的赋值。

Java是解释型/编译型语言吗?

是的。它被编译为字节码。对字节代码进行解释。我更喜欢称之为解释。

然而,人们会(出于非常模糊的原因)不同意。任何类型的“编译”步骤的存在 - 无论多么小 - 总是让人感到困惑。转换为字节代码与程序在运行时的实际行为几乎没有关系。有些人喜欢说,只有完全没有预处理“编译”污点的语言才能被解释。这方面的例子已经不多了,因为许多语言都是从人类友好的文本翻译成解释器友好的字节码。即使是Applesoft Basic(早在80年代)在你输入代码时也完成了这种翻译。

一些JVM做JIT。有些则不然。有些是混合的。说 JVM 只执行 JIT 字节码转换是不正确的。有些JVM是有的。有些则不然。

它在编译/执行方面与Python有何不同?

一点也不。Java VM 可以执行 Python。[对于容易混淆的人来说,“python”这个词在这个上下文中不可能意味着“python source”。它必须意味着python字节码。

Java据说没有“后期绑定”。这与Java程序比Python快一点有什么关系吗?

也许。Java 程序通常更快,因为 JIT 编译器在运行时将 Java 字节代码转换为机器代码。

静态(“早期”)绑定对于Java来说没有与C或C++等真正编译的语言相同的好处,在这些语言中几乎没有任何类型的运行时检查。Java仍然做数组边界检查之类的事情,C为了原始速度而省略了这些检查。

实际上,“延迟”绑定几乎没有惩罚。Python 属性和方法使用简单的字典查找进行解析。字典是一个哈希;性能相当不错。可以将名称的哈希放入“滞留”字符串文本池中,以分摊计算哈希的成本。

为了真正的乐趣,看看PyPy和RPython。这是一个可以进行JIT编译的Python解释器。你最终会得到一个2层口译员。您的代码由 PyPy 解释。PyPy由RPython解释。http://alexgaynor.net/2010/may/15/pypy-future-python/


答案 2

后期绑定是一个与解释非常不同的概念。

严格来说,解释型语言是直接从源头执行的。它不会经历字节码编译阶段。之所以产生混淆,是因为python程序一个解释器,但它解释字节码,所以它是Python的字节码语言,你可以将其描述为“解释”。Python语言本身就是一种编译语言。

相比之下,Java字节码现在既是解释又是编译的。它由 JIT 编译器编译为本机代码,然后直接在硬件上运行。

后期绑定是类型系统的一个属性,在某种程度上存在于大多数语言中,无论它们是解释的还是编译的。