Java虚拟机(JVM)为什么可以实现跨平台 甚至语言无关性?

目录

     什么是平台?

     JVM结构图

     Java源码编译机制

     如何实现跨平台?

     JVM、JDK、JRE的区别


引言

今天,我遇到了一个提问:为什么Java可以跨平台?
大多数人都知道Java可以跨平台得益于 JVM(java虚拟机)。
在这之前,我了解到的java跨平台得益于不同版本的jvm,那么它的底层原理是什么呢?
“一次编译,到处运行” 是Java的跨平台特性。像 C 、C++ 这样的编程语言没有它。
通过这篇文章,相信你会有进一步的了解。

什么是平台?

Java是一种可以跨平台的编程语言。首先,我们需要知道什么是平台。我们把CPU处理器与操作系统的整体叫平台。

众所周知,如果说电脑是人,那么CPU就是人脑,它不仅负责思维运算,还负责指挥和控制身体的各个部位。CPU有很多种。除了英特尔和AMD,还有上面提到的sun的SPARC,如IBM的PowerPC等。不同公司生产的这些CPU使用不同的指令集。

指令集是CPU中用来计算和控制计算机系统的一套指令的集合。

指令集分为精简指令集(RISC)和复杂指令集(CISC)。每个CPU都有自己的特定指令集。

要开发一个程序,我们必须首先知道程序运行在什么CPU上,也就是说,我们必须知道CPU使用的指令集。

操作系统是用户与计算机之间的接口软件。不同的操作系统支持不同的CPU。严格来说,不同的操作系统支持不同的CPU指令集。但问题是,原来的Mac操作系统只支持PowerPC,不能安装在英特尔上。我们该怎么办?因此,苹果必须重写其Mac操作系统来支持这一变化。最后,我们应该知道不同的操作系统支持不同的CPU指令集。现在windows、Linux、MAC和Solaris都支持Intel和AMD CPU指令集。

如果你想开发一个程序,首先应该确定:
1.CPU类型,即指令集类型;

2.操作系统;我们称之为软硬件平台的结合。也可以说“平台=CPU+OS”。而且由于主流操作系统支持主流CPU,有时操作系统也被称为平台

JVM结构图

Java虚拟机(JVM)为什么可以实现跨平台 甚至语言无关性?_第1张图片

Java源码编译机制

机器无法识别Java源代码。它需要编译成一个.Class字节码文件,由编译器在JVM中执行,然后由解释器进行解释和运行。
即:Java源文件(.java) – Java编译器 --> Java字节码文件 (.class) – Java解释器 --> 执行。

流程图如下:

Java虚拟机(JVM)为什么可以实现跨平台 甚至语言无关性?_第2张图片
      字节码文件(.class)是平台无关的。

     Java中字符只以一种形式存在:Unicode。字符转换发生在JVM和OS交界处(Reader/Writer)。

     最后生成的class文件由以下部分组成:

  • 结构信息。包括类文件格式的版本号以及各部分的编号和大小信息。
  • 元数据。它对应于Java源代码中的声明和常量信息。包含声明信息、域和方法声明信息以及类/继承的超类/实现接口的常量池
  • 方法信息。Java源代码中语句和表达式的相应信息。它包括字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息

如何实现跨平台?

通常,我们编写的Java源代码在编译后会生成一个Class文件,称为字节码文件。Java虚拟机负责将字节码文件翻译成特定平台下的机器代码,然后运行。简言之,java的跨平台就是因为不同版本的 JVM。换句话说,只要在不同的平台上安装相应的JVM,就可以运行字节码文件(.class)并运行我们编写的Java程序。在这个过程中,我们编写的Java程序没有做任何改动,只是通过JVM的“中间层”,就可以在不同的平台上运行,真正实现了“一次编译,到处运行”的目的。JVM是跨平台的桥梁和中间件,是实现跨平台的关键。首先将Java代码编译成字节码文件,然后通过JVM将其翻译成机器语言,从而达到运行Java程序的目的。因此,运行Java程序必须有JVM的支持,因为编译的结果不是机器代码,必须在执行前由JVM再次翻译。即使您将Java程序打包成可执行文件(例如。Exe),仍然需要JVM的支持。

注意编译的结果不是生成机器代码,而是生成字节码。字节码不能直接运行,必须由JVM转换成机器码。编译生成的字节码在不同的平台上是相同的,但是JVM翻译的机器码是不同的。

JVM、JDK、JRE的区别Java虚拟机(JVM)为什么可以实现跨平台 甚至语言无关性?_第3张图片

JVM------Java Virtual Machine.JVM是Java平台的基础,与实际机器一样,它有自己的指令集,并在运行时操作不同的内存区域。它相当于一台独立的机器。JVM的主要工作是向CPU指令集或相应的系统调用解释自己的指令集(即字节码),从而保护用户不受恶意程序的骚扰。JVM不关心上层java源文件,它关注的只是由源文件生成的类文件(.class文件)。

JRE----java runtime environment.光有JVM还不能让class文件执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。在JDK的安装目录里你可以找到jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和lib和起来就称为jre.

JDK—java development kit.

JDK的安装目录:

      bin: 最主要的是编译器(javac.exe)

      include: java和JVM交互用的头文件

      lib:类库

      jre: java运行环境

JDK用于Java程序开发,而JRE是一个只能运行class而没有编译的功能。

如有其它问题,欢迎大家留言,让我们一起讨论,一起学习,一起进步。

你可能感兴趣的:(java,jvm,编程语言)