Java(仍然)是跨平台语言的选择吗?[关闭]


20

从90年代开始使用Java时,从第一天开始就是“ 写一次,就可以在任何地方运行! ”。那时那可能是真的,我也是合唱团的一员。

考虑使用所有其他使用多平台运行时的语言(python,flash,perl,html,php ...)时,我不确定该怎么考虑。但是我仍然看到很多争论,说应该使用Java,因为它据说更适合跨平台开发。

所以,今天仍然如此吗?Java仍然是多平台开发的首选语言吗?

  • 请具体说明跨平台方面。
  • 我不要求进行一般语言功能比较。

更新:到目前为止反应良好!大多数答案似乎都偏爱Java或Web。脚本人群有什么意见吗?



3
该评论并没有解决问题的核心,而是需要考虑的一个因素:面向Windows用户的基于Java的Web应用程序离我们很远。Windows的Oracle JVM最近有很多安全问题。因此,您可能会发现精明的用户不会使用基于Java的Web应用程序,因为他们已经卸载了JVM。

您的问题基于这样的假设,即它甚至是开始选择的跨平台语言。
卢卡斯·拉奇

Answers:


10

脚本样式语言(例如python)也使跨平台开发更加容易。现在,您是否喜欢Python(或其他类似语言)取决于您,我们可能无需在这里开始辩论。

Java试图迫使您编写可移植运行的代码,而python则允许您编写可移植的代码。实际的python语言本身将可移植运行,但是外部库可能会也可能不会。此外,python将免费提供对平台特定服务的访问。

Java在这里有优势吗?我认为无论哪种情况,您都可以轻松编写可移植代码。也就是说,您可以编写代码,并且该代码通常可以在不同的平台上运行。但是,仅编写代码并假定它可以在任何地方工作都无法逃脱。我参与了一个python项目,该项目为Windows,Linux和Mac生产了版本,我们遇到了很少的跨平台问题。(我记得的唯一一个是由于我们正在使用pygame的库中的一个错误,这导致了Linux上的绘制问题。此问题已通过升级我们使用的pygame的版本进行了修复)

另一个问题是部署。如果要分发运行代码的独立程序,则必须为不同的平台生成不同的版本。对于Java,您可以分发一个版本并假定用户已安装Java或可以安装它。在这种情况下,Java可能会赢得部署部门的简化。

最后,我认为这取决于您喜欢使用哪种语言以及需要执行哪种部署。


18

而Java可能不是唯一可行的跨平台工具,它有一些优势:

  • 非常快。
  • 它非常强大。
  • 它具有极高的可移植性(例如10年前在Windows 95中编译的字节码在OS X中今天运行良好)。

和一些弱点:

  • 核心GUI库(Swing ...)正在显示其年龄(第三方添加有助于此处)。
  • 语言本身可能不太冗长(例如,检查异常...)。
  • 启动时间可能会更短(尽管它一直都在改进)。

当专门谈论Java 平台时,还有一点:

  • 许多语言可以在JVM上运行并与Java 互操作

19
极快?比起什么?
HardCode 2010年

18
@HardCode:与任何解释语言或大多数编译语言相比。在某些情况下,可以提高C和C ++的速度,但是这很困难,并且随着内核数量的增加,它会变得越来越难。使用Java并发(有效利用这些多个内核)在实践中更容易实现。
乔纳斯·普拉卡

