Python 与另一种解释语言有何不同?
这涉及到头发分裂。解释语言和“托管代码”语言(如 C#)和虚拟机语言(如 Java)形成了一个奇怪的连续体。有些人会说所有语言都是“解释的”——甚至是机器语言。毕竟,CPU 的电子电路“解释”机器语言。
你能做的最好的就是说“解释”意味着有一个可见的软件层解释你的应用程序字节码。“未解释”意味着您的软件(或多或少)由底层硬件直接执行。“托管代码”的人可以自由地继续分裂这个头发。
你能告诉我在 Python 上下文中“后期绑定”是什么意思吗?
变量未声明为具有类型。变量尽可能晚地绑定到一个类型——分配一个实际的对象。
Java 是解释/编译语言吗?
是的。它被编译成字节码。字节码被解释。我更喜欢称它为解释性的。
然而,人们会(出于非常模糊的原因)不同意。任何类型的“编译”步骤的存在——无论多么小——总是让人们感到困惑。字节码的转换与程序在运行时的实际行为几乎没有关系。有些人喜欢说只有完全没有任何预处理“编译”污染的语言才能被解释。这样的例子已经不多了,因为许多语言都从对人类友好的文本翻译成对解释器友好的字节码。甚至 Applesoft Basic(早在 80 年代)在您输入代码时也完成了这种翻译通行证。
一些 JVM 执行 JIT。有些没有。有些是混合物。说 JVM 只做 JIT 字节码翻译是不正确的。一些JVM会这样做。有些没有。
在编译/执行方面它与 Python 有何不同?
一点也不。Java VM 可以执行 Python。[对于容易混淆的,这个上下文中的“python”这个词不可能意味着“python 源”。它一定是指 python 字节码。]
据说Java没有“后期绑定”。这是否与 Java 程序比 Python 快一点有关?
也许。Java 程序通常更快,因为 JIT 编译器在运行时将 Java 字节码转换为机器码。
静态(“早期”)绑定对 Java 的好处与它对真正编译的语言(如 C 或 C++)的好处不同,后者几乎没有任何类型的运行时检查。Java 仍然执行数组边界检查之类的操作,而 C 出于原始速度的考虑而将其省略。
实际上,“迟到”绑定几乎没有惩罚。Python 属性和方法使用简单的字典查找来解析。字典是一个哈希;性能相当不错。名称的散列可以放入“interned”字符串文字池中,分摊计算散列的成本。
为了真正有趣,看看 PyPy 和 RPython。这是一个可以进行 JIT 编译的 Python 解释器。你最终得到了一个 2 层的解释器。您的代码由 PyPy 解释。PyPy 由 RPython 解释。 http://alexgaynor.net/2010/may/15/pypy-future-python/