什么是平台

Java是可以跨平台的编程语言,那么首先我们需要知道什么是平台,通常我们把CPU与操作系统的整体称为平台。

CPU大家都知道,是计算机的大脑,它既负责思维运算,又负责计算机中各种零部件的命令控制。CPU的种类非常多,目前我们使用的主流的CPU是由Inter和AMD公司生产的各种CPU。这些CPU使用相同或不同的指令集,指令集就是CPU中用来计算和控制计算机系统的一套指令的集合。指令集又分为精简指令集和复杂指令集,每种CPU都有其特定的指令集。开发应用程序,首先要知道程序在什么CPU上运行,也就是要知道CPU所使用的指令集。

操作系统是充当用户和计算机之间交互的软件,不同的操作系统支持不同的CPU,严格意义上来说是不同的操作系统支持不同的CPU指令集。例如早期的Windows和Linux都支持Inter和AMD的复杂指令集,但并不支持PowerPC所使用的精简指令集,而早期的MAC电脑(苹果电脑)使用的都是PowerPC处理器,所以也就无法在MAC下直接安装Windows,而macOS也无法安装在Inter和AMD的平台之上。目前所有主流的操作系统(Windows、Linux、MAC等)都支持Inter与AMD的指令集。

又因为现在主流的操作系统都支持主流的CPU,所以有时也把操作系统称为平台。其实想要知道Java到底跨了什么平台,只需要在Java的官方网站www.oracle.com上下载Java时提供的平台版本就可以知道Java到底跨了什么平台了。我们会在本书后面的内容中介绍如何下载Java,以及是什么原因可以通过上面的方式来判断Java跨平台的。

Java跨平台原理

从上面的讲解中大家了解了什么是平台,现在为大家介绍一下Java的跨平台原理,首先我们来看一种与C语言从源代码到可执行程序过程的相关的图片(图2.2)。

图2  C语言从源代码到可执行程序的过程

如果有过C语言开发经验,图2看起来将非常轻松。我们知道用标准C开发的程序,使用不同的编译器编译后的可执行文件是可以在对应平台运行的,比如Windows可以使用VC来编译C源代码,编译后的文件就可以在Windows系统下运行;Linux下可以使用GCC编译器,生成的可执行文件就可以在Linux上运行,但是这里有一个问题就是使用VC编译的C程序可以在Linux上运行么?答案肯定是否定的,如果想将Windows平台下的程序拿到Linux平台下运行,需要使用Linux平台下的编译器再次编译程序的源代码生成可执行文件才能运行。因为C语言编译后的可执行文件是无法跨平台的,使用特定的编译器编译C程序只能在对应的平台上运行,这里也可以说编译器是与平台相关的,编译后的文件也是与平台相关的。我们说的语言跨平台是编译后的可执行文件跨平台,而不是源代码程序跨平台(如果说源程序是跨平台的,那么任何一门语言都是跨平台语言)。

下面我们通过图2.3来看Java语言是怎么样解决可执行文件跨平台的。

图3  Java语言从源代码到可执行程序的过程

通过图3我们可以发现,在Java源代码和各个平台之间多了一个编译器和一个字节码文件,然后各个平台通过解释器来解释执行这个字节码文件。那么中间这个编译器和字节码文件到底是什么呢?原来,Java语言为了做到跨平台,通过将Java源代码经过一个编译器,编译成一个与平台无关的字节码文件,然后各个平台中相应的解释器就可以加载、解释并执行这个字节码文件了(各个平台的解释器解释同一个字节码文件会生成不同的但是运行效果相同的机器指令,Windows和Linux的机器指令就不同,但是运行同一个Java程序的结果是没有区别),即在一种平台下编写的应用程序无需修改也可以在其它平台上运行了,但是要求该平台必须拥有对应版本的解释器才可以。

通常使用Java语言编写的源代码文件以.java为后缀,使用Java提供的编译工具javac将源代码编译后生成的字节码文件以.class为后缀,使用Java提供的运行工具java即可运行字节码文件。

最新文章

  1. Android开发之重力传感器
  2. BBR拥塞控制算法
  3. [转]h5页面测试总结
  4. SRM 615 DIV1 500
  5. 编写简单的Mapreduce程序并部署在Hadoop2.2.0上运行
  6. 导入安卓项目的时候,发生错误:Cause: peer not authenticated
  7. 【转载】Hadoop可视化分析利器之Hue
  8. 1.1、Mybatis一级缓存测试
  9. Eclipse中设置编码的方式
  10. poj 3321
  11. PNPOLY - Point Inclusion in Polygon Test
  12. C#中简单的this与get的用法(string,decimal)
  13. 【.NET Core】ASP.NET Core之IdentityServer4(1):快速入门
  14. [算法&数据结构]深度优先搜索(Depth First Search)
  15. Interactive map of Linux kernel
  16. 【JAVA基础】一:聊聊笔试常见到的 “==、equal” 比较是否相等的内在差别
  17. ImageMagick 笔记: 索引颜色(index color)、锁定图层,透明 png 转 gif (保持清晰度)
  18. centos7系统运行级别简介
  19. SQL Server使用证书最小粒度授权
  20. 1px的实现方法

热门文章

  1. LeetCode:有效的括号【20】
  2. PAT 乙级 1081. 检查密码 (15) 【字符串】
  3. BZOJ 1634 [Usaco2007 Jan]Protecting the Flowers 护花:贪心【局部分析法】
  4. css:before和after中的content属性
  5. ACM学习历程——POJ3295 Tautology(搜索,二叉树)
  6. codevs 4939 欧拉函数
  7. python定时任务:apscheduler的使用(还有一个celery~)
  8. T(n) = 25T(n/5)+n^2的时间复杂度
  9. requirejs的打包工具r.js
  10. 搭建基于Nagios的监控系统——之监控远程Windows服务器