java - 解释 vs. 编译 vs. 后期绑定(bind)

标签 java python late-binding compiled

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

  1. Python 与其他解释型语言有何不同?

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

Java是另一种先将源代码编译成字节码,再解释成字节码的语言。

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

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

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

如果您也可以给我链接到人们已经讨论过的地方,那就太好了;我很想阅读更多关于这个的内容。谢谢。

最佳答案

How would Python be different from another interpreted language?

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

您最多只能说“已解释”意味着有一个可见的软件层在解释您的应用程序字节码。 “未解释”意味着您的软件(或多或少)直接由底层硬件执行。 “托管代码”的人可以自由地继续 split 这个头发。

Could you tell me what "late-binding" means, in the Python context?

变量没有被声明为具有类型。变量尽可能晚地绑定(bind)到一个类型——分配一个实际的对象。

Is Java an interpreted/compiled language?

是的。它被编译成字节码。字节码被解释。我更愿意称它为解释。

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

一些 JVM 执行 JIT。有些人没有。有些是混合物。说 JVM 只做 JIT 字节码翻译是不正确的。一些 JVM 可以。有些没有。

How is it different from Python in terms of compilation/execution?

完全没有。 Java VM 可以执行 Python。 [对于容易混淆的人来说,在这种情况下,“python”这个词不可能意味着“python 源代码”。一定是python字节码的意思。]

Java is said to not have, "late-binding". Does this have anything to do with Java programs being slighly faster than Python?

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

静态(“早期”)绑定(bind)对 Java 没有像 C 或 C++ 这样的真正编译语言那样的好处,后者几乎没有任何类型的运行时检查。 Java 仍然会做数组边界检查之类的事情,C 为了原始速度而忽略了这些事情。

“延迟”绑定(bind)实际上没有什么惩罚。 Python 属性和方法使用简单的字典查找来解析。字典是一个散列;性能相当不错。名称的哈希值可以放入“内部”字符串文字池中,以分摊计算哈希值的成本。

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

关于java - 解释 vs. 编译 vs. 后期绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2881526/

相关文章:

java - Spring Controller 预处理@ModelAttribute请求参数

linux - 如何在CentOS linux上安装特定版本的jdk

javascript - knockout.js - 模态的延迟数据绑定(bind)?

java - 如何检查 bean 属性是否存在 win BeanUtils 或类似的?

python - xarray 多索引连接的最佳实践

python - 具有同一行字符的单元格合并为一个单元格

python - 计算时间差(以分钟为单位)

python - 为什么 map() 和列表理解的结果不同?

java - 如何重载方法来处理 Java 中参数的子类?

java - Java 的 lambda 语法的分割是什么?