Java 为什么解释语言被认为更便于移植?

Java 为什么解释语言被认为更便于移植?,java,interpreted-language,Java,Interpreted Language,Java经常被引用为比其他语言(比如编译语言)更具可移植性,因为可执行文件可以在任何带有JVM的平台上运行。但是用C编写的代码可以在任何带有C编译器的平台上运行 因此,天真地说,有两种选择:为许多不同的平台制作许多不同的编译器,并通过网络传输源代码,例如,为客户端编译的applet;或者让许多不同的虚拟机在许多不同的平台上运行,并通过网络传输相同的可执行程序或小程序 为什么后者更好?我可以看出服务器端编译是多么令人向往,但我觉得它比这更重要。我可以理解,Sun Microsystems为许多平台

Java经常被引用为比其他语言(比如编译语言)更具可移植性,因为可执行文件可以在任何带有JVM的平台上运行。但是用C编写的代码可以在任何带有C编译器的平台上运行

因此,天真地说,有两种选择:为许多不同的平台制作许多不同的编译器,并通过网络传输源代码,例如,为客户端编译的applet;或者让许多不同的虚拟机在许多不同的平台上运行,并通过网络传输相同的可执行程序或小程序

为什么后者更好?我可以看出服务器端编译是多么令人向往,但我觉得它比这更重要。我可以理解,Sun Microsystems为许多平台创建JVM比为许多平台创建编译器要少,但这肯定不是主要动机

但是用C编写的代码可以在任何带有C编译器的平台上运行

不一样。您要么需要使用特定的编译器在该机器上编译它,要么需要能够交叉编译的编译器。不管怎样,你的工作量都会更大

尽管如此,仍然有一些C代码是非常可移植的。一个只计算基本算法的简单程序是非常可移植的,即使是在C语言中,如果您愿意将它编译到不同的平台上

第二大重要区别是平台。只要您执行I/O或使用系统调用,您的代码就会变得特定于平台,这仅仅是因为您需要直接与主机系统接口。解释语言提供了一个统一的平台。如果我的程序在JVM上运行,那么无论哪个系统是JVM的宿主,它都会在JVM上运行。如果我使用对主机操作系统的“本机”调用,我必须为每个操作系统使用合适的调用——但是对于Java,我的“操作系统”是JVM

顺便说一句,有所谓的“可移植”C/C++代码,但它也依赖于与JVM类似的概念。如果您使用在多个平台上提供统一API的Qt和类似库,那么您可以创建可移植的C/C++程序

但是用C编写的代码可以在任何带有C编译器的平台上运行

不一样。您要么需要使用特定的编译器在该机器上编译它,要么需要能够交叉编译的编译器。不管怎样,你的工作量都会更大

尽管如此,仍然有一些C代码是非常可移植的。一个只计算基本算法的简单程序是非常可移植的,即使是在C语言中,如果您愿意将它编译到不同的平台上

第二大重要区别是平台。只要您执行I/O或使用系统调用,您的代码就会变得特定于平台,这仅仅是因为您需要直接与主机系统接口。解释语言提供了一个统一的平台。如果我的程序在JVM上运行,那么无论哪个系统是JVM的宿主,它都会在JVM上运行。如果我使用对主机操作系统的“本机”调用,我必须为每个操作系统使用合适的调用——但是对于Java,我的“操作系统”是JVM


顺便说一句,有所谓的“可移植”C/C++代码,但它也依赖于与JVM类似的概念。如果您使用在多个平台上提供统一API的Qt和类似库,那么您可以创建可移植的C/C++程序。

关于Java为何被设计为可解释的,最权威的答案可能是:

1.2.3体系结构中立且可移植

Java技术旨在支持将部署到异构网络环境中的应用程序。在这样的环境中,应用程序必须能够在各种硬件架构上执行。在各种硬件平台中,应用程序必须在各种操作系统上执行,并与多个编程语言接口进行互操作。为了适应操作环境的多样性,Java Compiler TM产品生成字节码——一种与体系结构无关的中间格式,旨在将代码高效地传输到多个硬件和软件平台。Java技术的解释性质解决了二进制分布问题和版本问题;相同的Java编程语言字节码将在任何平台上运行

架构中立性只是真正可移植系统的一部分。Java技术通过对basic语言的严格定义,进一步提高了可移植性。Java技术在地面上打下了基础,并指定了其基本数据类型的大小及其算术运算符的行为。您的程序在每个平台上都是相同的——在硬件和软件架构之间没有数据类型不兼容

1.2.5解释、线程化和动态

Java解释器可以在解释器和运行时系统移植到的任何机器上直接执行Java字节码。在解释平台(如基于Java技术的系统)中,程序的链接阶段是简单、增量和轻量级的。您可以从更快的开发周期中获益——与传统的重量级编译、链接和测试周期相比,原型设计、实验和快速开发是正常情况

<> P>也值得注意的是,java API远远超出了C++或C++的标准库。
请注意,这种观点有些过时。虽然在很大程度上仍然是准确的,但现代的编译方法在先验编译和运行时编译之间进行权衡,包括执行时间统计提供的额外优化机会,并且可能避免使用“解释”一词总之—至少如果我们对性能有点认真的话。

关于Java为何被设计为可解释的,最权威的答案可能是:

1.2.3体系结构中立且可移植

Java技术旨在支持将部署到heterogen中的应用程序