目前来说,是没有一套专门面向物联网应用开发的语言的,这不利于推动物联网的大发展,因此,必须要选择一种适合物联网特点的开发语言。下面我们结合物联网本身的特征,分析物联网对应用开发语言的要求。然后感觉这些要求,对现有的编程语言进行分析,选择出最适合物联网应用开发的编程语言。
一. 物联网应用开发对编程语言的要求
1. 开发语言必须是跨硬件平台的所谓跨硬件平台,指的是编写的物联网应用程序,能够在多种不同的目标硬件设备上运行,而不用重新编译甚至修改应用程序。这里的不同的目标硬件,主要是指CPU指令集,内存大小,外设的接口类型,外设的访问方式等等硬件层面的东西。
如果开发语言不是跨硬件平台的,那么针对一种硬件平台开发的应用程序,就只能运行在这一种硬件设备上。因为硬件平台的具体细节情况,都体现在目标程序中。最典型的例子是采用C语言开发的应用程序,必须根据不同的目标CPU指令集,编译成匹配目标指令集的二进制代码,才能运行。这样如果切换到另外一种指令集的CPU,则必须重新编译,甚至要重新修改应用程序。
这在硬件标准化程度非常高的个人计算机领域,问题不大,因为通用的CPU类型就那么几种(Intel,ARM等),而且硬件配置都非常标准,硬盘等存储设备,显示器,键盘/鼠标等输入设备,USB接口,网络接口等等,都是标配。因此针对不同硬件平台的软件移植工作量并不大。
但到了物联网时代,这显然无法满足物联网硬件碎片化特征的需要。在物联网环境中,目标设备CPU的种类是PC时代的数十倍,同时硬件配置也各不相同,大部分物联网设备的配置都千差万别,因此,如果仍然采用传统的不能跨硬件的开发语言来编写物联网应用程序,那么对同一种功能的应用程序来说,就需要针对不同的CPU类型,不同的硬件配置,分别进行开发和部署。
这显然是无法逾越的困难。而采用跨平台的编程语言,则可以解决这个问题。比如针对智能摄像头而言,A厂商的摄像头个的配置,可能是ARM的CPU,USB接口,分辨率是1024*768等,而B厂商的摄像头可能是基于x86的CPU,SPI接口。基于摄像头编写一个人脸识别程序,如果采用跨平台的编程语言,则针对A厂商设备编写的应用程序,可以直接在B厂家的设备上使用。
但是如果编程语言不是跨硬件平台的,比如C/C++语言,则针对A厂家的摄像头编写的应用程序,必须经过重新编译(甚至还需要大量的修改)之后,才能在B厂家的摄像头上运行。物联网设备的碎片化特征,决定了开发语言必须是跨硬件平台的。采用跨硬件平台开发语言的另外一个好处,就是限制错误范围,不会因为应用程序层面的错误,而导致整个系统崩溃。由于物联网设备硬件配置的巨大差异,由硬件与软件不匹配导致的错误会大大增加。
比如,还是上面的智能摄像头的例子,如果应用程序通过人脸识别,发现可疑人员进入某个特定的范围,则会引发报警。报警的方式有很多种,比如会给智能摄像头的后台发送告警信息,调用本地的扬声器发出警报,甚至在智能摄像头的屏幕上输出告警文字等。很可能有的摄像头没有配置本地扬声装置,而有的摄像头则没有配置本地显示器。
这时候上述应用程序的告警代码,就会因为无法找到硬件而出现错误。如果这种错误不被有效隔离或者限制范围,那么可能会导致整个系统的崩溃。一般的采用跨平台编程语言开发的应用程序,都是运行在一个虚拟机或者解释引擎之上的。虚拟机或者解释引擎进一步运行在物联网设备的操作系统上。应用程序层面的错误,会被虚拟机或者解释引擎捕获,并进行特定的处理,比如终止应用程序的运行,而不会把应用层面的错误传播到系统层面。
但是传统的非跨硬件平台的编程语言,则无法限制错误范围。比如,采用C语言开发的应用程序,如果因为堆栈溢出或者指针错误而导致内存紊乱,则会导致整个系统崩溃,尤其是在内存管理单元(MMU)功能缺失的情况下,而这在物联网应用中是非常普遍的。跨硬件平台编程语言的一个不足,就是其运行效率会比传统的编译型语言(C/C++等)要低一些。这是因为大多数跨硬件平台的语言,都需要一个虚拟机(VM)或解释引擎的支持才能正常运行。
虚拟机或者解释引擎本身是一个运行在物联网操作系统之上的一个应用程序,它会读取应用程序的可执行文件或者源代码,然后分析解释,转换为目标CPU的指令并启动运行。而传统的编译型语言,则直接把源代码编译为目标计算机的指令集,可以直接被CPU执行。显然,这个中间转换的过程,会降低应用程序的执行效率。但是执行效率降低的程度,与虚拟机或者解释引擎的实现强相关。
有的虚拟机或者解释引擎,采用一些优化算法,并运用诸如“一次解释,多次运行”等机制,可以使得这种效率上的损失降到最低。比如Google推出的V8引擎,可以使得JavaScript语言编写的应用程序,能够基本达到C/C++程序的水平。因此,与跨硬件平台编程语言配合的VM或者解释器,也是至关重要的。
但无论如何优化,JavaScript等跨硬件平台语言始终无法真正赶上或者超于C/C++等编译型语言的效率。因此在一些对实时性和执行效率要求及其严格的场合,比如飞行控制,比如核电监控等等应用领域,在应用之前必须经过细致详尽的评估测试。如果跨平台语言无法满足目标场景的应用,那么建议还是采用传统语言来进行应用程序的开发。
毕竟,采用跨平台语言的初衷,是为了更好的扩大物联网应用程序的运行范围,能够降低开发效率和开发难度,快速的形成物联网生态圈。而这类要求极高的场景,已超出这个范畴。因此,对传统编程语言和编程API的支持,是物联网操作系统必须能够提供的能力。
2. 支持完善的面向对象机制面向对象是一种程序设计方法,或者说它是一种程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来模拟现实世界,从而完成程序设计任务。而在面向对象编程思想出现之前,软件行业流行的是模块化的编程思想,即把一个大的计算机程序(或者代码),按照功能拆分为一个一个小的源代码模块,通过明确定义的接口(API),把不同的功能模块组装在一起,形成最终的计算机程序。而面向对象则是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统)。
这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。面向对象编程方法,可以让程序员以更接近实际世界的方式来理解应用场景,建立程序开发模型,同时也可以大大加快开发速度。对于大型的软件,面向对象思想可以简化开发维护过程,降低开发成本。在物联网领域,面向对象编程思想更有价值。因为我们面对的是一个一个的“物”,每个物体都可以抽象为程序开发领域的一个对象,通过不同对象(物)之间的消息交互,可以快速完成复杂应用系统的开发。
相比传统的模块化编程思想,面向对象编程思想更适合物联网应用开发。需要说明的是,面向对象编程思想是一种方法,是一种编程的理念,理论上说,与具体的编程语言是没有关系的。众所周知,C语言是面向过程的开发语言,但是完全可以用C语言开发以面向对象思想设计的应用程序。比如HelloX物联网操作系统,完全采用面向对象的思想设计,但是在实现时,确是采用C语言来实现的。具体来说,就是采用C语言的函数指针,结构体等等语言特性,来模拟出“对象”,“方法”,“消息”,甚至“继承”等等面向对象的概念。
另外一个例子就是,著名的Windows NT操作系统内核,是完全按照面向对象思想设计的,但是其实现,仍然是采用C语言。但如果采用面向对象的语言,以面向对象的方法来开发物联网应用程序,会更加事半功倍。之所以用传统的非面向对象语言来开发应用程序,是一种折中的选择。因为如果采用C++或者Java等面向对象的语言,则由于语言本身的一些机制,会给操作系统级的开发带来影响。而且采用面向过程的语言来仿真面向对象编程语言,也是不彻底的,很多机制根本无法模仿,比如函数或方法的重载,动态对象类型等等。
如果不是系统级的程序开发,不是必须要用C或者汇编等这一类底层编程语言,那么采用面向对象的编程语言是最好选择。而物联网应用开发则符合这个前提,它是应用层面的开发,不需要对底层硬件进行管理和操作,因此不需要C/汇编等底层语言。这样采用诸如Java,JavaScript,Python等面向对象的语言,并采用面向对象的思想,显然是最好选择。
3. 支持事件驱动机制与以人为中心的传统软件开发模式不同,物联网时代的软件,都是受“事件”驱动的。面向物联网的程序,大多数情况下处理的是一个一个的外部事件,根据外部事件做出响应。比如一个火警探测设备,会针对“探测到起火”等异步事件,做出对应的动作。物联网软件开发,很多情况下就是编写一个一个的事件处理程序,并与事先定义好的事件关联在一起。这样一旦外部事件发生,则处理程序就会被调用。
这种以“事件”为中心的物联网编程方法,必须配以能够支持完善事件驱动机制的开发语言。需要说明的是,事件驱动是一种程序设计的方法,或者机制。很多语言都可以实现事件驱动的编程机制。比如C语言,通过联合运用回掉函数,函数指针等等语言特性,可以实现复杂的事件驱动机制。最典型的Windows操作系统,就是采用C语言实现了完整的事件驱动机制。
但是不同的语言,实现事件驱动机制的难易程度不同。采用C语言实现事件机制,需要相对复杂的语言特性,而且要设计一套复杂的底层框架来支持。但有的语言,实现事件机制则会相对简单。比如JavaScript语言,由于其动态类型的特征,以及函数本身就是对象的特点,实现事件驱动机制会非常简单。
4. Internet亲和性所谓Internet亲和性,是指能够与现有的Internet相关标准兼容,采用这种语言开发的应用程序,能够简单容易的集成到Internet上。我们认为,物联网不会是一个全新的网络,不会从零开始建立,它必然是基于现有Internet的延伸。支撑Internet的大部分核心协议,比如IP协议,TCP/UDP协议,HTTP/HTTPS协议,都会在物联网应用中得到重用。同时,Internet上的数据传输格式,比如JSON,XML,正则表达式(RegExp),也会被大量重用到物联网中。这样物联网就可以很容易的与现有的Internet互通和集成,重用现有的Internet基础架构。在此基础上,再进一步扩展和壮大。鉴于此,物联网应用程序开发语言,应该能够有效支持上述Internet已有的协议和特性。
当然,从理论上说,任何编程语言通过有效扩展,都可以实现上述特性的支持。即使汇编语言,我们对其从底层对其进行扩展,比如先实现一个基于汇编语言的TCP/IP协议栈,基于此协议栈再实现一系列的协议,包括HTTP/HTTPS等。对于数据交换格式的支持,我们也通过汇编语言,实现完整的JSON,XML等数据格式的封装和解析,实现完全的正则表达式。这样缺少什么,就补充什么,必然能够达到与Internet完全互通的目的。
但是这种代价就太大了,从实现角度,基本上是不可行的。而有的语言,由于在Internet应用开发中被广泛应用,从而对上述特性有了成熟广泛的支持。比如JavaScript,大部分的Intrernet前端应用程序(即在浏览器内运行的Internet页面,脚本,或者插件等)都是采用JavaScript开发。随着Node.js的流行和壮大,导致现在很多Internet的后端应用,都是采用JavaScript开发的。而且在Internet的数据交互中被广泛采用的JSON标准,也是直接由JavaScript发展而来。
JSON,就是JavaScript Object Notation的缩写,是JavaScript用于内部标识对象的数据格式。由于这种格式简单明了,表示能力强,逐渐替代了广泛使用的XML,成为Internet事实上的数据表示标准。因此,如果采用JavaScript作为Internet的应用开发语言,那就会天然支持Internet已有的协议和标准,从而与Internet做到最大程度的兼容和亲和。
5. 运行环境紧凑,占用内存少所谓的运行环境,是指支撑应用程序正常运行的相关组件,这些组件不属于某一个特定的应用程序,是所有采用同一种编程语言开发的应用程序都需要的公共组件。比如针对C/C++语言,C运行库(clib)和C++运行库就是运行环境的一部分,几乎所有的C/C++应用程序,都需要C运行库的支持。操作系统在加载应用程序的时候,同时要加载这些运行库组件。
运行库提供了应用程序所需的最基本函数和功能调用。 对于Java或者JavaScript,Python等这一类跨平台的编程语言,除公共代码库等组件外,还需要虚拟机或者解释引擎的支持。对Java语言来说,采用Java语言开发的应用程序首先被编译为Java字节码,然后被Java虚拟机加载和执行。而对于JavaScript等脚本语言来说,则直接被解释引擎加载和解释。
从操作系统的视角来看,虚拟机或者解释引擎本身就是一个应用程序。在物联网环境中,如果某一种开发语言的运行环境太大,在一些资源受限的场合就无法使用。因此,物联网应用开发语言的运行环境,必须足够紧凑,占用内存必须足够少。比如,在最极端的情况下,如果运行环境对内存的最低要不应该超过64K字节。
6. 使用简单方便,开发快速物联网操作系统的最核心价值,就是提供一个公共的物联网运行和开发平台,使得各种各样的物联网应用程序,都可以在这个平台上开发和运行。这样逐渐积累,最终会形成一个类似移动互联网领域的生态链,支撑物联网的大发展。而物联网应用开发语言是支撑这个生态环境壮大的基础。
如果物联网开发模式依然采用传统的嵌入式开发模式,采用C或者汇编作为主要的开发语言,需要程序员掌握硬件层面的每一个细节,包括CPU的指令集,硬件的I/O接口,甚至需要通过信号分析仪器去分析芯片的管脚输入和输出,则是无法推动物联网生态链发展壮大的。这种开发模式的入门门槛太高,而且开发效率太低,针对某一个硬件或者场景开发的代码,无法复用到其它的场景中。
因此,物联网开发语言和对应的开发模式必须足够简单,足够方便,把这种传统的开发门槛彻底降下来。理想的目标是,任何一个具有计算机基础的人员,经过几天甚至数小时的学习,就可以开发出实用的物联网程序。更理想的是,直接对已有的被广泛使用的编程语言进行改造,使之直接应用于物联网应用程序的开发。这样就可以充分利用已有的人才和代码积累,“站在巨人的肩膀上”。
比较典型的例子就是移动互联网领域的Android操作系统,采用Java语言作为应用程序开发语言,这样直接就继承了现有的丰富的Java开发资源,把当前数量庞大的Java工程师一下子变成了“Android程序员”。同时,对于开发物联网程序的方法和工具,也应该充分降低门槛。原有的嵌入式开发模式,需要安装专业的工具(编译器,连接器,调试器等),同时需要复杂的命令来构筑开发工具链。很多对嵌入式开发感兴趣的工程师,都因为开发环境的复杂,工具链的繁琐,而望而却步。
物联网应用开发必须改变这种状况,对开发人员“足够友好”。比如,采用单一的工具或集成开发环境,就可以完成程序的编写,编译,调试,模拟运行等所有开发工作。更简单的方式是,直接采用脚本语言,开发人员甚至不需要安装任何开发工具,直接通过记事本等文本编辑器编辑代码,然后直接上传到物联网设备中即可运行。这样开发门槛降下来了,自然会有大量的程序员加入进来。再建立一种代码分享机制,就会形成滚雪球效应,最终促进物联网生态环境的大发展。
从这个角度看,传统的编译型语言,比如C/C++,已经不适合物联网应用的开发。而脚本语言,比如JavaScript,则更有优势。二. 常见计算机开发语言对比分析下面对当前常见的计算机程序设计语言进行分析,比对物联网应用开发对编程语言的要求,看看哪一种编程语言更适合物联网的需求。
JavaScript是最适合物联网应用开发的。首先,把不能支持“跨硬件平台”特性的语言排除掉,这样C/C++语言就被排除出可选范围。再对比事件驱动机制和Internet亲和性两个角度,发现JavaScript语言最具有优势。对于运行环境的紧凑程度,Java和JavaScript不相上下,而Python语言目前不具有优势。因此综合对比下来,JavaScript语言最适合物联网应用的开发。
下面对每种语言,进行简单分析。首先看C语言,这是目前物联网和嵌入式领域应用开发的主流语言。但是由于C语言是一种编译型语言,必须由编译器根据目标硬件的CPU指令集,把C语言编译成适应特定硬件的可执行代码。这样的问题是,必须针对所有的目标硬件,都要对C语言进行编译和链接。同时由于硬件层面的差异性,在一种硬件平台上开发的C语言应用,在移植到另外一个硬件平台上时,必须修改源代码。这显然大大限制了C程序的应用范围。实际上,现在有大量的C语言代码,但是这些代码都是针对特定硬件开发的,因此无法直接移植。
C++语言的情况与此类似。C语言是一种面向过程的语言,没有内置的面向对象机制。这不像C++语言,C++语言提供了完整的面向对象编程语法和机制,比如class关键字,template关键字,类的继承,虚函数和函数重载等。这些丰富的面向对象的语言特性,可以使得C++语言很好的支持面向对象的开发。但C语言就没有提供此类内置特性,因此不是一种面向对象的编程语言。虽然采用C语言的函数指针,回掉函数,结构体(struct)等语言特性,可以实现简单的面向对象机制和事件驱动机制,但是与其它内置这些特性的开发语言相比,实现起来非常繁琐,且有的特性根本无法实现。
虽然C语言有这些不足,但是始终无法否认C语言是“编程语言之王”的崇高地位。正是C语言及C语言开发的软件,比如UNIX操作系统,Linux操作系统等,奠定了计算机领域的核心软件基础。支撑国计民生的核心系统中运行的核心程序,比如电力系统,航空航天系统,铁路运输系统,核电控制系统,通信网络系统等等,大部分都是采用C语言开发。毫不夸张的说,是C语言支撑起了当前的计算机和网络世界。
其它语言的底层运行环境,比如Java虚拟机,JavaScript解释引擎,Python解释引擎等等,都是采用C语言开发。即使C语言满足不了我们在这里定义的物联网编程语言的要求,但是在一些性能和实时性要求极端的场合,C语言仍然是唯一选择。C++语言的大部分情况与C语言类似。但与C语言不同的是,C++提供了丰富完整的面向对象编程机制。但正是这些面向对象机制,使得C++语言的运行环境变得比C复杂和不确定,在对目标可执行代码要求严格的嵌入式及操作系统领域,C++并不如C语言合适。
比如,为了实现C++语言的对象构造函数和析构函数,异常机制,虚函数等特性,C++语言编译器在编译的目标代码中,植入了程序员不可见的代码。这对系统级的编程是非常致命的,因为这些不可见的内置代码,系统程序员无法感知,出了问题也无从查起。但是由于C++语言的面向对象及编译型语言的高效快速等特征,使得C++语言非常适合对性能要求较高的应用程序开发,比如游戏应用,Internet浏览器等性能要求较高的大型应用程序。
但是由于C++语言不能跨硬件平台,因此不适合物联网应用开发。Java作为一种面向对象和跨平台语言,是比较适合物联网应用对开发语言的要求的。但是由于Java语言的开放程度并不如其它语言高,涉及到一些知识产权的纠葛。同时Oracle公司对Java的支持力度越来越低,因此Java语言呈现出逐渐式微的态势。同时,在Internet亲和性及事件驱动机制的支持力度上,Java并不如JavaScript,因此在我们的对比中,Java也被淘汰出局。Python语言也是一种被广泛应用的脚本编程语言,尤其是在大数据分析,数学处理领域,得到广泛应用。
但是其Internet亲和性并不如JavaScript,同时截至目前,Python解释器并没有被优化到可以支持资源受限系统应用的水平,因此Python仍然不如JavaScript。综合比对下来,在物联网应用开发领域,JavaScript最终胜出。接下来,我们对JavaScript语言进行更加详细的阐述。需要说明的是,这仅仅是在“物联网应用”开发领域,JavaScript具备优势。
在对性能和可靠性要求极度苛刻的物联网系统级开发场景,JavaScript仍然不适合,C语言仍然是这种场景的唯一选择。还有其它一些比较流行的语言,比如C#,VB,VBScript,GO,Delphi,Object-C等编程语言,我们并没有进行重点分析和比对。这是因为有些语言的开放性不足,比如C#或者Object-C,都只能在厂商特定的平台或工具上开发,还有一些语言的应用场景比较局限,因此暂时不作为重点分析对象。
因此,综上所述,就目前来说,我们认为JavaScript是比较适合物联网应用开发的编程语言。随着物联网的发展,未来或许有更加合适的编程语
相关推荐
评论列表
我要评论