为什么Windows Phone 7不支持C++?
//=====================================================================
//TITLE:
// 为什么Windows Phone 7不支持C++?
//AUTHOR:
// norains
//DATE:
// Thursday 5-August-2011
//Environment:
// Windows Phone 7
//=====================================================================
当我第一次知道Windows Phone 7不支持C++开发时,感觉是非常地震惊,同时也非常迷惑不解。但随着时间的慢慢推移,也终于理解微软如此的初衷:如果让Windows Phone 7支持C++开发的话,很可能会是推广的一大障碍!
听起来是不是很悚然听闻?但在说这个问题之前,先问几个问题:
你知道CPU有多少种架构吗?你听说过ARM,X86,MIPS,SH3这些名词吗?你知道ARM的指令集分为多少种吗?你知道你手机用的是哪种ARM指令集吗?
我想,即使是程序员,如果不是做嵌入式的,可能对于这些问题也不一定回答地完全正确。那么,又如何苛求作为最普通的使用者去明白这些呢?
也许到这里,还有不少朋友疑惑,这个和普通的使用者又有什么关系。其实,关系大着呢。举个例子,假设有个用C++编写的Windows Phone 7的最简单的仅仅是输出“Hello World!”的程序,放到一台运行Windows Phone 7的手机上,你说能不能一定正常运行?
答案是:不一定。我们知道,C++编译后的程序是二进制代码,而这二进制代码是和CPU的架构有关的。即使你编译的是Windows Phone 7的程序,但指令集选择的是ARM,那你这程序绝对是无法在MIPS架构的CPU上运行的!
听起来似乎也没那么严重,我们只要选择对应的CPU架构不就好了吗?似乎如此。但我们从另一个角度来看问题。现在Apple的那个网上程序商店不是很火吗?很显然,微软肯定也很眼馋这一块。那么,假设微软也要做类似的网上程序商店,那么放在商店的程序有什么要求呢?是不是同样的一个程序,必须要分为ARM,MIPS,X86版本?因为这样用C++编译好的程序,才能放在对应的CPU上进行啊!
这问题难道还不够严重吗?尝试回答一个问题:自己所使用的手机用的是那种架构,哪种指令集?估计如果不拆机器,不是内部人员,估计还真没几个人能够精确回答。程序员都如此了,何况普通用户?如果普通用户下载了个用C++编译的程序,发现无法运行,你觉得他们会花时间去了解什么是CPU架构,然后去下载相对应的版本吗?估计他会说:NND,这程序不能用,这Windows Phone 7真烂!
回过头来,为什么IPhone可以用Object-C?理由非常简单:因为IPhone的硬件是APPLE设计的,他们就只用一种CPU架构,绝无分店。所以对于IPhone来说,根本就不存在于架构的差别。但对于微软来说,就不是如此了。微软只是提供了操作系统,也就是软件层面;对于硬件来说,微软是不可控的,为了Windows Phone 7的销量,也绝对不可能说是局限于某个特定的架构,所以硬件是百花齐放的。
但微软如果真想搞网上程序商店的话,那么他必须要向应用程序员以及用户来屏蔽这种差异。C++是和CPU架构相关的,所以不能胜任;唯一能担当此责任的,唯有.NET。而C#作为.NET的先锋,自然义无反顾。
类似的情况在Google的Android也是如此。Google无法控制所使用的硬件,也不打算局限于某个架构,所以它也必须使用一种能够屏蔽此差异的语言。选择微软的.NET?要是真是如此,估计真的被驴踢了。那么,剩下的选择便只有JAVA了。
简单点来说,如果一个公司,能够控制操作系统和产品的硬件,那么首选就是C/C++(或Object-C等等),因为运行效率摆在那里,比如APPLE;如果一个公司,只是提供操作系统,无法控制硬件,那为了屏蔽硬件的差异,只能舍弃效率,使用基于虚拟机的语言,比如微软,GOOGLE。
作为本文的最后,再来讨论一下Windows的问题。因为已经有放出消息,说Windows 8将不局限于X86架构,也要在ARM上能够运行。如果届时微软成功的话,那么是不是意味着,Windows 8的应用层面的开发将是C#的天下?