我刚开始学习Java,但对平台独立性这个主题感到困惑。
“独立”是否意味着Java代码应该在任何计算机上运行并且不需要安装特殊软件?但是,JVM必须存在于计算机中。
例如,我们需要拥有Turbo C编译器才能编译C / C ++源代码然后执行它。机器必须具有C编译器。
当Java被描述为“平台无关”时,请问是什么意思?
我刚开始学习Java,但对平台独立性这个主题感到困惑。
“独立”是否意味着Java代码应该在任何计算机上运行并且不需要安装特殊软件?但是,JVM必须存在于计算机中。
例如,我们需要拥有Turbo C编译器才能编译C / C ++源代码然后执行它。机器必须具有C编译器。
当Java被描述为“平台无关”时,请问是什么意思?
.exe
文件。它最多需要一个运行时库(在.dll
文件中),而不是整个编译器
Answers:
通常,编译后的代码是CPU“执行”程序所需的确切指令集。在Java中,编译后的代码是“虚拟CPU”的一组精确指令,在每台物理计算机上都必须运行相同的指令。
因此,从某种意义上讲,Java语言的设计人员认为该语言和编译后的代码将独立于平台,但由于该代码最终必须在物理平台上运行,因此他们选择将所有与平台相关的代码放入JVM。
JVM的这一要求与您的Turbo C示例相反。使用Turbo C,编译器将生成依赖于平台的代码,并且不需要进行类似JVM的工作,因为编译后的Turbo C程序可以直接由CPU执行。
使用Java,CPU执行依赖平台的JVM。然后,此运行中的JVM将执行与平台无关的Java字节码,前提是您具有可用于执行的JVM。您可能会说,编写Java代码,不是编写要在物理机上执行的代码,而是编写要在Java虚拟机上执行的代码。
所有这些Java字节码可在所有Java虚拟机上工作的唯一方法是,针对Java虚拟机的工作方式制定了相当严格的标准。这意味着无论您使用什么物理平台,都保证Java字节码与JVM接口的部分只能以一种方式工作。由于所有JVM的工作原理完全相同,因此相同的代码在任何地方都可以完全相同,而无需重新编译。如果您无法通过测试以确保其相同,则不允许将您的虚拟机称为“ Java虚拟机”。
当然,有一些方法可以打破Java程序的可移植性。您可以编写一个程序,查找仅在一个操作系统上找到的文件(例如,cmd.exe)。您可以使用JNI,它可以有效地将已编译的C或C ++代码放入一个类中。您可以使用仅适用于特定操作系统的约定(例如假设“:”分隔目录)。但是可以保证,除非您做特别特别的事情(例如JNI),否则永远不必为其他计算机重新编译程序。
Technical Article on How java is platform indepedent?
在进行详细介绍之前,首先您必须了解平台的含义是什么?平台由计算机硬件(主要是微处理器的体系结构)和操作系统组成。平台=硬件+操作系统
与平台无关的任何内容都可以在任何操作系统和硬件上运行。
Java是平台独立的,因此Java可以在任何操作系统和硬件上运行。现在的问题是,平台如何独立?
这是因为操作系统不依赖字节码的魔力。当Java编译器编译任何代码时,它会生成字节代码而不是机器本机代码(与C编译器不同)。现在,此字节代码需要一个解释器才能在计算机上执行。该解释器是JVM。因此,JVM读取(独立于机器的)字节代码并执行它。不同的JVM是为不同的OS设计的,字节码能够在不同的OS上运行。
如果使用C或C ++(非平台无关的语言),则编译器将生成OS依赖的.exe文件,因此当我们在另一个OS上运行此.exe文件时,该文件将无法运行,因为该文件是OS依赖的,因此与另一个操作系统。
最后,一个独立的中间操作系统字节代码使Java平台独立。
这意味着Java程序员(理论上)不需要知道机器或OS的详细信息。这些细节确实存在,并且JVM和类库可以处理它们。此外,与C形成鲜明对比的是,Java二进制文件(字节码)通常可以移至完全不同的系统,而无需修改或重新编译。
Java具有JVM(Java虚拟机),因此与平台无关。让我们用一个真实的例子来说明它。假设您有家人自由。但为什么?
因为您非常了解他们,他们也了解您。但是,您对我的家人没有自由。因为你不认识他们,他们也不认识你。但是,如果我是您的朋友,并且在可以向您介绍我的家人时,您就可以与他们自由交谈。
以类似的方式,如果您是代码,而我是JVM。另外,您的家庭是Windows平台,而我的家庭是Linux平台。如果您使用的是C或其他平台相关的语言,则您只会认识家庭成员,反之亦然。这就是为什么只有编写您的平台才能知道该代码并会对其进行支持的原因。但是,如果您是JAVA代码,并且当您来到我家时,也就是。Linux平台,如果您找到了我JVM,那么我可以向您介绍我的家庭Linux平台,您将可以与它进行交互。
对于平台相关的语言,没有像JVM这样的朋友可以将自己介绍给任何平台系列。这就是Java与平台无关的方式。:)
在c / c ++中,使用编译器进行编译后的源代码(c程序文件)被直接转换为本机代码(对于您在其上编译代码的特定机器可以理解)。因此,c / c ++的编译代码无法在不同的OS上运行。
但是在Java的情况下:java(.java)的源文件将使用JAVAC编译器(存在于JDK中)进行编译,该文件提供了字节码(.class文件),该字节码对于任何安装在任何OS(物理系统)上的JVM都可以理解。
在这里,我们需要为要在其中运行代码的不同操作系统使用不同的JVM(取决于平台),但是.class文件(编译后的代码/中间代码)保持不变,因为安装的任何JVM都可以理解。在任何操作系统上。
在c / c ++中:仅源代码与机器无关。在Java中:源代码和编译后的代码均与平台无关。
这使得Java平台(机器)独立。
Java不是平台独立的,因为它在JVM上运行。话虽这么说,您可以通过针对一台抽象机进行编程来获得平台独立性,该抽象机在大多数常见的OS平台(和某些嵌入式设备)上都有具体的实现。
一个相关的想法是许多操作系统中存在的硬件抽象层,允许同一操作系统在不同的硬件上运行。
在您最初的问题中,Turbo C与javac程序类似,而JVM是OS / HAL。
独立不是意味着Java代码应该可以在任何计算机上运行并且不需要安装特殊软件(在这种情况下,必须在计算机中安装JVM)吗?
使用Java,您可以在Windows上编译源代码,并且可以在运行JVM的任何平台上执行(解释)编译后的代码(准确地说是字节码)。因此,是的,您需要一个JVM,但是JVM可以运行任何已编译的代码,该已编译的代码与平台无关。
换句话说,您既具有源代码的可移植性,又具有编译后的代码的可移植性。
像,例如,我们需要拥有Turbo C编译器才能编译C / C ++源代码然后执行它。机器必须具有C编译器。
该计算机不必具有C编译器,而该计算机必须使用特定于平台的二进制文件。使用C或C ++,编译后的代码特定于每种体系结构,并且与平台无关。
换句话说,使用C / C ++,您可以具有源代码的可移植性(需要一定的纪律),而不能具有已编译代码的可移植性:您需要将每种体系结构重新编译为平台特定的二进制文件。
只是有关JVM和JIT编译的讨论的附注。这是与C#和CLR相同的原理,在某种程度上在Python中也是如此,并且当有人说代码“直接在硬件上运行”时,这实际上是正确的,因为已编译的指令将能够利用优化在机器/ CPU上正在运行。因此,即使模块的初始编译相当慢,下一次运行该模块时,正在执行的代码也将以本机速度运行,因此可以直接在硬件上运行。
Javac –将源代码转换为字节码的编译器。 JVM-将字节码转换为机器语言代码的解释器。
众所周知,java都是基于编译和解释器的语言。编译完Java代码(也称为源代码)后,它将转换为本地代码(称为BYTE CODE),该代码可移植并且可以在所有操作系统上轻松执行。生成的字节码基本上以十六进制格式表示。此格式在每个平台上都是相同的,无论是Solaris工作站还是Macintosh,Windows或Linux。编译后,解释器读取生成的字节码并根据主机将其翻译。。字节码由Java虚拟机解释,该虚拟机可用于我们安装的所有操作系统。因此要将Java程序移植到新平台,所需要做的就是移植解释器和某些库例程。
希望能帮助到你!!!
当我们编译C源数据时,它将生成可被当前操作系统理解的本机代码。当我们将此源代码移至其他操作系统时,操作系统无法理解它,因为本机代码意味着表示形式从OS更改为OS,因此C或C ++依赖于平台。
现在以Java为例,编译后我们得到的是字节码而不是本机代码。当我们运行字节码时,它将在JVM的帮助下转换为本地代码,然后将其执行。
因此,Java与平台无关,而C或C ++与平台无关。
很好的问题,但是当编译器将源代码更改为中间本机字节代码时,通过在一次整体检查(如果找到)后给出错误,该程序将程序转换为字节代码,然后程序需要一个解释器,会逐行检查程序并将其直接更改为机器代码或目标代码,并且由于某些安全原因,默认情况下每个操作系统默认都没有Java解释器,因此您需要不惜一切代价让jvm在该不同的OS平台上运行它如您在这里所说的独立性意味着该程序可以在任何操作系统上运行,例如unix,mac,linux,windows等,但这并不意味着每个操作系统都可以在没有jvm的情况下运行代码。和实例如果我通过更改PC的配置来进行升级,那么您可以拥有一个甚至可以打开字节码的类加载器,那么您还可以执行Java字节码,小程序等。-by nimish :)祝您好运
{App1(Java代码)------> App1byteCode} ........ {(JVM + MacOS)帮助与App1,App2,App3一起使用}
{App2(Java代码)-----> App2byteCode} ........ {(JVM + LinuxOS)帮助与App1,App2,App3一起使用}
{App3(Java代码)-----> App3byteCode} ... {(JVM + WindowsOS)帮助与App1,App2,App3一起使用}
这是怎么回事?
回答:ByteCode
由于JVM与OS同步,因此JVM具有根据底层OS进行读取和响应的能力。
因此,我们发现,我们需要具有与平台同步的JVM。
但是最主要的是程序员不必了解平台的特定知识,也不必在意某个特定平台的情况下对其应用程序进行编程。
Java编写程序的这种灵活性-ByteCode
可以在任何计算机上编译并运行(是的,需要具有平台依赖的JVM才能执行),这使得Java平台独立。
当我们编译Java文件时,将生成该程序的.class文件,该.class文件包含字节码。该字节码与平台无关,字节码可以在使用Java虚拟机的任何操作系统上运行。平台独立性不仅与操作系统有关,还与硬件有关。当您在32位的16位计算机上运行Java应用程序时,不必担心会根据目标系统转换数据类型。您可以在任何体系结构上运行您的应用程序,并且每种应用程序都将获得相同的结果。
编辑:不太。请参阅下面的评论。
Java不能直接在任何东西上运行。它需要由JVM转换为字节码。
因为JVM适用于所有主要平台,所以这使得Java平台无关的JVM。