在前面的几篇文章中,对物联网操作系统的基本特点、以运营商为视角的物联网操作系统的商业模式等问题做了讨论,本文及后续几篇文章将聚焦于分析物联网操作系统实现上的几个问题,本文聚焦第一个问题:是否需要基于虚拟机构筑物联网操作系统。
由于Android操作系统的巨大成功,使得Dalvik虚拟机名声大噪。不容否认,这个虚拟机由于其良好的效率、较低的资源需求等特征,十分适合嵌入式系统应用。于是有一种观点认为,借鉴Android的模式,基于虚拟机技术,比如Dalvik,来构筑物联网操作系统会是十分有效的,甚至可以孵化出物联网领域内的Android。底层的操作系统,与Android一样,使用Linux的一个紧凑内核。在此基础上,开发一个包含各种物联网能力的功能库,供应用开发者使用,类似于Android的Runtime。统一用Java语言作为应用程序开发语言,这样不仅可以依托庞大的Java程序员群体,快速的开发出各种各样的应用程序,同时也可直接借用已有的各种成熟开发工具和环境,比如Eclipse等,无需开发新的编程环境。更有甚的是,如果做得好的话,这个物联网操作系统甚至可以兼容Android应用程序,直接融入Android生态链。
这种思路似乎非常完美,以前作者也感觉十分可行,但经过仔细考虑之后,发现该观点值得进一步商榷讨论。为了对这个思路进行评估,我们需针对物联网行业的特征做深入分析。在此之前,首先分析一下Android模式的深层次来源。这包括两个递进的问题:一是Android为什么选择Java作为开发语言,二是Android为什么选择Dalvik作为虚拟机。第一个问题清楚后,第二个问题迎刃而解。既然选择了Java语言,必须有一个虚拟机支持。选择哪个虚拟机呢?Dalvik高效且无法律风险,适合嵌入式系统,与Android定位相同,于是中选。下面重点分析第一个问题。
在个人计算机领域,大部份程序都是用C/C++语言编写的。以windows操作系统为例,程序员只需在一个基于windows的开发环境下写好代码,然后编译连接一下,测试通过后,即可在几乎所有个人计算机上正确运行,只要操作系统同样是windows。这貌似成为了一种常识,在程序员心中已根深蒂固。假设出现这样一种情况:在某台基于windows操作系统的个人计算机上开发的程序,在另一台同样基于windows操作系统的计算机上无法运行,反而成了一种异常情况。之所以这样,除windows操作系统因素之外,最本质的原因,就是所有的个人计算机都遵循一种同样的标准架构:IBM PC兼容机标准。所有的个人计算机的CPU,都是Intel生产,或者即使不是Intel生产,也提供与x86架构兼容的指令集。所有的个人计算机的主板架构都相同,所有计算机外设(比如软盘、硬盘驱动器、键盘、鼠标等),在计算机启动时都被初始化成了相同的配置。正是因为有这样一种标准化的硬件环境,才使得在一台计算机上编写的应用程序,能够在另外一台计算机上无缝运行,只要操作系统相同。但从理论上来说,在一台计算机上采用C/C++语言开发的程序,在另外一台计算机上无法运行,却是正常的。众所周知,C/C++语言是一种编译型语言,编译器直接编译成符合CPU指令系统的指令集,只有在具有相同CPU、外设硬件配置也相同的计算机上才能正确运行。如果另外一台计算机与开发所在的计算机的CPU不同,则很显然,程序是无法正常运行的。即使CPU相同,外部设备配置不同,比如一台计算机采用硬盘作为存储设施,另外一台采用磁带作为存储设施,则在其中一台计算机上开发的应用程序,也可能不能正常运行在另外一台上。要解决这种兼容性的问题,必须为不同CPU、不同计算机架构分别编译一份应用程序。显然,这是非常麻烦甚至不可能的。正是IBM兼容机标准,使得这一切麻烦得到了避免。计算机技术之所以能够快速发展和普及,给人们的生产和生活带来巨大便利,我认为IBM兼容机标准是最大的功臣。再引申点题外话,标准,是人类社会进步的最主要推动力量。正是铁路有了标准(比如宽度、枕木间隔等),全国和世界的铁路网才能连成一片,有效提供运力。正是通信技术有了标准(3GPP/IETF等),人们才能在世界各地相互打电话,在任何地点都可上网。正是金融体系有了标准(国际会计准则、清算结算、汇率等),世界经济活动才能相互协调,形成全球经济体。正是人们的行为规范有了标准(法律法规等),社会才能和谐有序,人们才能安居乐业。因此,做任何事情,要想做大做强,必须形成事实上的标准体系。
言归正转,到了Android所面对的智能终端领域,情况有了变化。在这个领域内,没有任何标准来规范硬件平台,于是各个厂商都开发自己的硬件解决方案。比如就CPU来说,有基于ARM架构的低功耗CPU,基于x86架构的ATOM等CPU,甚至还有基于C51的传统控制器。就外设来说,有的智能终端通过键盘输入,有的智能终端通过触摸屏输入,有的则通过手写输入,等等各种各样。这种百花齐放的格局,给人们提供了丰富的选择。但对Android来说就是挑战了。如果Android选择C/C++语言作为开发语言,那么就会出现这种情况:同样一款应用程序,在一台运行Android操作系统的终端上正常运行,在另外一台终端上就无法运行,因为这两者的CPU或硬件配置不同。这个问题严重了,Android的初衷是建立一个通用平台,能够通用各种智能终端,这不仅仅是Android操作系统能够被移植到各个不同的硬件平台上,还包括基于Android的应用程序能够运行在各种各样的终端上,只要终端运行的是Android操作系统。显然,如果选择C/C++作为开发语言,Android的初衷是达不到的。怎么办?在沉思良久之后,Google不得不做出效率上的牺牲,放弃C/C++语言,选择Java作为应用程序开发语言。众所周知,Java是跨平台的语言,这里的平台,主要是硬件平台。虽然从理论上说,Java也是可以跨操作系统平台的,即在windows操作系统上编写和编译的Java程序,可以直接拿到Linux操作系统上运行,不过实际中显然无法达到这一点,必须做一些修改和调整才能跨不同操作系统平台。但Android的目标是跨硬件平台,因此Java足够了。选择了Java之后,必须选择与之对应的一款虚拟机来支撑。Dalvik于是入选。
啰嗦了这么多,希望不要把您给绕晕了。总结起来就是一句话,Android之所以选择Java语言作为应用程序开发语言,就是为了让Android应用程序能够跨硬件平台。但与之针锋相对的iOS,同样应用于智能终端中,为什么没有选择跨平台的Java语言,而是使用了Apple自行开发的Ojbect C作为开发语言呢?答案很简单,iOS无需跨平台,因为它只面向一个硬件平台,就是Apple的iPhone和iPad等产品。就如同原来的某个手机生产厂家,自己生产设计硬件,然后自己定制Linux作为操作系统一样。我对Object C没有深入研究,不明白Apple为什么多此一举的开发一种新语言(Object C),而不直接使用C/C++语言作为开发语言的动机。但我个人臆测,是否Apple一开始就预留了后路,在未来撑不住的情况下,不得不公开iOS操作系统。这时候跨硬件平台的问题无法避免,Apple则可以对Object C做一番改造,使之成为令一个Java。此只是猜想。
再回到主题,在物联网领域是否有必要像Android一样,基于Java和Dalvik虚拟机构筑物联网操作系统?我认为“既不需要,也不合适”。
首先说不需要。Android面临的是一个由众多厂商组成的开放环境,每个厂商有自己的硬件解决方案,但其产品(手机等智能终端)却是开放的,给公众使用。因此如何解决封闭的硬件系统和开放的使用环境之间的矛盾,是Android面临的主要问题。但在物联网领域,却不是这样,物联网领域的特点是封闭的硬件系统、封闭的软件系统和开放的数据和服务。所谓封闭的硬件系统,指的是在某个应用领域内,比如智能抄表,其物联网终端的硬件系统是由某一特定厂商自行设计的,没有一个类似IBM PC兼容机一样的公开参考标准。封闭的软件系统,指的是运行在物联网终端上的系统软件(物联网操作系统)和应用程序,都是由同一生产厂商开发的,不是像Android一样,应用程序由与终端硬件不同的第三方独立开发。开放的数据和服务,是指通过物联网终端收集、处理的数据,以标准接口等形式对公众公开,或者部分公开。举一个例子来说明这个观点,以天气预报为例,气象服务公司会在城市的特定位置,布放环境感知终端,这些感知终端的硬件和软件,都是气象服务公司自己开发和定制的,不向公众开放。这就是所谓的封闭的硬件系统和封闭的软件系统。但气象服务公司通过这些传感装置收集的气象数据,却是公开给公众的,这就是所谓的开放的数据和服务。物联网操作系统解决的是“封闭的软件系统”这个问题,提供给企业一个可定制的软件平台,这个平台包括适合物联网应用的操作系统核心、物联网相关的一组能力集(Runtime)、一组API和一个开发环境。企业依据自身情况,对这个软件集合进行定制后,移植到自身的硬件设备上。所有应用程序,比如气象参数的处理和分析等,都是企业自行开发,不需公众和独立的第三方参与。因此物联网操作系统无跨硬件平台的应用移植需求。这时候如果再建立在Java和虚拟机的基础上,则纯粹多余,毕竟使用C/C++的效率更高,其通用性也并不比Java
差。
再说不合适。虽然Android操作系统面临的硬件平台各种各样,但本质上,这些不同硬件平台的处理能力都是差不多的,都要求至少有64M以上内存,CPU的主频也至少要有数百M以上,即面临的是计算资源限制相对较少的智能系统。而物联网操作系统的应用环境则变化多样,从只有几十K RAM的资源受限系统,到数百M存储的富资源计算系统,具备弹性、广谱的特点。因此其尺寸必须能够伸缩。但如果基于Java和虚拟机,则由于虚拟机本身尺寸和效率限制,一定会使得物联网操作系统不能适应低端设备的需求。就Dalvik来说,据Google的评测,至少需要64M以上的RAM才能正常运行,这对物联网终端来说,显然是太高了。
好了,最终的结论就是,以Java和Dalvik为核心构筑物联网操作系统,至少目前来看是不需要也不合适的。本文采用类比的方式,分析了这种不需要和不合适的原因。在后续Hello China的开发过程中,也将遵循该准则,暂时不考虑移植Java虚拟机,而是以原生态的C/C++语言作为应用程序开发语言,以系统调用的形式尽量屏蔽不同硬件之间的差异。
接下来的几篇文章,将针对物联网操作系统的需求和特点,详细讨论物联网操作系统的构筑方法。比如,交互是物联网操作系统的核心特点之一,我们将讨论如何以消息机制为依托,来实现这种交互机制,等等。敬请留意。
还是那句话,上述内容仅是作者观点,供交流使用,不尽或不当之处,敬请谅解,欢迎批评讨论。
原创作品,引用或转载请注明出处。