5
@HardCode,显然,JVM是几乎所有解释语言(与语言黑客自己

14

今天和当年一样真实-也就是说并不完全。Java只需编写一次,即可在任何地方进行测试和调试。当然,这比完全新鲜的港口要少得多的工作,但通常比我们最初认为的炒作要多。

我们的产品具有可在Windows或Linux上运行的Java服务器,但是我们已经看到了特定于操作系统的问题,并确保在需要时可以同时使用Linux和Windows服务器进行支持/测试。Java UI往往比服务器具有更多的问题(尽管许多都是美观的,因此根据应用程序可能会被忽略)。

虽然对我而言不是严格的语言,但Web是首选的跨平台平台。HTML / JavaScript前端意味着您的应用程序几乎可以在任何客户端平台上运行,并且在大多数情况下这是真正的目标-不必担心它是Mac还是PC,以及哪个OS版本等。

当然,您通常仍然会决定服务器平台,但仅仅是因为人们变得更加灵活,尤其是在当今大多数公司已经支持Windows和Linux服务器混合的日子。


8
好答案。当然,要确保您的应用在所有不同的浏览器版本中都能正常运行,也可能会令人头疼。
Tim Goodman 2010年

5
@Tim:好点。我相信浏览器应用程序比Java桌面应用程序更能“无处不在的测试和调试”。
乔纳斯·普拉卡

5
@Tim:+1。要使一个Webapp应用程序在所有主要浏览器上均能正常工作,就像使Java应用程序在多个操作系统上均能正常工作一样困难。
Yevgeniy Brikman

3
根据我的经验,“一次编写,到处调试”是不正确的。只要您明智并避免特定于平台的依赖关系,我就可以在多个平台(包括GUI平台)上运行相同的Java代码没有问题。是的,您当然应该进行测试,但是我认为在Java编码的近15年中,我只有一次真正的可移植性问题(这是我对Windows目录分隔符进行硬编码而不是使用Java有用的跨平台File.pathSeparator的错误。 !)
mikera 2011年

2
@mikera-我们已经发现Linux和Windows之间的问题与我们的代码无关。它们很少见,但确实存在。
乔恩·霍普金斯

9

就个人而言,我会说Java仍然是跨平台语言的首选,并且可能会保留一段时间(与Web应用程序一起使用)。我在这篇文章中就Java作为首选平台写了更多有关该主题的文章,但特别是在跨平台方面:

  • 只要您对依赖关系保持谨慎(例如,避免使用JNI与本机代码进行接口的库),那么Java可以在所有主要JVM平台上未经修改地运行

  • 由于Java通常作为与机器无关的字节码进行分发,因此您无需重新编译就可以在任何JVM上运行(因为本地JVM本身可以将JIT编译为本地代码)。例如,我已经成功地获得了一个合理的复杂GUI应用程序,该应用程序在Windows中进行了开发,并使用相同的jar文件在Mac上首次运行。与大多数其他跨平台语言相反,后者通常需要不同的库或针对不同平台的重新编译。

  • 您需要的许多核心库(GUI,网络,IO等)都是标准运行时的一部分,并以跨平台的方式编写。因此,您无需去寻找和测试跨平台的库,就可以确保运行时环境中已经存在您需要的几乎所有内容。


3

我认为您有以下选择:

1)使用

  • 编译或
  • 解释语言。

2)您将如何打包和交付代码?

  • 一个“前端”,一个二进制/脚本?
  • 一个“前端”,多个二进制文件/脚本?
  • 多个“前端”,多个二进制文件/脚本?

这些选择会影响性能,确保代码可见性和分布。

您介意放弃您的源代码吗?编译语言可能适合您。编译语言在微基准测试中似乎比解释(甚至是JIT)语言更好。另外,如果您依赖于Java,Python,Ruby等运行时环境,则代码可能更难分发。

我发现大多数流行的跨平台桌面应用程序都使用C / C ++和跨平台的小部件库来实现“一个前端,多个二进制文件”,例如Audacity,Blender,Firefox,Google Earth,OpenOffice,Skype,Songbird,Stellarium, VLC。


您在示例中列出了Skype,但发生了一个有趣的错误,但是此超级受欢迎的应用程序实际上是从Windows上的Delphi / Pascal启动的,并在Linux上与C / C ++以及MacOS / iPhone上的Objective-C一起移植的
Maksee 2010年

我认为编译/解释的二分法有点误导性-Java从某种意义上来说既不是因为它被编译为与机器无关的字节码以进行分发(即不再以源代码形式),又在以后将JIT编译为本地代码。无论您运行的是哪种机器。它是完全跨平台的,而且还可以提高您的本机性能,并且如果您不需要的话,也不必分发源代码。双赢/双赢。
mikera 2011年

0

我会说不。python和ruby经常使用,客户端和服务器端的javascript也是如此。我个人使用.NET,并且在Windows和Mac上运行时都没有问题。

-edit-我听说LLVM变得很流行,但仍然很小。这样您就可以在单个二进制文件中使用跨平台C ++。显然它将在浏览器上执行,但是我还没有看到一个允许您修改dom或调用javascript的示例。


LLVM并不是要在浏览器上运行...您是在谈论emscripten吗?
卡米洛·马丁

检查日期。4年前emscripten不存在。NativeClient可以正常工作(并且已经毁灭了),但事实并非如此。

现在我知道了日期,但是LLVM从来都不是专门针对浏览器的,对吗?
卡米洛·马丁

1
不。尽管我希望我可以写C ++或其他语言来支持LLVM而不是JS ...


-1

如果您将移动平台纳入其中,那么您至少还需要包括重新编译。例如android,j2me。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.