[java基础]java跨平台的基础知识
1.Javac编译器
Javac编译器读取Java源代码,并将其编译成字节代码(.class格式),调用Javac的命令行示例如下:
C:>javac options filename.java
值得注重的是,和Java解释器不同,Javac编译器期望它正在编译的文件具有扩展名.java。其命令行如下表选项功能
- -classpath path 此选项用于设定路径,在该路径上Javac寻找需被调用的类。该路径是一个用分号分开的目录列表。
- -d Directory 此选项指定一个根目录。该目录用来创建反映软件包继续关系的目录数。
- -g 此选项在代码产生器中打开调试表,以后可凭此调试产生字节代码。
- -nowarn 此选项禁止编译器产生警告。
- -o 此选项告诉javac优化由内联的static、final以及privite成员函数所产生的码。
- -verbose 此选项告知Java显示出有关被编译的源文件和任何被调用类库的信息。
2.Java虚拟机
在windows系统下,通过编译器将源代码编译成windows能运行的形式exe。而java是先通过javac将java源代码编译成 .class 格式,然后在不同的平台上,java虚拟机将.class格式的代码转换成对应平台的指令代码。因而,java虚拟机相当于操作系统与java代码之间的中介。
实际上:java虚拟机用于解释class文件并通知要执行哪些操作。Java主要靠Java虚拟机(JVM)在目标码级实现平台无关性。JVM是一种抽象机器,它附着在具体操作系统之上,本身具有一套虚机器指令,并有自己的栈、寄存器组等。但JVM通常是在软件上而不是在硬件上实现。(目前,SUN系统公司已经设计实现了 Java芯片,主要使用在网络计算机NC上。另外,Java芯片的出现也会使Java更容易嵌入到家用电器中。)
JVM是Java平台无关的基础,在JVM上,有一个Java解释器用来解释Java编译器编译后的程序。Java编程人员在编写完软件后,通过Java编译器将Java源程序编译为JVM的字节代码。任何一台机器只要配备了Java解释器,就可以运行这个程序,而不管这种字节码是在何种平台上生成的(过程如图1所示)。另外,Java采用的是基于IEEE标准的数据类型。通过JVM保证数据类型的一致性,也确保了Java的平台无关性。
java跨平台,但是java虚拟机不跨台。
![clip_image002[8] clip_image002[8]](https://images2015.cnblogs.com/blog/739092/201604/739092-20160406192534859-1522811236.gif)
3.java的解释器
java的解释器只是一个基于虚拟机jvm平台的程序。 如果把Java源程序想象成我们的C++源程序,Java源程序编译后生成的字节码就相当于C++源。程序编译后的80x86的机器码(二进制程序文件),JVM虚拟机相当于80x86计算机系统,Java解释器相当于80x86CPU。在 80x86CPU上运行的是机器码,在Java解释器上运行的是Java字节码。
Java解释器相当于运行Java字节码的“CPU”,但该“CPU”不是通过硬件实现的,而是用软件实现的。Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。当前,并不是在所有的平台下都有相应Java解释器程序,这也是Java并不能在所有的平台下都能运行的原因,它只能在已实现了Java解释器程序的平台下运行。
Java字节码的两种执行方式
1、即时编译方式:解释器先将字节码编译成机器码,然后再执行该机器码。
2、解释执行方式:解释器通过每次解释并执行一小段代码来完成Java字节码程序的所有操作。