java程序编译后会产生字节码还是机器码?

Python010

java程序编译后会产生字节码还是机器码?,第1张

Java编译后是字节码,C/C++以前全都是是机器码

电脑只能运行机器码。Java在运行的时候把字节码变成机器码。

C/C++在编译的时候直接编译成机器码。

不过现在微软的Visual Studio C++ 2005以后的C++也可以编译成字节码,用CLR运行是转换成机器码(和Java差不多)。

Java 最初设计的时候,跨平台就是一个重要的目标,所谓「一次编写,到处运行」。而为了实现跨平台,就决定了不能像 c,c++ 那样直接把源代码编译成可执行文件,因为不同cpu,不同操作系统的指令封装格式是不一样的。

而为了实现跨平台,一般有两种方案,第一是直接执行源代码,第二是像现在 Java 这样编译成一个中间格式文件,即 class 文件,这两种方案各有优劣,现在说一下编译成中间代码的优点,class 文件相比较于 Java  源码文件,有两个优点:

class 文件内容设计的更加紧凑,方便 JVM 执行,也方便网络传输(最初 JAVA 的一个重要应用就是 applet,在当年网络不是很放大的年代,程序的体积还是要挺重要的)

方便其它语言执行。现在 JVM 上就有除了 Java 外大量的第三方语言,比如 scala,Clojure 等等。其它语言只要编译成 class 文件即可像 Java 一样在 JVM 上执行。

Java的Class文件是有8个字节为基础的字节流构成的,这些字节流之间都严格按照规定的顺序排列,并且字节之间不存在任何空隙,对于超过8个字节的数据,将按

照Big-Endian的顺序存储的,也就是说高位字节存储在低的地址上面,而低位字节存储到高地址上面,其实这也是class文件要跨平台的关键,因为

PowerPC架构的处理采用Big-Endian的存储顺序,而x86系列的处理器则采用Little-Endian的存储顺序,因此为了Class文

件在各中处理器架构下保持统一的存储顺序,虚拟机规范必须对起进行统一。

这些能被机器直接识别的就是二进制。