解释与汇编与后期结束
-
04-10-2019 - |
题
Python被编译成中间字节码(PYC),然后执行。因此,有一个汇编,然后进行解释。但是,长期的Python用户说,Python是一种“后期”语言,不应将其称为一种解释的语言。
Python与另一种解释语言有何不同?
您能告诉我在Python的背景下,“后期结合”的含义?
Java是另一种语言,首先将源代码编译到字节码中,然后将其解释到字节码中。
Java是解释/编译的语言吗?
在汇编/执行方面,它与Python有何不同?
据说爪哇没有“后期结合”。这与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)。