与JVM一样,每个平台都有一个C/C++编译器负责translating source to machine/processor指令。这些机器指令可被处理器理解,例如:因此C/C编译器可用于它所支持的每个平台。然而,您可能需要在程序中链接到特定操作系统/平台的特定库。这将使您的程序特定于平台,并且需要通过链接到该库的另一个平台版本来针对该平台进行重写。**这成为C/C程序员的责任。此外,每个C/C++编译器具有其自己的特定于平台的变幻莫测的特性,这与JVM不同,JVM提供了下面详细描述的跨平台的一致视图。 如果是Java**,您将无法利用平台特定性(除非JVM或Java库没有提供,但它们通常涵盖了大部分基础知识)。除非您在java源代码中使用JNI,否则您不必担心可移植性。例如:在Java程序中,您可以访问本地环境、主机内存、一些操作系统特性等,并且代码仍然是可移植的。JVM提供了基础结构,本地调用可以提取特定于平台的信息。但是,可能有一些Java程序所需的平台特定功能是JVM或Java库没有提供的,因此您需要JNI和结果便携性受到损害。
2条答案
按热度按时间v8wbuo2f1#
正如您自己所提到的,
JVM
是平台相关的。就是这样-JVM
是平台相关的,但JAVA
不是。毕竟,JVM需要以某种方式在本机内运行,所以它必须特定于该平台。JAVA
是可移植的,因为编译后的代码是可移植的。例如,如果你与C
比较,C和Java源代码都是可移植的,这意味着它们都提供了源代码的可移植性。一旦你有了在Windows PC上编写的源代码,你可以将该代码转移到另一台Linux机器上,Java和C代码都可以在这两台机器上编译和运行。但是,对象代码的可移植性如何?
我们知道,当我们编译一个C代码时,它会产生机器可读的目标代码。所以,如果你在一台机器上编译一个C源代码,那么如果它们不兼容的话,目标代码可能不能在另一台机器上运行。但是,在JAVA的情况下,如果你在一台机器上编译一个Java源代码成字节码,那么这个字节码可以在任何运行JVM的机器上运行。
另一个有趣的事实是,通过成功编译Java源代码,我们还为一些未知的未来CPU生成了字节代码,这些CPU甚至不存在,因为JVM充当了一种虚拟CPU。
piah890a2#
最终用户使用 java 编写代码,这与平台无关。
JVM工程师负责创建JVM和JRE,并在其中创建用于不同平台的编译器和解释器。因此,免除了最终用户将其代码库移植到不同平台的担忧。编写一次,然后在所有平台上运行它(只要有可用于该平台的JVM)。
因此从最终用户(Java程序员)的Angular 来看,Java代码确实是
platform independent
,因为它可以在任何地方运行,而无需任何更改。即使JVM被移植到不同的平台,也确实是platform dependent
。与C/C++的差异:
与JVM一样,每个平台都有一个C/C++编译器负责
translating source to machine/processor
指令。这些机器指令可被处理器理解,例如:因此C/C编译器可用于它所支持的每个平台。然而,您可能需要在程序中链接到特定操作系统/平台的特定库。这将使您的程序特定于平台,并且需要通过链接到该库的另一个平台版本来针对该平台进行重写。**这成为C/C程序员的责任。此外,每个C/C++编译器具有其自己的特定于平台的变幻莫测的特性,这与JVM不同,JVM提供了下面详细描述的跨平台的一致视图。如果是Java**,您将无法利用平台特定性(除非JVM或Java库没有提供,但它们通常涵盖了大部分基础知识)。除非您在java源代码中使用
JNI
,否则您不必担心可移植性。例如:在Java程序中,您可以访问本地环境、主机内存、一些操作系统特性等,并且代码仍然是可移植的。JVM提供了基础结构,本地调用可以提取特定于平台的信息。但是,可能有一些Java程序所需的平台特定功能是JVM或Java库没有提供的,因此您需要JNI和结果便携性受到损害。注意:C/C++/Java都有源代码可移植性。但是JVM提供的是二进制可移植性。编译或解释的java代码运行在一个称为JVM(虚拟机)的抽象上。java程序员编写到该接口,而不是运行JVM的平台。这里有一个明确的分离。