Java的“一次编写,到处运行”:如何实现跨平台的神话?

java号称"一次编写,到处运行",这几乎是每一个java初学者在学习时都会听到的话,但是由于当初知识系统还不够全面,就没有深究这个问题,只觉得特别厉害(这也是博主在刚开始学java的一个困惑),今天就让我们来深入探讨这个问题

Java的"一次编写,到处运行":深入探讨

Java的"一次编写,到处运行"(Write Once, Run Anywhere)几乎是每一个Java初学者在学习时都会听到的话。然而,由于当初知识系统还不够全面,很多人并没有深究这个问题,只觉得特别厉害(这也是博主在刚开始学Java时的一个困惑)。今天,让我们来深入探讨这个问题。

编程语言与操作系统的关系

在深入探讨Java的跨平台特性之前,我们首先需要明确一个概念:编程语言在大部分情况下 是和操作系统打交道的,而不是直接和CPU打交道。这是因为操作系统作为中间层,可以提高安全性和效率。例如,操作系统可以防止程序直接访问硬件设施或拖慢系统速度,从而避免潜在的问题。 ## 跨平台开发的挑战 在1990年代,互联网刚刚兴起,各种操作系统层出不穷,如Windows、Linux、Unix等。不同的操作系统对外提供的API也不同。此时,编程语言在Windows平台上编写的代码编译后的.exe文件是面向Windows API的(上面我们提到过,编程语言实际上是和操作系统打交道的),它在Windows上当然可以运行。然而,当这份.exe文件到了Linux下运行时,Linux会说"你是谁啊,我不认识你,你调用的这份API我没有啊",这当然会报错。 具体可以看下面两段代码:

c 复制代码
// Linux下的write系统调用 
ssize_t write(int fd, const void* buf, size_t count);
// Windows下的
WriteConsole API BOOL WriteConsole(HANDLE hConsoleOutput, const VOID* lpBuffer, DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved);

以上分别是Windows和Linux下输出的API。如果把在Windows上的API拿到Linux下调用,当然不行。因此,这时就需要在不同的平台下重新编译。

Java的解决方案:JVM

那么,Java是如何解决这个问题的呢?俗话说"没有什么问题是不能加一层中间层解决的,如果有就再加一层"。Java正是采用这样的思想,它加的中间层就是JVM(Java虚拟机)。通过JVM制定统一的API接口,Java语言调用的API接口是JVM提供的,是不变的,所以你编译出来的代码当然可以到处运行。

那不同操作系统的差异呢?这就由JVM去进行屏蔽。针对不同平台发布不同的JVM,让不同的JVM去调用不同的操作系统接口。也就是说,这份重新编译的活,Java官方帮你干了,他们为你编写不同的JVM来帮你屏蔽细节,你只需要面向JVM实现即可。

Java成功的原因

Java之所以成功,不仅在于其'一次编写,到处运行'的特性,更在于它提出的先进思想。在当时,跨平台开发普遍需要"到处编译",而Java这类先进思想的提出自然引人注意。同时,通过JVM的GC(垃圾回收机制),你可以放心大胆地创建对象,而不用担心内存泄漏的问题,这也为开发者省去了很多烦恼。

总的来说,Java语言的火爆是因为它的先进思想,是开创性的。现在,如果你开发一门"到处运行"的语言,可能也不会火,因为你是"模仿者",除非你的语言足够优秀。而Java也凭借那时的火爆迅速占领市场,使得现在大部分软件和网站都是由Java开发的。这就是为什么虽然现在有多种语言层出不穷,而Java依然屹立不倒的重要原因。同时,Java也在与时俱进,不断更新,确保不会被时代所落下。

相关推荐
thePLJ26 分钟前
SpringBoot-已添加并下载的依赖,reload和mvn clean 后还是提示找不到jar包问题
java·spring boot·后端
余华余华29 分钟前
输入输出 数组 冒泡排序举例
java·后端
俞嫦曦40 分钟前
R语言的回归测试
开发语言·后端·golang
JalenYan41 分钟前
Ruby on Rails 中的 Delegated Types(委托类型)
后端·ruby on rails·ruby
hxung44 分钟前
spring bean的生命周期和循环依赖
java·后端·spring
油丶酸萝卜别吃1 小时前
springBoot中不添加依赖 , 手动生成一个token ,并校验token (使用简单 , 但是安全会低一点)
spring boot·后端·安全
皮皮的江山1 小时前
基于AI Text2SQL的数据可视化方案
后端·aigc·数据可视化
4dm1n1 小时前
kubectl exec 实现的原理
后端
四七伵1 小时前
高性能 MySQL 必备:COUNT(*)、COUNT(1)、COUNT(字段) 的选择法则
后端·mysql
用户86178277365181 小时前
责任链
java·后端·设计模式