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也在与时俱进,不断更新,确保不会被时代所落下。

相关推荐
Kookoos11 分钟前
【实战】基于 ABP vNext 构建高可用 S7 协议采集平台(西门子 PLC 通信全流程)
后端·物联网·c#·.net
帮帮志15 分钟前
vue3与springboot交互-前后分离【完成登陆验证及页面跳转】
spring boot·后端·交互
炒空心菜菜10 小时前
SparkSQL 连接 MySQL 并添加新数据:实战指南
大数据·开发语言·数据库·后端·mysql·spark
蜗牛沐雨12 小时前
Rust 中的 `PartialEq` 和 `Eq`:深入解析与应用
开发语言·后端·rust
Python私教12 小时前
Rust快速入门:从零到实战指南
开发语言·后端·rust
秋野酱13 小时前
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
java·spring boot·后端
小明.杨14 小时前
Django 中时区的理解
后端·python·django
有梦想的攻城狮14 小时前
spring中的@Async注解详解
java·后端·spring·异步·async注解
qq_124987075314 小时前
原生小程序+springboot+vue医院医患纠纷管理系统的设计与开发(程序+论文+讲解+安装+售后)
java·数据库·spring boot·后端·小程序·毕业设计
lybugproducer14 小时前
浅谈 Redis 数据类型
java·数据库·redis·后端·链表·缓存