以下讨论仅针对PC和手机。Java最大的优势真的就在于跨平台吗?它曾经是,但现在不是了。只有客户端应用程序有跨平台需求,服务器端没有。例如,对于桌面应用程序,您的客户可能是Windows用户或Linux用户。这时候如果不想在各个平台的适配上投入更多,那么Java所谓的“Writeonce,runeverywhere”就很光彩了。然而,今天,整个软件世界都在涌入B/S应用(嵌入式除外)。即使客户端要跨平台,QT等第三方框架也远比Swing强大,Java在桌面应用领域已经基本被淘汰。这是不争的事实,当初Java引以为傲的Applet早已销声匿迹。如果客户端Java还好一点,那就只有Android了。Android最初确实依靠JVM来屏蔽不同硬件设备之间的差异并取得了巨大的成功,但今天,AndroidL中ART模式的出现即将颠覆这一局面,谷歌可能也想使用自己的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参数。但是IntelliJIdea已经完全超越了Eclipse,Idea的智能程度几乎可以和Win平台下的VS媲美。我是那些离不开Vim的人中的一员,两个IDE中都有Vim插件让我快乐地生活。Java有很多杀手级应用。Spring、Struts、Hibernate、Hadoop、Tomcat、JBoss等就不用多说了。Java的句法特性很少。是的,这也是一个优势。与C相比,C++增加了很多特性。更不用说学习起来很费功夫,使用时还会降低代码的可读性。当今世界对编程语言的要求是简单的语法、可读的代码,性能是次之的,因此诞生了Python和Ruby等编程语言。很多人批评Java语法臃肿。我承认这一点,但事实是,编程语言从来没有因为语法臃肿而被淘汰。是生态系统决定了它的生死存亡。对于批评者,引用知乎上的一句话:“动态类型一时爽,代码重构火葬场”Java的性能已经够高了。Sun/Oracle的HotSpotJVM内置的JIT编译器在运行时优化了字节码。服务器应用程序启动后,会充分“预热”JVM,并给出合理的启动参数。就是这样。如果不是对性能非常敏感的系统应用,Java已经够快了。有一种简单可行的方法可以直观地看到这一点。在JVM启动参数中加上+XX:PrintCompilation,可以看到JIT编译器忙。当今世界对软件的需求正在增加。当性能可以接受时,开发效率是第一位的。这就是Python等动态脚本语言流行的主要原因。以上只是客观分析,不想引起语言战。毕竟没有最好的语言,只有最适合某个项目的语言。引用黑格尔的话:“存在就是理性。”
