在Java十周年的今天,我清晰看到了Java的末日,就如同三年前VB正红火时我预言VB活不过5年一样。
让我们回忆当初的VB世界,VB兴起的主要原因是简单易用,把大部分应用中可能用到的技术封装起来,几乎什么都有了,COM、数据库访问、office操控,还有各种控件,等等。短时间内这种做法当然可以称得上利器,想象一下,我们当初做应用软件开发的时候,每一个人岂不是也有一个小本本,记录下各种需要用到的代码,在工作中,这就是经验资本,但,5年后,这些代码还有用吗?应用本身总是最易变化的,5年前你使用的那些东西到如今还有几个存在?而VB本身,就可以看成是一个当时应用技术的合集,缺乏技术本身的开发能力,它是一个应用语言,而非开发语言,所以它的优点只存在于当时,因此它的灭亡就是秃子头上的虱子,非常显然。
BTW1:我这里说的是VB,不是BASIC,BASIC的优点是语法简单,而VB的优点是应用简单,BASIC有活下去的理由(虽然没有多少人在用BASIC了),而VB没有。
BTW2:有人认为目前仍然有人在使用VB,因此不算死亡,而我对VB死亡的认证是它的主人---也就是M$---已经不再开发它了。
BTW3:有人认为VB没有死,因为它进化成VB.net了。只有对VB和VB.net一窍不通的人才会这样说,VB和VB.net,除了名字中都有"VB"两个字母,其他已经找不到共同点了。
Java存活和兴起的主要理由是什么呢?主要理由不是内存回收,不是面向对象,不是J2EE这些框架,而是:
1. 打破windows的垄断。
2. 跨平台。
对于第一点,本身就是一个弱智的理想,当初的信仰者怀着的是"理想",现在的信仰者多的是"弱智",Java是依赖操作系统的,不在同一个层次上如何竞争?一个相信蛋黄能比蛋壳还大的家伙可以算着"弱智"。
BTW4:有人会提出直接基于硬件平台的Java,事实上仍然有公司在从事这样的研究,但这种做法本身就是在否定跨平台,在否定Java本身,而且这样的公司越来越少了,再过一两年我想它们会绝迹于尘世。
现在让我们来分析一下"跨平台":
a. 只有跨平台的文档,没有跨平台的程序
首先要明白为什么要有多平台,因为每个平台需要提供的功能不同,unix的处理能力,windows的图形界面,即使这个功能是纯感情的,比如MacOS。
其次要明白平台之间区别的表现,本质上的区别就是上述所说的提供的功能不同,这个本质区别将导致用户接口的不同。
ASCII值0x41解释为'A',在任何平台上都一样,因为它是文档,不是程序,作为解释0x41为'A'的程式代码在每一个平台上都不一样(不排除有雷同的空能,但雷同不是必然的),没有跨平台程式的可能,那么Java是如何欺骗大众跨平台的呢?把Java分成JVM和Java中间码,JVM是Java中间码的解释器,它本身不可以由Java来编写,JVM本身是不可以跨平台的,每一个平台上的JVM都应该不一样。所以
如果Javar口中的Java是JVM+Java中间码,那么因为JVM是不可以跨平台的,所以Java不是一个跨平台的语言;
如果Javar口中的Java仅是Java中间码,不包括JVM,那么Java中间码只能算作文档,不属于程式,因为它不能直接在操作系统上运行。
所以理论上Java不是一个跨平台语言,Java不是,.net也不是,事实上就不可能存在跨平台语言的可能。
b. Java中间码如何跨平台
拿一个最简单最常用的应用来举例,在屏幕上画个点,每个操作系统的GUI都不一样,因此如果Java要想跨10个平台,那么就需要在这个10个平台上,每个平台上都用ASM/C/C++来实现一个画点的功能,然后由Java来调用。尴尬呀,Java每跨前一步,都需要ASM/C/C++先跨前10步。
事实上,还并没有这么简单,正如a中提到的,每个平台提供的功能可能不同,比如linux提供了多进程的能力,而DOS没有,请问Java如何实现跨平台的多进程能力?从理论上讲,能跨平台的功能只有诸平台的功能交集,平台越多,交集越小,所以能跨的越少,这又是一个尴尬。
不仅如此,前面已经讲过"为什么要有多平台",如果只用诸平台的功能交集,那么就否定了多平台存在的意义,如果否定多平台存在的意义,那么天下只有一个平台,还跨个啥?
c. 未来需不需要跨平台
如b所言,未来要么统一平台(理论上不应该出现这种状况),只有一个平台则所有语言都是跨平台的,Java的跨平台也就不是可炫耀的优点;要么各用各的,不去跨平台,因为这就是多平台存在的意义嘛。
然而在平台争竞存在的目前,在部分场合下跨平台是需要的,但却不需要一个类似JVM的适配器来跨平台,比如POSIX,操作系统级上为相同功能提供相同接口岂不是更好,比如gtk,语言库级上为相同功能提供相同接口岂不是更好,无论从任何一个角度看JVM都是丑陋和多余的。所以Java只是一群白痴对白痴技术的失败尝试,目前结果已经显现,Java可以寿终正寝了。我与很多应用软件设计师交流,了解他们的看法,从趋势上来看,对多平台/跨多平台的要求越来越多,但却不是Java的跨平台。
总结:
VB的死因是由于技术的进步,VB是一时的;
Java的死因是由于程序员智识的提升,Java是错误的。
考虑到[嗜血]和[玻璃]的理解力和反驳手段,特标注:这个"将"是一个不超过5年时间的形容词。也就是说我推算出Java在5年内灭亡。
BTW:其他更高级的一些数值计算,可能会利用到FPU、MMX、3DNow等平台相关的技术,这是绝对不可以跨的。