Java经常被认为比其他语言(如已编译的语言)更具可移植性,因为可执行文件可以在任何具有JVM的平台上运行。但是用C编写的代码可以在任何带有C编译器的平台上运行。
所以,天真地,有两种选择:为许多不同的平台制作许多不同的编译器,并通过网络传输源代码,例如applet,它是客户端编译的;或者使许多不同的虚拟机在许多不同的平台上运行,并通过网络传输相同的可执行程序或小程序。
为什么后者更好?我可以看到服务器端编译是如何可取的,但我觉得它还有更多。我可以理解,Sun Microsystems为许多平台创建JVM比使用许多平台的编译器要少,但这肯定不是主要动机。
答案 0 :(得分:1)
但是用C编写的代码可以在任何带有C编译器的平台上运行。
不是以同样的方式。您需要使用该特定编译器在该计算机上编译它,或者需要能够交叉编译的编译器。无论哪种方式,你的工作量都会增加。
仍然有一些 C代码非常便携。如果你愿意将它编译到不同的平台,那么计算基本算术的简单程序即使在C中也是非常便携的。
第二个重要的区别是平台。只要执行I / O或使用系统调用,代码就会变为特定于平台,因为您需要直接与主机系统连接。解释语言提供统一平台。如果我的程序在JVM上运行,它就会在它上运行,无论哪个系统是JVM的主机。如果我对主机操作系统使用“本机”调用,我必须为每个操作系统使用正确的调用 - 但使用Java,我的“操作系统”是JVM。
Btw,有所谓的“可移植”C / C ++代码,但它也取决于与JVM类似的概念。如果您使用Qt和类似的库在多个平台上提供统一的API,那么您可以创建非常便携的C / C ++程序。答案 1 :(得分:1)
可能在whitepaper that announced the Java language back in 1995中找到了解释Java为何被解释的最权威的答案:
1.2.3架构中立且便携
Java技术旨在支持将部署到异构网络环境中的应用程序。在这样的环境中,应用程序必须能够在各种硬件体系结构上执行。在各种硬件平台中,应用程序必须在各种操作系统上执行,并与多种编程语言接口互操作。为了适应多种操作环境,Java Compiler TM产品生成字节码 - 一种体系结构中立的中间格式,旨在将代码有效地传输到多个硬件和软件平台。 Java技术的解释性质解决了二进制分发问题和版本问题;相同的Java编程语言字节代码将在任何平台上运行。
架构中立性只是真正便携式系统的一部分。 Java技术通过严格定义基本语言,使可移植性进一步发展。 Java技术占据了一席之地,并指定了其基本数据类型的大小及其算术运算符的行为。您的程序在每个平台上都是相同的 - 硬件和软件架构之间没有数据类型不兼容。
和
1.2.5解释,线程和动态
Java解释器可以直接在已移植解释器和运行时系统的任何机器上执行Java字节码。在诸如基于Java技术的系统之类的解释平台中,程序的链接阶段是简单的,增量的和轻量级的。您可以从更快的开发周期中受益 - 与传统的重量级编译,链接和测试周期相比,原型设计,实验和快速开发是正常情况。
值得一提的是,Java API远远超出了C或C ++的标准库。
请注意,此观点有些过时。虽然在很大程度上仍然准确,但在先验和运行时编译之间进行权衡的现代考虑应包括执行时间统计提供的额外优化机会,并且可能完全避免使用“解释”这个词 - 至少如果我们在某种程度上认真对待表现。