Android用java作为开发应用程序的语言,是经过深思熟虑的。作为一个开源的、被广泛使用的操作系统,它与微软的Windows系统、苹果的IPhone系统最大的区别,在于硬件差异性而不是别的。
微软的Windows系统,一统天下用的都是X86的CPU体系(即Intel和AMD两家的CPU),所以用C和C++写出的应用程序,只需要编译一次,生成X86 CPU指令的二进制执行文件,就可以在所有硬件配置的Windows系统上跑起来。其实这也是业内公认的一个潜规则,就是微软和Intel的共生关系,微软只使用Intel创立的x86架构体系的芯片(AMD的芯片为了满足这一要求也所有芯片都采用了Intel创立的x86架构),Intel新的PC芯片也都延续x86架构体系。这样做的好处是巨大的:开发者只用开发和编译一次,就可以让应用跑在所有Windows系统上,所有用户只用下同一个应用程序,就基本都能在自己的系统上跑起来。相对而言,下载过塞班手机应用程序的人都有过这种经历:下载应用时要看自己手机的型号,选择对应的才能用。开发塞班程序的人也很痛苦,要为每一种CPU型号的塞班手机都编译一套执行文件,并且没新增一种手机,就要再编译一套。
微软与Intel的这种软硬共生关系,让所有的PC厂商没了选择,只能选择x86架构芯片。有人或许会说他们的这种做法很霸道,但作为应用开发者和用户,却从微软的这种统一性中获取了巨大的方便。
相对于微软的Windows系统而言,Android面临的环境要复杂的多。谷歌是一个以开源免费为主的公司,Android将会被各种设备商所使用,运行在各种架构的CPU上(x86,ARM-7,ARM-9,ARM-11)。这就迫使谷歌不得不面对一个问题:应用开发的难度。如果仍然采用C、C++作为开发语言,那开发Android应用将面临和塞班一样的问题:开发者和使用者都不得不为每一种设备都弄一套程序。这会让开发者痛苦不堪,降低他们的开发效率,也会让习惯了Windows的用户很迷惑和不高兴,为什么我不能下一个通用的程序???在运行效率和开发使用方便性二者之间,谷歌选择了折中,以Java为应用开发语言。Android提供名为Dalvik的Java虚拟机,使Java语言应用运行在这个之上,从而隔离了底层设备的差异性,虽然用解释型语言牺牲了一些效率。
按这个做法,在Android上开发3D游戏的话,直接用Java语言的3D API就行了,不需要另外再弄什么东西。那为什么Android大型3D游戏还要另外再下数据包,而且数据包还区分CPU(例如给高通CPU的数据包,给TI CPU的数据包)?这就牵扯到游戏开发商的成本问题。由于游戏开发商希望在大部分设备上只用一套代码,所以基本是C/C++开发的以适应普遍的设备平台,只需为每个平台编译一次。如果再单独为Android开发一套Java代码,显然成本是非常高昂的。于是有了一个间接方法:将C/C++语言编写的核心代码用Android提供的DNK编译成库,再把系统相关的代码用Android Java开发一下,通过JNI调用C/C++程序编译出的核心库,大功告成,省去了巨额的开发经费。当然也有一些3D游戏,专门为Android写的一套Java代码,不用额外数据包,这样方便了Android用户,但投入-产出是否划算?游戏开发商需要打个算盘了。
最后说苹果IOS系统。它与微软有相似也有不同。不同的是,微软有Intel这样的一个好基友,而苹果似乎在ARM分散和内斗的阵营里难以找到肯与自己长相厮守的伙伴。相似的是,都是闭源系统只给自己使用,并且自家内部使用一个CPU体系(苹果使用的是自己的A系列CPU,微软是x86系列CPU)。不管相同还是不同,最终都促成苹果的自成体系。因为没有忠实硬件伙伴,于是苹果自己开发CPU(本身苹果以前也是做硬件的)。再加上只有自家使用,苹果的IOS王国就与微软帝国一样,拥有了统一的CPU体系。这就使得它与微软一样,应用程序一次编译处处运行。而且由于是编译型语言(object-c)生成的可执行程序,效率比Java要高,这也是为什么IPhone的配置比高端的Android机低却仍然运行很流畅的原因。
最终总结一下,未来的趋势或说开发者和用户的需求,就是应用程序的硬件无关性,一次编译处处运行。而在如何满足这一要求上,有两种途径,一种是一个操作系统采用一致的向下兼容的CPU体系,另一种就是用Java、WebApp这样的平台无关开发方法。如何取舍取决于操作系统提供商本身的特性和市场策略。至于哪种趋势将占主流,在目前的市场格局下尚无法预测。