Java最大的优势真的在于跨平台吗?

n6bg 10年前

Java最大的优势真的在于跨平台吗?

以下讨论只针对 PC 端和移动端。

Java 最大的优势真的在于跨平台吗?以前是,但现在已经不是了。

有跨平台需求的仅仅是客户端应用,而不是服务端。例如桌面应用,你的客户可能是 Windows 用户,也可能是 Linux 用户,这时候如果不想多投入成本对各个平台进行适配,那么 Java 所谓的”Write once, run everywhere”就显得异常光彩。然而今天,整个软件世界都在向B/S应用倾倒(嵌入式除外),即使要做客户端跨平台,QT 等第三方框架远远比 Swing 更强大,Java 在桌面应用领域基本被淘汰已经是不争的事实了,而当初 Java 引以为豪的 Applet 也早已销声匿迹。如果说客户端 Java 还有一点优秀的话,那只有 Android 了。Android 最初确实靠 JVM 屏蔽了不同硬件设备之间的区别并取得了巨大的成功,但在今天,Android L 中 ART 模式的出现也即将颠覆这一情况,况且 Google 还可能会想用自家的 Go 语言取代 Java 成为 Android 平台的第一语言。所以在客户端,Java 几乎完败。

服务端应用不需要跨平台。做一个 Web 服务器,我想没有哪家公司今天用 Linux,下个月就换 Windows 吧?如果仅仅是更换 Linux 发行版,如从 Debian 到 Fedora,本质上讲其 Linux 内核是不变的,因此像 C++ 这样纯编译类型的语言已经没什么问题。如果做游戏服务器,我想几乎都会选择 Linux 而不是 Win 平台。Java 的跨平台优势的实用性其实已经被大大弱化了,可以说在实际应用中并不明显,在一般情况下几乎感知不出 Java 还能跨平台这个特性。作为三大商用 JVM 之一的 JRockets 是只有编译器的 JVM,即应用启动时会将字节码全部编译为本地机器码,这其实就很大程度上摒弃了跨平台,而追求性能。

今天,Java 最大的优势在于其庞大而完善的生态系统。 一门编程语言是否能流行,主要是由其生态系统决定的。Java 生态系统的完善性主要体现在以下几个方面:

Java 拥有世界上数量最多的程序员。你说他们是农民也好,但数量放在那里,最明显的效果就是公司招人的时候会比较容易地招到 Java 程序员。试想如果你想要做一套软件,你有一个很棒的技术方案需要用C++,Scala 或 Ruby 等语言实现,但招不到足够的人手,那么计划多半泡汤。这时候你的应用 Java 也能做到,并且很轻松就能招到足够的人,那么你选择 Java 的可能性就要大一些。

Java 拥有大量的第三方类库。假如你想解析 HTML,用C/C++这类语言恐怕多半只能自己编写解析算法库了,而如果是 Java,你可以非常轻松地在 Github 上找到 JSoup,使用 Maven 导入依赖后分分钟就搞定 HTML。为此还有一句讽刺 Java 的话是:“我们不生产代码,我们只是 Github 的搬运工。”这句话从字面上看是很有道理的,但却忽略了对软件生产效率的提升所带来的巨大价值。对于软件的开发,公司的唯一成本其实就是“人头费”,每减 少一个月开发时间,就能帮助公司节省几十万几千万的研发成本。

Java 拥有功能强大的 IDE。 Eclipse,通过插件几乎可以满足你开发的任何需求。它虽然有些慢,但你可以通过 JVM 调优来提高程序的流畅度,千万不要使用默认的 JVM 参数。不过,IntelliJ Idea 已经完全超越 Eclipse 了,Idea 的智能程度几乎可以媲美 Win 平台下的 VS。我是那类离了 Vim 就活不下去的人,在这两款 IDE 中都有 Vim 插件从而让我愉快地存活下去。

Java 拥有很多杀手级应用。 不必多说,Spring, Struts, Hibernate, Hadoop, Tomcat, JBoss 等等。

Java 的语法特性很少。对,这也是一项优点。C++相比C添加了大量特性,学起来费事不说,用起来还会降低代码可读性,其实是费了工夫不讨好。当今世界对编程语 言的要求是语法简单,代码可读,对性能已经是退而求其次了,因此才诞生了 Python, Ruby 这样的编程语言。有很多人批评 Java 语法写起来很臃肿,我承认这一点,但事实是,编程语言从来都不是因为语法臃肿而被淘汰的,决定其生死的是生态系统。对于批评者,引用知乎的一句话:”动态 类型一时爽,代码重构火葬场”

Java 的性能已经足够高了。 Sun/Oracle 的 HotSpot JVM 内置的 JIT 编译器在运行时对字节码已经做出了非常大的优化努力,服务端应用启动后对 JVM 进行足够的”预热”,并给出合理的启动参数即可。如果不是对性能十分敏感的系统类应用,Java 已经足够快了。有一种简单可行的方法可以形象地看出这点,在 JVM 启动参数中添加 +XX:PrintCompilation 可以看到 JIT 编译器的忙碌。当今世界对软件的需求量越来越大,在性能可接受的情况下,开发效率才是第一位的,这也是 Python 这类动态脚本语言流行的主要原因。

以上仅做客观分析,并不想引起语言战争。毕竟,没有最好的语言,只有最适合某种项目的语言。引用黑格尔的一句话:”存在即合理。”