我刚刚开始学习Java,我对平台独立性这个话题感到困惑。
“独立”是否意味着Java代码应该在任何机器上运行而不需要安装特殊软件?然而,JVM需要存在于机器中。
例如,我们需要使用Turbo C编译器来编译C / C ++源代码然后执行它。机器必须有C编译器。
当Java被描述为“独立于平台”时,有人可以说是什么意思吗?
答案 0 :(得分:104)
通常,编译的代码是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)。
答案 1 :(得分:54)
Technical Article on How java is platform indepedent?
在进入细节之前,首先你必须了解平台的意思是什么? 平台由计算机硬件组成(主要是微处理器的架构) 和OS。 平台=硬件+操作系统
任何独立于平台的东西都可以在任何操作系统和硬件上运行。
Java是独立于平台的,因此java可以在任何操作系统和硬件上运行。 现在的问题是它是如何独立于平台的呢?
这是因为Byte Code的魔力是OS独立的。 当java编译器编译任何代码时,它会生成字节代码而不是机器本机代码(与C编译器不同)。现在这个 字节代码需要在机器上执行解释器。这个解释器是JVM。所以JVM读取那个字节代码(即机器独立) amd执行它。 不同的JVM是针对不同的操作系统而设计的,字节码可以在不同的操作系统上运行。
对于C或C ++(不是平台独立的语言)编译器生成操作系统依赖的.exe文件,所以当我们 在另一个操作系统上运行此.exe文件它将无法运行,因为该文件是操作系统依赖的,因此与另一个操作系统不兼容。
最后,一个中间OS独立的字节代码使java平台独立。
答案 2 :(得分:25)
这意味着Java程序员(理论上)不需要了解机器或操作系统的详细信息。这些细节确实存在,JVM和类库处理它们。此外,与C形成鲜明对比的是,Java二进制文件(字节码)通常可以移动到完全不同的系统而无需修改或重新编译。
答案 3 :(得分:8)
不,这是相反的方式。这是因为您使用Java程序独立的虚拟机。
虚拟机不是独立的,您必须安装专门为您的系统类型制作的虚拟机。虚拟机在操作系统之上创建一个独立的平台。
答案 4 :(得分:7)
JVM是一个“模拟机器”,可以安装在不同的系统上。通过这种方式,相同的Java代码可以在不同的系统上运行,因为它依赖于JVM,而不依赖于操作系统本身。
也就是说,这允许程序员与虚拟系统(JVM)进行通信并利用其功能,而不是特定的机器和OS功能。 由于Java仅依赖于JVM,因此它与平台无关(如果平台安装了JVM)。
简而言之,Java本身并不是平台独立的,它需要为应该运行的所有系统安装JVM。但是,它将在安装了JVM的所有系统上运行。
答案 5 :(得分:4)
Java与平台无关,因为它具有JVM(Java虚拟机)。让我们用现实生活中的例子来说明它。让我们假设您的家人可以自由。但为什么?
因为你了解他们并且他们也了解你。但是,你对我的家人没有自由。因为你不了解他们,他们也不认识你。但是,如果我是你的朋友,当我可以把你介绍给我的家人时,你就可以自由地与他们交谈。
以类似的方式,如果你是一个代码,我是一个JVM。此外,您的家庭是Windows平台,我的是Linux平台。如果您是C语言或其他依赖于平台的语言,您只知道您的家庭成员,反之亦然。这就是为什么只有您编写的平台才知道Code并支持它。但是,如果你是一个JAVA代码,当你来到我的家庭时。 Linux平台,如果你找到我,JVM,那么我可以向你介绍我的家庭,Linux平台,你就可以与它进行交互。
对于依赖于平台的语言,没有像JVM这样的朋友可以将自己介绍给任何平台系列。这就是Java与平台无关的方式。 :)
答案 6 :(得分:3)
JVM从具体平台中抽象出来。您的程序仅依赖于JVM,并且由于JVM可用于Windows和Linux等不同平台,因此您的程序与平台无关(但是jvm依赖)。
答案 7 :(得分:3)
在c / c ++中,使用编译器编译后的源代码(c程序文件)直接转换为本机机器代码(这对于编译代码的特定机器是可以理解的)。因此,c / c ++的编译代码无法在不同的操作系统上运行。
但是在Java的情况下:java(.java)的源文件将使用JAVAC编译器(存在于JDK中)编译,该编译器提供Byte代码(.class文件),这对于安装在任何OS上的任何JVM都是可理解的(物理系统)。
这里我们需要为我们想要运行代码的不同操作系统提供不同的JVM(这是平台相关的),但.class文件(编译代码/中间代码)保持不变,因为任何一个都可以理解任何操作系统上安装的JVM。
在c / c ++中:只有源代码与机器无关。 在Java中:源代码和编译代码都是独立于平台的。
这使Java平台(机器)独立。
答案 8 :(得分:3)
java不是平台独立,本身就是一个平台,基于java平台运行的那个平台,但java平台本身是平台依赖的
答案 9 :(得分:2)
简单来说:
Java编程语言是平台无关的。
JVM 依赖于平台
答案 10 :(得分:2)
1:jvm
(即java虚拟机)是一个程序集合,其中包含许多文件,这些文件提供文件夹上存在的各种函数(即中等格式的程序集合),称为packages
。 jvm
有助于不在o/s
上重载,只有它本身有助于仅执行.class
文件或java应用程序。它有助于在赞美后使其等级为中等格式。 java编译器然后它提供字节代码(.class文件)reprsentation,它不是特定于o/s
和processor
。
2:在收到frm字节代码后,jvm将字节代码发送到.exe
文件,以便proccessor可以理解和解析每个函数的内存分配。
3:在控制完成执行后,jvm还会从ram释放内存位置。
答案 11 :(得分:2)
JVM依赖于os。 对于每个os JVM都不同。
“。class”对于所有JVM都是相同的。 所以,每个JVM都能理解“.class”文件数据。
Windows依赖JVM为Windows提供Windows依赖指令 linux依赖JVM为Linux提供linux依赖指令。
就像其他操作系统一样。 所以,java可以在任何操作系统上运行。
这就是为什么java是独立的。
答案 12 :(得分:1)
不独立意味着Java代码应该能够在任何机器上运行,并且不需要安装特殊软件(在这种情况下JVM必须存在于机器中)?
使用Java,您可以在Windows上编译源代码,并且可以在运行JVM的任何平台上执行(解释)编译代码(准确的字节码)。所以是的,你需要一个JVM,但JVM可以运行任何已编译的代码,编译后的代码独立于平台。
换句话说,您既具有源代码的可移植性,又具有编译代码的可移植性。
例如,我们需要使用Turbo C Compiler来编译C / C ++源代码,然后执行它。机器必须有C编译器。
机器不必具有C编译器,机器必须使用特定于平台的二进制文件。使用C或C ++,编译代码特定于每个体系结构,它是独立于平台的。
换句话说,使用C / C ++,您可以获得源代码的可移植性(有一些规则)但不能编译代码的可移植性:您需要为每个体系结构重新编译为特定于平台的二进制文件。
答案 13 :(得分:1)
JVM将取决于平台
但无论它产生什么,都将与平台无关。 [我们称之为字节码或者只是你可以说......类文件]。为什么Java被称为独立于平台
您可以在Mac上以及在Windows上运行相同的类文件,但它需要JRE。
答案 14 :(得分:1)
Java不是平台独立的,因为它在JVM上运行。话虽如此,您可以通过针对单个抽象机器的编程获得平台独立性,该机器在大多数常见操作系统平台(以及一些嵌入式设备)上具有具体实现。
一个相关的想法是许多操作系统中存在的硬件抽象层,它允许相同的操作系统在不同的硬件上运行。
在原始问题中,Turbo C与javac程序类似,JVM是OS / HAL。
答案 15 :(得分:0)
关于JVM和JIT编译的讨论的旁注。 这与C#和CLR的原理相同,在某种程度上也在Python中,当有人说代码“直接在硬件上运行”时,实际上已经编译的指令将能够利用优化在机器/ cpu上运行它。因此,即使模块的初始编译速度相当慢,下次运行此模块时,正在执行的代码也会以本机速度运行,因此可以直接在硬件上运行。
答案 16 :(得分:0)
很好的问题但是当源代码被编译器改成中间本地字节代码时,它通过在整个检查之后立即(如果找到)给出错误然后程序需要将程序转换为字节代码一个解释器,它将逐行检查程序并直接将其更改为机器代码或目标代码,并且默认情况下每个操作系统都没有java解释器,因为某些安全原因所以你需要不惜一切代价运行jvm来运行它你所说的不同的操作系统平台独立性意味着程序可以在任何操作系统中运行,如unix,mac,linux,windows等,但这并不意味着每个操作系统都能运行代码而不需要jvm这样说明,实现和实例,如果我通过改变你的电脑的配置前进,以便你可以有一个甚至可以打开字节代码的类加载器,那么你也可以执行java字节码,小程序等。 -by nimish :)祝你好运
答案 17 :(得分:0)
{App1(Java code)------> App1byteCode} ........ {(JVM + MacOS)帮助工作 与App1,App2,App3}
{App2(Java Code)-----> App2byteCode} ........ {(JVM + LinuxOS)帮助工作 与App1,App2,App3}
{App3(Java Code)-----> App3byteCode} ........ {(JVM + WindowsOS)帮助工作 与App1,App2,App3}
这是怎么回事?
Ans:JVM能够读取ByteCode
并根据底层操作系统响应响应当JVM与操作系统同步时。
所以我们发现,我们需要JVM与Sync with Platform。
但主要的是,程序员不必了解平台的具体知识,并编写应用程序,并牢记一个特定的平台。
Java编写程序的灵活性---编译到ByteCode
并在任何机器上运行(是的,需要使用Platform DEPENDENT JVM来执行它)使Java平台独立。
答案 18 :(得分:0)
当我们编译C源数据时,它会生成当前操作系统可以理解的本机代码。 当我们将此源代码移动到另一个操作系统时,操作系统无法理解它,因为本机代码意味着表示从O.S变为O.S. 所以C或C ++是依赖于平台的。
现在在java的情况下,在编译之后我们得到字节代码而不是本机代码。当我们运行字节码时, 它在JVM的帮助下转换为本机代码,然后执行。
因此,Java与平台无关,C或C ++与平台无关。
答案 19 :(得分:0)
Javac - 将源代码转换为字节代码的编译器。 JVM - 将字节代码转换为机器语言代码的解释器。
我们知道java是编译** r& **口译员基础语言。一旦编译了java代码也称为源代码,它就会被转换为本地代码,称为BYTE CODE,它是便携式的。可以在所有操作系统上轻松执行。生成的字节代码基本上以十六进制格式表示。在Solaris工作站或Macintosh,Windows或Linux的每个平台上,此格式都是相同的。在编译之后,解释器读取生成的字节代码&根据主机进行翻译。 。 字节代码由Java虚拟机解释,可与我们安装的所有操作系统一起使用。因此,要将Java程序移植到新平台,只需移植解释器和一些库例程。
希望它有所帮助!!!
答案 20 :(得分:0)
Java在java开发人员方面与平台无关,但最终用户并非如此,他们需要具有平台相关的JVM才能运行java代码。基本上,当编译java代码时,生成通常与平台无关的字节代码。因此,开发人员必须为整个平台系列编写单个代码。但是,对于需要安装JVM以运行此编译代码的最终用户来说,这种好处令人头疼。这个JVM对于每个平台都不同。因此,依赖性仅对最终用户生效。
答案 21 :(得分:0)
字节码不是平台形式独立的,而是它的JVM使字节码独立。字节码不是匹配代码。字节码是紧凑的数字代码,常量和引用(通常是数字地址),它们编码程序对象的类型,范围和嵌套深度等内容的解析和语义分析结果。因此,它们比直接解释源代码具有更好的性能。字节码需要在执行之前解释,这总是由JVM解释器完成。
答案 22 :(得分:-1)
当我们编译Java文件时,将生成该程序的.class文件,该.class文件包含字节码。该字节码与平台无关,字节码可以在使用Java虚拟机的任何操作系统上运行。平台独立性不仅与操作系统有关,还与硬件有关。 在32位的16位计算机上运行Java应用程序时,不必担心会根据目标系统转换数据类型。您可以在任何体系结构上运行您的应用程序,并且每种应用程序都将获得相同的结果。
答案 23 :(得分:-2)
编辑:不完全。请参阅以下评论。
Java不直接运行任何东西。它需要由JVM转换为字节码。
因为所有主要平台都存在JVM,所以这使得Java平台独立于JVM。