如果Java是“一次编写,到处运行”,为什么很多Java程序告诉我要选择适合我的操作系统的版本?

5

我相对于Java或编程来说还是新手。在通过互联网掌握这门语言的过程中,我多次遇到“一次编写,到处运行”的说法。

但我发现许多软件需要您选择适合您操作系统的正确版本。有时只有一个版本可用。

您能否解释一下为什么会这样呢?


3
Java 运行在虚拟机 JVM 上。在理想的情况下,这意味着操作系统被抽象化隐藏起来,你只需要确保你的代码能够与 JVM 一起工作,就能让它能够在底层操作系统上运行。但是,如果使用错误的路径分隔符或者行尾字符,这种抽象关系是可以被打破的,这不是绝对的真理。 - Jeroen Vannevel
1
@JeroenVannevel,您能否将其发布为答案或社区Wiki? :) 如果我们继续在评论中贡献,未回答的问题数量将继续增加... - T J
1
@ TomTomTom:你能给几个例子吗?我的使用Java软件的经验与你的说法不符,即“许多”程序需要您下载特定于您的操作系统的版本。通常只有一个或两个(除Windows外的一个,Windows一个),这通常是安装程序。 - T.J. Crowder
不要将最初的开发者梦想/营销说辞与粗糙的现实混淆... - vonbrand
5个回答

11

Java 运行在虚拟机 JVM 上。在理想情况下,这意味着操作系统被抽象化,并且您只需确保代码与 JVM 兼容即可使其与底层操作系统一起工作。但是,使用错误的路径分隔符或行结尾可能会使其无效;这不是绝对的真理。

应用程序可能会使用许多特定于操作系统的方法/库/函数等,这可能使将自己限制在一个通用代码库中不可行。相反,他们可能希望利用平台提供的某些优势并创建一个单独的应用程序。

该语句可能应该是类似于“以通用方式编写一次,然后在任何地方运行”,但这不太简洁。

这个语句经常与 Java 相关,但还有其他语言也包含了这个概念:像 Javascript 和 HTML 这样的网络语言将在任何浏览器上运行,因为浏览器本身形成了语言和底层操作系统之间的抽象。

其他语言可能没有(完全?)这种功能,因为它们的工作方式不同:C#将使用底层的 .NET 框架,由于该框架仅适用于 Windows,所以 C# 的跨平台变体(Mono)存在,但将其视为真正的跨平台可能有些过分夸张。


1
关于C#和.NET的最新消息:微软正在努力缩小与跨平台的.NET Core之间的差距。此外,还有Xamarin。 - Pavel Gatilov
那么Python不是跨平台的吗? - Bishwas Mishra
现在dotnetcore已经成熟稳定,因此这个答案需要更新。 - BozoJoe

3
Java程序或源代码被编译生成“字节码”(一种中间二进制格式)。其次,字节码由Java虚拟机(JVM)的解释器执行。 “Write Once, Run Everywhere”指的是使用Java编写的应用程序可以在任何具有Java虚拟机(JVM)的硬件上运行,并且现在许多操作系统供应商的系统(包括Microsoft的Windows)都已获得了JVM的许可证。

2

一些东西确实是跨平台的(大部分标准Java库),而另一些东西可能需要适合特定操作系统版本。通常,这适用于使用动态库且未使用Java编写的软件。在这种情况下,不同操作系统版本都会搭载适用于该操作系统的库。

如果只有一个操作系统的版本 - 可能是因为其他操作系统缺少所需的库,或者开发人员没有进行移植。仍有可能它实际上是跨平台的,但开发人员只在一个操作系统下进行了测试。


0

你的问题更多地基于平台依赖性/独立性。

Java是一种编程语言,它是平台无关的,这意味着你编写的代码将在运行Windows、Linux、Unix等所有机器上产生相同的输出,而不需要对代码进行任何更改。要运行Java程序,你需要安装JVM(Java虚拟机)。那么JVM是做什么的呢?它将你的代码转换成操作系统能够理解的机器码。因此,JVM是平台相关的,因为每个操作系统都有不同的机器码。

因此,基本上你只需编写一次Java程序,就可以在任何地方使用/运行。


就像符合标准的 C 语言是跨平台的,只需要重新编译即可。但在实践中,你几乎被迫使用特定于平台的功能、特定的支持库,在不同版本之间存在差异等等。 - vonbrand

0

你可以在一个平台上编写源代码,然后在任何地方运行它。有时候,如果有新的Java版本可用,但当前版本仍然可以运行代码,你可能会遇到问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接