Java Byte Code是Java源代码编译的语言 Java虚拟机可以理解。与编译语言不同 必须为每种不同类型的计算机专门编译, Java程序只需要在之后转换为字节代码一次 它可以在Java虚拟机的任何平台上运行 存在。
我可以理解,一旦java被编译,类就可以从任何机器运行,因为编译的类可以被任何机器理解。
我的问题是:为什么有两种类型的jdk呢? (x86,x64)
答案 0 :(得分:2)
JDK有两种以上的类型。每种类型的JDK都是针对特定平台,Intel x86,x64,ARM等进行编译的。尽管它们是针对不同平台编写的,但它们也是如此。需要这么多类型,因为通常你不能在另一个平台上运行JDK(比如你不能在x86上为ARM运行JDK)。
答案 1 :(得分:2)
Java虚拟机本身就是需要在硬件架构和操作系统之上运行的应用程序,而且很可能它们本身并不是用Java实现的。
流行的Java HotSpot Virtual Machine(Oracle的默认实现)就是这种情况,它主要是用C / C ++实现的。
这意味着您需要为其打算使用它的每个硬件体系结构和操作系统编译它的版本,这样才能解释32位和64位硬件体系结构的版本。
其他JVM实现也是如此,例如JRockit,IBM J9,Azul Systems Zulu,可能还有many others。
Other helper programs除了Java虚拟机之外,通常包括程序员开发应用程序作为JDK(Java开发工具包)的一部分,也可以用这种方式开发。这就是编译器(javac),文档生成器(javadoc),RMI编译器(rmic),Java反汇编程序(javap)等工具的情况。
因此,那些JDK工具还需要依赖硬件的实现。这就是为什么在下载JDK时可以选择的原因。
<强> - 编辑 - 强>
解决有关“可移植性”主题的问题
这取决于“便携性”的含义。如果你的意思是Java WORA(一次编写,在任何地方运行),那么它必须通过Java,Python或Ruby等虚拟机。但是像C / C ++这样的语言会编译成机器代码,因此,它们不是通过虚拟机运行,而是通过硬件本身运行。这并不意味着它们不可移植,您可以编写可以在多个体系结构中运行的代码,只是您不能使用相同的二进制文件。您必须为每种情况重新编译,因为程序必须以特定硬件/操作系统理解的方式编写/编译。
这个差距是虚拟机打算关闭的。
现在,可移植性不仅仅意味着使用相同的二进制文件。即使使用Java,您也可能编写不可移植的代码,可能是因为您使用了操作系统相关的功能,或者因为您使用文字错误地编写了路径(即Linux /
vs Windows \
)等等。
答案 2 :(得分:0)
java语言是可移植的,但是使它们可移植所需的二进制文件不是。例如,jvm和javac都是不可移植的。
如果javac是用java编写的,那么javac就太慢了,而且如果你在没有javac的情况下编写一个javac就会遇到鸡蛋和鸡蛋的情况 - 所以它通常用c或c ++编写,使它不可移植。
此外,jvm正在进行可移植字节码的工作,并将其转换为您运行的特定机器的特定非可移植代码,因此它不可移植。
答案 3 :(得分:0)