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