有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java解释vs.编译vs.后期绑定

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

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

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

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

  1. Java是一种解释/编译语言吗

  2. 在编译/执行方面,它与Python有什么不同

  3. 据说Java没有“后期绑定”。这与Java程序比Python快多少有关吗

如果你也能给我一些人们已经讨论过的地方的链接,那就太好了;我想读更多关于这方面的内容。谢谢


共 (5) 个答案

  1. # 1 楼答案

    后期绑定对于解释来说是一个非常不同的概念

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

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

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

  2. # 2 楼答案

    How would Python be different from another interpreted language?

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

    你所能做的就是说“解释”意味着有一个可见的软件层来解释你的应用程序字节码。“未解释”指软件(或多或少)由底层硬件直接执行。“托管代码”用户可以自由地继续拆分这些头发

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

    变量未声明为具有类型。变量尽可能晚地绑定到一个类型,并分配一个实际对象

    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虚拟机可以执行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?

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

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

    实际上,“延迟”绑定几乎没有什么惩罚。Python属性和方法通过简单的字典查找来解析。这本字典是一本杂烩;性能相当好。名称的散列可以放入一个“内部”字符串文字池,以分摊计算散列的成本

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

  3. # 3 楼答案

    绑定时间是名称解析为事物的时间。 更具动态性的语言倾向于后期绑定。 这可以与解释/编译分开——例如, 与C++相比,Objto-C方法的后期和动态都得到了解决。 Java在类加载时执行大部分绑定:比C晚,但 早于Python

    my favorite quote from Stan Kelly-Bootle's Computer Contradictionary

    绑定时间n.哈希表损坏的时刻

    ==>;计算技术的进步可以映射到“绑定的延迟”,这让我思考自己所谓的CS——所谓的职业:金色的过去、灰色的现在和美好的未来。这是我对辛格乐观主义的看法:除了t=0,草更绿。在EDSAC I上,我的函数(5ch纸带子程序)在输入前大约两周打孔、拼接和装订。这就是所谓的复制绑定,需要灵活地使用松紧带。FORTRAN紧随其后的是一种新的装订方式:一副湿漉漉的卡片,拒绝洗牌。然后,Algol和C,我享受静态(编译时)绑定,直到C++带来动态(运行时)绑定的麻木乐趣。我目前的研究目的是将绑定延迟到执行后很久。正如圣马太福音中所预言的那样,我称之为终结时间约束:“……无论你在地上约束什么,都将在天堂约束……”(马太福音16:19新译本)

  4. # 4 楼答案

    我认为,在编译Java时解释Python的常见误解是因为Java有一个明确的编译步骤——必须运行javac才能转换代码。将java源文件转换为。类可以运行的字节码文件

    正如您正确指出的那样,Python同样会将源文件编译成字节码,但它是透明的——编译和运行通常是在一个步骤中完成的,因此对用户来说不太明显

    重要的区别在于早期和;后期绑定和动态&;静态打字。编译/解释的区别毫无意义,也无关紧要

  5. # 5 楼答案

    我们所说的绑定时间解释/编译的概念之间有联系

    绑定时间是将符号表达式绑定到其具体值的时间。这与编程语言的定义更相关,例如变量的动态范围和静态范围。或者静态方法与虚拟方法,或者动态类型与静态类型

    然后是语言的实现。预先静态了解的信息越多,编写编译器就越容易。相反,语言越晚绑定,就越难。因此,有时需要依赖解释技巧

    然而,两者之间的区别并不严格。我们不仅可以考虑一切都是最终解释(见S. Lott回答),但部分代码可以编译,反编译,或重新编译动态(如JIT),使区别非常模糊。p>

    例如,Java中的动态类加载属于“后期绑定”类别:类集合不是一次性固定的,类可以动态加载。当我们知道类的集合时,可以进行一些优化,但是一旦加载了一个新类,就需要使其失效。使用调试基础设施更新方法的能力也是如此:如果方法已内联,JVM将需要对所有调用站点进行去优化

    我对Python了解不多,但Python实践者可能更喜欢使用术语“后期绑定”来避免这种混淆