现在是一个物联网的世界,很多人选择了做物联网项目。
对于物联网项目而言,选择编程语言的重要意义绝不在制定硬件平台决策之下。在今天的文章中,我们将共同审视11款编程语言,并认真考量哪一种最适合自己的下一个编程项目。
物联网开发项目目前正在全球范围的诸多企业当中如火如荼地展开。新型硬件平台的出现让工程师们能够以前所未有的便捷方式在物联网应用当中构建嵌入式系统。一旦选定了合适的硬件平台,接下来要做的就是为其开发应用软件——先别高兴得太早,到了这一步摆在我们面前的选项会更多、也更具挑战。
就在不久之前,我们对于编程语言的选择还受到硬件平台方案的严格约束。不过时至今日,多数现代平台已经基于开源标准并能够支持多种编程语言类型,这样出色的灵活性自然带来了更多潜在选项。而这也正是我们今天所要解决的问题。
那么我们应该如何为特定物联网项目选择编程语言呢?在某些情况下,我们的潜在选项仍然会受到当前硬件平台的限定。不过在其它条件下,大家完全可以立足于特定因素选择语言类型,例如企业开发团队对该语言的熟悉程度、其能够在业务环境中整体物联网系统的其它组件所使用,或者其代码成果是否体积更小、执行效率更高或者编写速度更快等等。
我们首先从众多选项中挑选出了11款最为出色的语言,它们都能够很好地完成嵌入式系统的编程任务。它们涵盖范围很广,从用途广泛的C++以及Java到专门面向嵌入式用例的Go以及Parasail皆在其中。每一款语言都有着自己的优势与局限。在阅读了今天的文章之后,也希望大家能够在评论当中表达您的观点与较为倾向的语言选项,帮助我们共同了解如何更好地构建起自己的嵌入式与物联网开发项目。
作为一款最初用于进行电话交换机编程的语言,C确实是我们在考虑嵌入式系统开发时应当首先审视的合理选项。C语言属于软件开发世界中的一种通用语,其适用于几乎每一款现有高级嵌入式系统平台。某些平台虽然无法直接支持C语言,但不可否认的是其仍然以基础形式存在,支撑着SDK中的那些专用语言。
好消息是专业程序员们必然对C语言拥有较为深入的了解——如果做不到这一点,那么企业应该拨出专项资金帮助大家完成进修,这对于程序员自身的职业发展以及企业运营前景来说都将物有所值。从当下的角度审视,C语言身上确实存在着诸多过于陈旧的因素:它属于过程语言而非面向对象语言;它并不具备内置的图形用户界面;而且采用编译而非解释机制。不过这一切负面因素反而在物联网开发项目当中让其成为最强而有力的语言候选人之一。
自从上世纪八十年代初整个编程世界的发展车轮开始朝着面向对象语言滚动之时,Fortran、Cobol以及C这样的过程语言就似乎注定了被人遗忘的命运。目前Fortran与Cobol已经彻底沦为利基型语言(虽然Cobol的利基范围比较可观,但其定位局限仍然非常明显),而C语言则凭借着Bjarne Stroustrup的工作成果而继续停留在公众视野当中——其贡献是为C语言开发出了一款面向对象的预处理程序,也就是我们所熟知的C++。
C++保留了C语言的特性,但同时加入了数据抽象、类以及对象等机制。这一切让C++因为我们在Linux系统环境中编写嵌入式及物联网代码时的热门选项。这款编程语言自诞生至今已经跨越了三十多年的时光,但其在如今的嵌入式及物联网开发领域仍然极具生命力。
C与C++从起步阶段的设计初衷就一直在于对其运行所在的硬件平台进行直接控制。这种特性在需要对硬件进行细化程度极高的监测及控制时确实优势明显,但这同时也意味着我们所编写的代码需要从非常具体的角度考量硬件状况。而用编程圈里的行话来说,就是代码不太适合进行移植。
Java的设计思路则被打造成一款面向对象语言,因此具备非常出色的可移植性:编译器当中几乎不存在任何硬件依赖性。而要对特定硬件进行特殊而准确的控制,Java需要借助硬件所支持的库并从中调用通用代码。
这一切都让Java拥有极具吸引力的经济性定位:对Java代码开发进行一次性投入,企业将能够获得足以运行在多种不同平台之上的开发成果。Java同时也是当前人气最高的主流编程语言之一,其被应用于成千上万计算机科学与电子工程技术项目当中。因此我们能够从人才市场上轻松找到能够胜任相关工作的应聘者。但从另一方面讲,选择Java的问题在于我们必须确保自己所选定的平台能够支持Java(目前只有极少数强大的平台会提供Java支持能力),同时又要保证这些硬件能够支持我们为了实现特定控制功能所需要使用的库。
从表面上看,大家很容易误以为JavaScript属于Java语言的某种衍生版本。完全可以理解,不过完全错误。这两种语言确实在某种程度上存在类似或者说交集(例如某些库可以同时与二者相兼容),但二者的开发过程完全独立而且并不共享任何语法或者语义。
顾名思义,JavaScript是一种脚本语言,被广泛应用于构建Web前端应用。如果大家打算在Raspberry Pi硬件平台上使用Apache服务器,旨在从由Arduino传感器构建的网络当中提取数据,那么JavaScript绝对是个很好的起步选项。
自从被网景公司开发出来之时,JavaScript就一直在快速发展演进并已经成为一款功能齐备的语言。不过大家千万别把它当成是什么轻量化嵌入式控制器——它所采用的解释结构意味着我们需要承担其运行成本。换言之,至少也得是Raspberry Pi这样的系统才能承担JavaScript所带来的性能损失。
这款在假期闲暇时间开发而成并借用著名喜剧团体命名的编程语言从表面上看似乎不太可能成为严肃开发项目的备选方案。然而事实证明,Python如今已经成为Web开发领域最具活力的语言选项之一,而且其应用范围已经扩散到了嵌入式控制以及物联网领域。Python在很多方面拥有极为出色的灵活性表现。举例来说,它作为一种解释语言能够被提交至单一运行时编译器当中,或者通过其中内置的预编译器实现代码运行,从而对其紧凑的可执行代码进行分发。
而最让编程团队心动的是,Python语言拥有自己的一大专注重点,即高度强调代码内容的可读性。这款语言的设计规范提到了代码可读性以及紧凑优雅语法的重要意义。任何一位曾经试图解读他人C语言代码并希望对其进行优化的朋友,应该都能深刻感受到代码可读性在实际工作中的关键作用。
与本篇文章提到的其它语言一样,Python充当嵌入式语言的前提在于其运行所处的嵌入式平台需要具备一定的计算能力。如果大家希望开发的是一款能够获取数据、将其以某种数据库格式加以整理,而后汇总成表以实现信息控制的应用方案,那么Python绝对是位颇具竞争力的候选编程语言选手。
首先必须强调一点:这里说的是“Go”,而不是“Go!”二者属于完全不同的两种语言,而且拥有完全不同的功能定位。Go由谷歌公司负责开发并广泛适用于各类处理器及平台。虽然它只是众多源自C设计理念的编程语言当中的一种,但却在面向特定嵌入式编程类型时拥有大量远胜C语言的功能特性。
Go语言增加了一种显式散列表类型,这些类型在从各种传感器及执行器处收集数据并向其发送数据方面具备相当突出的实用性。Go语言还深入支持使用传感器以及设备网络的能力——当然,这同时也增加了潜在风险。
Go语言能够大多种不同通道上支持并行输入、输出与处理。如果能够正确使用,这一能力将使得整套传感器及执行器组合得到良好协调。然而这种特性的风险在于,各通道之间也许并不能意识到对方的存在。如果编程人员有所疏忽,那么缺乏协调的系统就可能带来不可预测的行为。从技术角度讲,这显然不是什么好事。
Rust语言由Mozilla公司开发而来。与Mozilla旗下的其它软件类似,Rust属于开源项目且拥有非常迅猛的演进速度。Rust语言拥有诸多源自Go的特性,不过它也解决了Go当中存在的一大主要问题。
由于Go语言无法自动在不同数据结构“通道”之间进行信息共享,因此最终开发出的程序有可能存在所谓“竞态条件”。直白地讲,这是一种无法控制的状态,处于这一状态下的系统会由于不同进程在运行时处于激烈冲突而导致工作无法完成。Rust语言当中包含的函数能够消除竞态条件,从而使其更为可靠地构建起高度并发程序。
同样的,Rust语言对于运行平台的性能也存在一定要求,不过如果大家的开发团队希望开发一款涉及大量并发机制的应用,那么Rust与Go都是值得认真考量的编程语言选项。
如果大家对于自己物联网应用程序的并行处理能力拥有一定要求,那么Parasail语言也是个值得一试的选项。在之前介绍Go与Rust语言时,我们已经提到了编程概念当中的并发机制。如果大家不清楚并发与并行的区别(或者您的开发团队无法明确解释二者的差异),那么请在着手编码之前认真查寻相关资料,保证自己的彻底明确之后再做决定。
Parasail是一款编译型面向对象语言,其始终处于演进当中因此能够通过与Java、Python、C#甚至是Ada(真的很难相信会在一种现代语言当中看到Ada的名头)类似的语法进行编程。千万别会错意,如果大家打算构建一个物联网项目,那么利用Ada进行编程绝对是个不错的选择。不过如果大家需要使用具备高度并行性的嵌入式代码,那么Parasail则是最理想的语言选项。
我们今天提到的很多语言都属于大型系统语言,因此要让其在嵌入式平台上顺利运行,我们需要对其进行具体调整。然而B#则不同,它的设计初衷就是一类着眼于小处的高效嵌入式控制语言。嵌入式虚拟机(简称EVM)允许B#语言运行在多种不同平台之上,且内存占用量仅为24 k——远低于我们之前提到的其它软件包运行要求。
B#语言与C#在某种程度上比较类似(如果大家或者下辖技术团队曾经开发过微软.NET项目,那么对C#肯定不会陌生)。不过相较于C#,B#剔除了相当一部分在嵌入式项目中用不到的特性,并加入了对实时控制功能的支持——这一点在实际使用环境下显然非常重要。
如果大家的项目如果大家的开发项目未来会运行在轻量级嵌入式平台之上,其规模与复杂度皆低于Raspberry Pi,那么B#绝对是个值得认真考虑的编程语言选项。
如果大家希望严格遵循比较传统的设计思路,或者需要尽可能让自己的项目显得比较紧凑,那么汇编程序就是达成目标的不二之选。汇编语言能够构建并打包纯粹的机器码,从而保证大家在处理器之上拥有最为理想的执行效率。好消息是其对性能的要求被控制在最低水平,而且技术高超的行家能够利用汇编语言实现很多在其它编程机制中根本不存在的优化技巧。
不过坏消息是,汇编语言的编程工作无法借力于网络:大家几乎找不到任何实用工具来帮助自己揪出开发成果中的各类错误。除此之外,汇编语言代码以及相关程序编写技能往往没有任何承接性。具体来讲,我们能够针对一种处理器编写出相关代码,但这并不代表我们能够面向其它处理器编写出拥有同样功能的代码。
对于铁杆程序员以及希望拥有终极优化效果的产品来讲,汇编语言能够将其体积控制在最低水平且保证其中不包含任何其它环境因素。不过可以肯定的是,汇编语言绝对不是构建原型方案的最佳方式——如果大家拥有较为充裕的空间及处理性能,那么请优先使用高级语言,现代语言中的诸多优势还是能够帮上忙的。
Forth是另一种专门针对嵌入式系统编程工作做出设计与优化的语言。虽然它的主要定位在于实现系统层级上的编程,但Forth还拥有另一大不可替代的优势:它有点像是编程世界中的黑话。举例来讲,假如说某个群体以世界语作为母语,并倾向于使用它来跟我们交流,那么不懂世界语就会让我们处于非常尴尬的境地。而在编程世界当中,Forth就是这样一种等同于世界语的存在。
Forth语言属于面向堆栈语言。如果大家经常使用那种老式惠普计算器(就是那种提供RPN操作模式的产品),那么肯定会对Forth具备一定程度的理解。作为一种诞生于上世纪七十年代的语言,Forth能够在具备相关能力的程序员手中实现可观的生产力与执行效率提升效果——而且其他人根本无法使用甚至阅读由其编写出的成果。
如果大家所在的开发团队中存在着大量Forth程序员,那么请享受由此带来的完全不同的工作体验。而如果大家对Forth一无所知而又打算开发一款全新嵌入式项目,且乐于接受这一语言带来的开发学习曲线,那么也不妨加以尝试。不过如果各位身边并不具备现成的Forth程序员储备,同时又希望快速构建出原型设计方案,那么请直接选择其它语言。