1、什么是JVM
大多数人知道JVM让java跨平台,但跨平台是怎么一回事呢?首先得了解一下。
跨平台:对于计算机而言,只认识一种语言,也就是0、1 序列组成的机器指令,当使用C/C++等高级程序语言写程序时,其实这些语言,是比较贴近人类可阅读的文法,也就是比较接近英语文法的语言,这是为了方便人类阅读与撰写,计算机其实看不懂这些C/C++这类语言,为了讲C/C++翻译为0、1序列组成的机器指令,必须要有个翻译员。担任翻译员工作的就是编译程序。
问题在于,每个平台认识的0、1序列并不一样,某个指令在windows上也许的0101,但在linux上是1010,因此必须使用不同的编译程序为不同的平台编译出可以执行的机器码(Bytecode) 在windows上编译好的程序,不能直接拿到Linux等其他平台执行,也就是说应用程序无法达到 “编译一次,到处执行” 的夸平台目的。
Java原始码扩展为 .java ,经过编译程序翻译为扩展名为.class的位码,如果想要执行位码文档,目标平台必须安装JVM。JVM会将位码编译为相依与平台的机器码。
不同平台必须安装专属该平台的JVM,这就好比你将中文(.java) ,Java编译程序将你翻译为英语(.class),这份英语文件到各个国家之后,再由当地看得懂英文的人(JVM)翻译为当地的语言(机器码)
所以JVM担任的职责之一就是当地的翻译员,将位码文档翻译为当时平台看得懂的0/1序列,有了JVM,你的java程序就可以达到“编译一次,到处执行”的跨平台目的。
对于Java程序而言,只认识一种操作系统,就是JVM,位码文档(扩展名为.class的文档)就是JVM的可执行文件
2、区分JRE、与JDK
下面来看这样一段代码:
System.out.println("Hello World");
这条程序的目的是:请系统(System)的输出装置(out)显示一行(println)Hello World
更深的理解为:使用System类(class)上out对象(Object)的println()方法
谁来操作System.java?谁来编译为.class?可能是Sun、IBM、Apache,无论如何,这些厂商必须根须相关的JSP标准文件将链接库开发出来,撰写的第一个java程序,在Sun、IBM、Apache等厂商开发出来的JVM上运行时,应用如System这些标准API,才有可能轻易地运行在不同的平台。
Java SE API涵盖了格式常样的链接库,像是通用的集合,输入/输出、联机数据库的JDBC。撰写窗口程序的AWT与Swing等,这些都是在各个JSR标准文件规范之中。
Java Runtime Environment就是java执行环境,简称JRE,包括Java SE API 与JVM 。只要使用Java SE API中的链接库,在安装有JRE的计算机上就可以直接运行,无需额外在程序用再包装链接库,而可以由JRE直接提供。
要在java中撰写java程序,使用编译程序编译为.class文档,那么像编译程序这样的工具是由谁提供呢?答案就是JDK。
JDK包括了javac、appletviewer、javadoc等工具程序,对于要开发java程序的人,必须要安装JDK,这样才有这些工具程序可以直接使用。