Python被编译成中间字节码(PYC),然后执行。因此,有一个汇编,然后进行解释。但是,长期的Python用户说,Python是一种“后期”语言,不应将其称为一种解释的语言。

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

  2. 您能告诉我在Python的背景下,“后期结合”的含义?

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

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

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

  3. 据说爪哇没有“后期结合”。这与Java程序比Python更快有任何关系吗?

如果您还可以给我与人们已经讨论过的地方的链接,那就太好了;我很想了解更多。谢谢你。

有帮助吗?

解决方案

晚期绑定是一个与解释截然不同的概念。

严格来说,解释的语言直接从源代码执行。它不会经过字节代码汇编阶段。由于Python程序而出现混乱 解释器,但它解释了字节代码,因此您将其描述为“解释”是Python的字节代码语言。 Python语言本身是一种编译语言。

相比之下,Java字节码如今已被解释和编译。它由JIT汇编器将其编译为本机代码,然后直接在硬件上运行。

晚绑定是类型系统的属性,无论是解释还是编译,都在某种程度上以大多数语言存在。

其他提示

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

这涉及剪发。解释语言和“托管代码”语言(例如C#和虚拟机语言)(如Java)形成了怪异的连续体。有些人会说 全部 语言是“解释”的,甚至是机器语言。毕竟,CPU“解释”机器语言的电子电路。

最好的方法是说“解释”意味着有一层可见的软件来解释您的应用程序字节编码。 “不解剖”是指您的软件是(或多或少)由基础硬件直接执行的。 “托管代码”人们可以自由地继续分开这头发。

您能告诉我在Python的背景下,“后期结合”的含义?

变量没有声明为类型。该变量与实际对象的分配尽可能迟到。

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

是的。它已编译为字节代码。字节代码被解释。我更喜欢称其为解释。

但是,人们(出于真正晦涩的原因)会不同意。任何形式的“编译”步骤的存在 - 多么最小 - 总是使人们感到困惑。对字节代码的翻译几乎与该程序在运行时的实际行为无关。有些人喜欢说 只要 语言是 完全 可以解释没有任何预处理“汇编”的污点。不再有很多例子了,因为许多语言从人类友好的文本转换为口译员友好的字节代码。即使是Applesoft Basic(80年代回到),您在输入代码时也完成了这种翻译通行证。

一些JVM的Do Jit。有些没有。有些是混合物。要说JVM仅JIT字节代码翻译不正确。一些JVM的做。有些没有。

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

一点也不。 Java VM可以执行Python。 [对于易于解决的情况,在这种情况下,“ Python”一词不可能意味着“ Python source”。它必须表示Python字节码。

据说爪哇没有“后期结合”。这与Java程序比Python更快有任何关系吗?

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

静态(“早期”)绑定对Java的益处没有相同的好处,它具有真正编译的语言,例如C或C ++,几乎没有任何类型的运行时间检查。 Java仍然执行诸如数组界检查之类的事情,为了原始速度而省略。

实际上,“迟到”的约束实际上几乎没有罚款。 Python属性和方法是使用简单的字典查找来解决的。词典是哈希。性能很好。名称的哈希可以放入“实施”字符串池中,以摊销计算哈希的成本。

为了真正的乐趣,请欣赏pypy和rpython。这是一个可以进行JIT汇编的Python解释器。您会用2层的口译员结束。您的代码由PYPY解释。 PYPY由Rpython解释。 http://alexgaynor.net/2010/may/15/pypy-future-python/

我们所说的 绑定时间 以及的概念 解释/汇编.

结合时间是符号表达式与其混凝土值结合的时间。这与编程语言的定义,例如动态和变量的静态范围有关。或静态方法与虚拟方法或动态键入与静态键入。

然后是该语言的实施。预先静态的信息越多,编写编译器就越容易。相反,语言的束缚越晚,就越难。因此,有时需要依靠解释性技术。

但是,两者之间的区别并不严格。我们不仅可以考虑所有内容最终都被解释(请参阅S.Lott答案),而且代码的一部分可以是由动态编译,反编译或重新编译的(例如JIT),从而使区别非常模糊。

例如,Java中的动态类加载在类别“后期绑定”类别中:类的集合并非全部修复一次,并且可以动态加载类。当我们知道一组类时,可以进行一些优化,但是一旦加载新类,就需要无效。通过调试基础架构更新方法的能力也会发生同样的情况:如果该方法已被列为列,则JVM将需要降低所有呼叫站点。

我对Python了解不多,但是Python的从业者更喜欢“ Late Bound”一词来避免这种混乱。

我认为,由于Java具有明确的编译步骤,因此出现了Java时解释Python的常见误解 - 您必须运行Javac将.java源文件转换为可以运行的.class字节码文件。

当您正确地指出Python时,类似地将源文件编译到字节码中,但是它可以透明地编译 - 编译和运行通常是在一个步骤中完成的,因此对用户而言不太明显。

重要的区别在于早期和晚期结合以及动态和静态键入。编译/解释的区别是毫无意义且无关紧要的。

绑定时间是当名称解决到事物时。更具动态的语言倾向于延迟绑定。这可以与解释/汇编分开 - 例如,Objective-C方法与C ++相比被迟到并动态。 Java在班级加载时间内进行了大部分绑定:比C晚,但比Python更早。

我最喜欢的Stan Kelly-Bootle计算机矛盾的报价:

绑定时间n。哈希桌子损坏的那一刻。

==>可以根据“约束力的迟到”来映射计算的进步,这使我想到了自己所谓的CS所谓的职业:黄金过去,灰色现在和玫瑰色的未来。这是我对Synge的乐观态度的版本:除了T = 0,草更绿。在EDSAC I上,我的功能(5CH纸带子例程)被打孔,剪接和绑定在输入前约两周。这是已知的Aspremature Binding,并要求使用弹性带敏感。接下来,Fortran带来了一种新型的约束力:拒绝洗牌的卡片牌组。然后,使用Algol和C,我享受了静态(编译时间)绑定,直到C ++带来了动态(运行时)结合的麻木喜悦。我目前的研究旨在将绑定延迟到执行后的良好状态。我称这种终结时间的约束,就像圣马修福音书中所预言的那样:“……你所束缚在地球上的任何东西都将被束缚在天堂……”(马太福音16:19 kjv)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top