Java Byte代码是编译Java源代码和Java虚拟机理解的语言。与必须为每种不同类型的计算机专门编译的编译语言不同,Java程序只需转换一次字节码,然后就可以在Java虚拟机存在的任何平台上运行。
我可以理解,一旦编译了java,类就可以从任何机器上运行,因为编译后的类可以被任何机器理解。
我的问题是:为什么有两种类型的jdk呢?(x86,x64)
发布于 2014-02-20 15:48:45
Java虚拟机本身就是需要在硬件架构和操作系统之上运行的应用程序,它们很可能不是在Java中实现的。
这就是流行的Java HotSpot虚拟机 (Oracle的默认实现)的情况,它主要是用C/C++实现的。
这意味着您需要为您打算使用它的每个硬件体系结构和操作系统提供编译版本,因此这说明了32位和64位硬件体系结构都有它的版本。
其他JVM实现也是如此,如JRockit、IBM J9、Azul系统祖鲁和可能还有许多其他人。
除了Java之外,还可以以这种方式开发其他辅助程序 (Java ),这通常是供程序员开发应用程序的一部分。这就是编译器(javac)、文档生成器(javadoc)、RMI编译器(rmic)、Java反汇编程序(Java反汇编器)、(javap)等工具的情况。
因此,这些JDK工具还需要一个与硬件相关的实现。这就是为什么在下载JDK时您可以选择的原因。
--编辑--
解决“可移植性”主题的问题
这取决于你所说的“可移植性”是什么意思。如果您指的是Java的沃拉 (编写一次,在任何地方运行),那么它必须通过像Java、Python或Ruby这样的虚拟机。但是像C/C++这样的语言可以编译成机器代码,因此,它们不是通过虚拟机运行的,而是由硬件本身运行的。这并不意味着它们是不可移植的,您可以以可以在多个体系结构中运行的方式编写代码,只是不能使用相同的二进制文件。您必须为每一种情况重新编译,因为程序必须以特定硬件/os理解的方式编写/编译。
这一差距是虚拟机想要弥补的。
现在,可移植性不仅仅意味着使用相同的二进制文件。即使使用Java,您也可能编写不可移植的代码,可能是因为您使用了依赖于操作系统的特性,或者是因为您错误地使用文字(即Linux /和\)编程路径,等等。
发布于 2014-02-20 15:44:14
JDK有两种以上的类型。每种类型的JDK都是为特定的平台、Intel x86、x64、ARM等编译的。尽管它们是为不同的平台编写的,但它们所做的事情是相同的。需要这么多类型,因为通常不能在一个平台上运行JDK (比如不能在x86上运行JDK )。
发布于 2014-02-20 15:53:19
java语言是可移植的,使它们可移植所需的二进制文件不是可移植的。例如,jvm和javac都是不可移植的。
如果javac是用java编写的,那么javac太慢了,而且您在编写没有javac的javac时遇到了鸡和蛋的问题--所以它通常是用c或c++编写的,这使得它不可移植。
另外,jvm正在做的工作是获取便携字节码,并将其转换为您正在运行的特定机器的特定非便携代码,因此它不能移植。
https://stackoverflow.com/questions/21912467
复制相似问题