为什么Java可以跨平台,而其他语言不行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么Java可以跨平台,而其他语言不行相关的知识,希望对你有一定的参考价值。

你好

我是大福 你现在看的是大福笔记

今天复习了Java语言的概述

内容包括Java 语言的历史、语言特点及平台版本 JRE和JDK的区别

这篇文章的主题是总结下对Java语言特点中的跨平台原理.

在这之前,我们先了解下计算机语言为什么不能跨平台.

跨平台分两个层面 硬件层面 系统层面

先说硬件层面

计算机只能识别由"0"和"1"组成的二进制数.

那么随便给计算机一组0101的二进制数计算机就能识别么?

当然不是!

以人为例

人是可以识别声音的。

这样一个场景:房间里坐着3个人,分别是中国人、韩国人和美国人。

现在你需要分别和他们打招呼。

怎么办,跑到每个人面前吼一声可以不?

搞不好,人家会以为你在骂他.

所以这时就需要分开来了

中国人说:你好

韩国人说:阿尼哈撒哟

美国人说:Hello

这样人家才能知道是打招呼,而不是在骂他.

因为他们只能接受特定的打招呼的语言.

那回到计算机!

每台计算机出厂的时候就预先设定好它能识别的一组指令存放在计算机中叫指令集。而每家公司出厂的计算机设定的指令集又可能不同,所以需要针对特定的计算机编写特定的程序。

就和上面列子一样,3种不同的计算机可能需要写3套程序。

同样一件事情需要做3次,如果再有几种计算机可能还有更多次,麻不麻烦?自己感觉下

那硬件层面是否可以跨平台?

答案是肯定的,最好的例子就是AMD和Intel.

既然上面的问题是由于不同的计算机厂商设置不同的指令集产生的,那把指令集统一就可以解决上面硬件层面的跨平台问题.

所以AMD和Intel现在都统一支持x86指令集(64位的叫x64).这样只需要针对特定的指令集编写程序就行.从而解决了硬件层面的跨平台.

其实硬件层面的跨平台不是我们该操心的,只有操作系统才是直接运行在硬件上.

我们编写的是应用程序,应用程序是运行在操作系统上,所以系统层面的跨平台才是我们关注的.

硬件层面的跨平台都解决了,系统层面怎么又出来了跨平台问题?

我们以Windows、Linux和Mac为例,看下图

Windows Linux和Mac通过X86指令集可以控制AMD和Intel CPU

那我们写的应用程序运行在这3个系统上有什么问题
技术分享

这里我们以C语言来说明下

有句话叫"一次编写,到处编译",说的就是C语言这类编译型语言.

意思是只需要编写一次C语言的源文件,然后在不同的操作系统上编译一次就可以使用.

如果只是编译一下,也挺省事的.

那这个理念是否可以实现?

理论上可以.

为什么是理论上?

如果是使用C标准库中提供的API接口进行编程,那么"一次编写,到处编译"是完全可以实现的.

可是C标准库中实现的接口实在太少了,不够用!

这样每个操作系统厂家又扩展了自己的系统类库.

比如Windows下的MFC(微软基础类库)你在Windows下编写程序调用MFC下的接口,编译和运行是没问题的。但到Linux下就会编译不过,因为编译器找不到MFC的接口.那这个代码在Linux就使用不了.

这就产生了计算机语言跨平台的问题.本质上来说不是语言不能跨平台,而是语言编写过程中所使用的系统库不能跨平台.

难道C语言就不能夸平台了吗? 可以研究下QT

接下来我们来说说Java怎么解决这个问题,实现跨平台.

先看下Java的编写执行过程
技术分享

从上图我们可以看出Java的编写过程:

首先编写Java源文件,通过Java编译器生成后缀为.class的字节码文件,这文件不和特定的操作系统相关,然后通过JVM解释执行.

所以Java也叫解释型语言.

Java跨平台的重点就在JVM上,由于.class字节码文件不和特定的操作系统相关需要解释执行.

那么只要能解释执行.class文件就可以执行Java程序.

所以曾经的SUN公司在不同的操作系统上开发出不同的JVM用于解释执行Java程序.以此实现Java 的跨平台.

从而得出 Java语言是跨平台的,但JVM是不跨平台的.
技术分享

那是不是只有Java是跨平台的呢?

php、Python、Ruby、Perl 均在旁边笑而不语

我是大福 每天进步一点点

明天见




以上是关于为什么Java可以跨平台,而其他语言不行的主要内容,如果未能解决你的问题,请参考以下文章

为啥java语言编写的程序可以在不同的操作系统上写,

Go语言的跨平台能力到底有多强?看完你就知道了

JAVA是解释执行还是编译执行的理解

为什么C语言用使用其他文件的结构体变量时,声明结构体别名还不行,必须使用本名?(使用别名时不能加struct)

为什么C语言用使用其他文件的结构体变量时,声明结构体别名还不行,必须使用本名?(使用别名时不能加struct)

在 IIOP 中使用 Python 或其他脚本语言