众所周知,Java是跨平台的编程语言,那它是如何实现跨平台的呢?
本文将带着以下几个问题进行探索
1. 什么是平台?
对于Java的运行环境来说,这里的平台分为软件平台和硬件平台。
软件平台有桌面PC电脑使用的Windows,Mac,Linux和其他Unix系列变种的操作系统
也有当前流行的移动设备操作系统,如Window CE,Window Phone,IOS,Android。
硬件平台有台式机电脑,笔记本电脑,手机和其他嵌入式设备等,硬件平台中有个核心组件是CPU。
CPU的种类有Intel,AMD,SUN的Sparc, IBM的PowerPC等,这些各个公司生产的CPU所使用的指令集各有差异。
指令集就是cpu中用来计算和控制计算机系统的一套指令的集合。
指令集又分为精简指令集(RISC)与复杂指令集(CISC),每种cpu都有其特定的指令集。
开发程序,首先要知道该程序在什么CPU上运行,也就是要知道CPU所使用的指令集。
为此,我们可以将Java运行的平台定义为以CPU为核心的硬件平台+与硬件平台相匹配的操作系统。
2. 各个平台环境不同,cpu指令集不同,如何做垮平台?
做过C代码开发的同学都知道,C代码编译后生成的机器码是和平台相关的,Windows上编译的exe文件不能在Linux上运行。
究其根源是个平台的CPU指令集不同,即编译后生成的机器码是和平台CPU指令集强相关的。
为此,为了达到一个语言所编译的代码要在多个平台上都能运行,需要解决2个问题,其一,需要 统一编译生成的机器码格式;
其二,要让编译生成的机器码在各个平台上都能运行。
Java语言设计大师们很好地解决了以上2个问题,他们规定Java编译生成的代码统一为.class文件格式,即统一了代码格式;
同时针对各个平台编写.class文件的解析器,即我们通常说的Java虚拟机主要做的事情,而Java虚拟机程序以JDK的形式发布,
各个平台各不相同。
3. JDK如何和具体平台做适配?
本文将带着以下几个问题进行探索
1. 什么是平台?
对于Java的运行环境来说,这里的平台分为软件平台和硬件平台。
软件平台有桌面PC电脑使用的Windows,Mac,Linux和其他Unix系列变种的操作系统
也有当前流行的移动设备操作系统,如Window CE,Window Phone,IOS,Android。
硬件平台有台式机电脑,笔记本电脑,手机和其他嵌入式设备等,硬件平台中有个核心组件是CPU。
CPU的种类有Intel,AMD,SUN的Sparc, IBM的PowerPC等,这些各个公司生产的CPU所使用的指令集各有差异。
指令集就是cpu中用来计算和控制计算机系统的一套指令的集合。
指令集又分为精简指令集(RISC)与复杂指令集(CISC),每种cpu都有其特定的指令集。
开发程序,首先要知道该程序在什么CPU上运行,也就是要知道CPU所使用的指令集。
为此,我们可以将Java运行的平台定义为以CPU为核心的硬件平台+与硬件平台相匹配的操作系统。
2. 各个平台环境不同,cpu指令集不同,如何做垮平台?
做过C代码开发的同学都知道,C代码编译后生成的机器码是和平台相关的,Windows上编译的exe文件不能在Linux上运行。
究其根源是个平台的CPU指令集不同,即编译后生成的机器码是和平台CPU指令集强相关的。
为此,为了达到一个语言所编译的代码要在多个平台上都能运行,需要解决2个问题,其一,需要 统一编译生成的机器码格式;
其二,要让编译生成的机器码在各个平台上都能运行。
Java语言设计大师们很好地解决了以上2个问题,他们规定Java编译生成的代码统一为.class文件格式,即统一了代码格式;
同时针对各个平台编写.class文件的解析器,即我们通常说的Java虚拟机主要做的事情,而Java虚拟机程序以JDK的形式发布,
各个平台各不相同。
3. JDK如何和具体平台做适配?
如下图所示,sun公司发布的JDK主要使用C语言实现的,针对不同的平台实现不同JDK程序,使用C语言实现的JDK经过各个平台的编译器生成对应的可执行文件,如JDK安装包里的java文件。java可执行程序启动后,会动态加载.class文件包(即*.jar)里各个文件按照一定规则语法进行解析,动态生成机器码交给硬件平台的cpu去执行。有兴趣的同学可以研究一下JDK的实现,网上有开源的OpenJdk项目,网址:http://openjdk.java.net/。