開(kāi)發(fā)物聯(lián)網(wǎng)應(yīng)用時(shí),選擇合適的程序開(kāi)發(fā)語(yǔ)言和選擇合適的硬件平臺(tái)一樣重要。本文將會(huì)列出一些你可能會(huì)用到的語(yǔ)言,并有適當(dāng)?shù)膽?yīng)用場(chǎng)景分析;不過(guò)在你繼續(xù)閱讀之前,不妨試著來(lái)預(yù)測(cè)一下下面會(huì)出現(xiàn)哪些語(yǔ)言。
物聯(lián)網(wǎng)現(xiàn)在是個(gè)大熱門(mén)相信誰(shuí)也不能否認(rèn),各種開(kāi)發(fā)項(xiàng)目正如雨后春筍般出現(xiàn)在地球村的各個(gè)角落。不斷出現(xiàn)的新硬件平臺(tái)讓工程師能夠越來(lái)越容易地打造新的嵌入式設(shè)備。當(dāng)你選擇了其中的某一個(gè)硬件平臺(tái)之后,你還需要為其開(kāi)發(fā)相應(yīng)的應(yīng)用程序,而這才是你的嵌入式設(shè)備設(shè)計(jì)的關(guān)鍵。
不久之前,在開(kāi)發(fā)應(yīng)用程序時(shí)所使用的開(kāi)發(fā)語(yǔ)言的選擇還只取決于硬件平臺(tái)的選擇。但現(xiàn)在隨著越來(lái)越多基于開(kāi)源標(biāo)準(zhǔn)的開(kāi)發(fā)平臺(tái)的出現(xiàn),其所支持的開(kāi)發(fā)語(yǔ)言也越來(lái)越多,也能實(shí)現(xiàn)更加復(fù)雜的功能。
那么當(dāng)你在開(kāi)發(fā)特定的物聯(lián)網(wǎng)項(xiàng)目時(shí),你會(huì)怎樣選擇你的開(kāi)發(fā)語(yǔ)言呢?當(dāng)然一般情況下,你的選擇還是應(yīng)當(dāng)基于你的硬件平臺(tái)。而在另一些情況下,你會(huì)更傾向于你的開(kāi)發(fā)團(tuán)隊(duì)已經(jīng)熟悉的開(kāi)發(fā)語(yǔ)言,或者取決于其在物聯(lián)網(wǎng)系統(tǒng)中與其它組件的協(xié)同作用或其代碼執(zhí)行的效率、速度等因素。
在考慮到嵌入式開(kāi)發(fā)系統(tǒng)時(shí),我們梳理出了11種為有用的開(kāi)發(fā)語(yǔ)言:從常見(jiàn)的C++和Java到對(duì)嵌入式開(kāi)發(fā)很友好的Go和Parasail。當(dāng)然這些開(kāi)發(fā)語(yǔ)言都各有優(yōu)劣,不能簡(jiǎn)單地一概而論。
下面就讓我們開(kāi)始進(jìn)入正題吧!
1、C
C語(yǔ)言早是用來(lái)為電話交換機(jī)編程的,所以其作為嵌入式開(kāi)發(fā)的合理選項(xiàng)也是一件很自然的事情。C語(yǔ)言可以被看作是軟件開(kāi)發(fā)世界的一門(mén)通用語(yǔ)言:基本上其可用于幾乎所有的嵌入式系統(tǒng)平臺(tái);雖然仍有少部分平臺(tái)不支持C語(yǔ)言,但C語(yǔ)言仍然是其專用語(yǔ)言軟件工具包的開(kāi)發(fā)的基礎(chǔ)。
通常情況下,一個(gè)專業(yè)的程序員對(duì)C語(yǔ)言都有了很好的了解,就算目前他們并沒(méi)有這樣做,但如果其在職業(yè)生涯中學(xué)習(xí)一些C語(yǔ)言,對(duì)其職業(yè)的未來(lái)也是大有回報(bào)的。今天看來(lái),C語(yǔ)言確實(shí)是有一點(diǎn)落后了:它是一門(mén)面向過(guò)程而非面向?qū)ο蟮拈_(kāi)發(fā)語(yǔ)言,不附帶內(nèi)置圖形用戶界面,而且語(yǔ)言需要經(jīng)過(guò)編譯、而不是解釋。盡管如此,C語(yǔ)言仍然是物聯(lián)網(wǎng)開(kāi)發(fā)的重要候選項(xiàng)之一。
2、C++
在1980年代,當(dāng)程序開(kāi)發(fā)開(kāi)始向“面向?qū)ο蟆鞭D(zhuǎn)變時(shí),面向過(guò)程的開(kāi)發(fā)語(yǔ)言Fortran、Cobol和C看起來(lái)似乎就要銷(xiāo)聲匿跡了。后來(lái),Fortran和Cobol語(yǔ)言真的進(jìn)入了博物館,而C語(yǔ)言則在Bjarne Stroustrup的幫助下獲得了一個(gè)面向?qū)ο蟮念A(yù)處理器——這個(gè)預(yù)處理器后來(lái)被稱為C++。
C++保留了C的基本性質(zhì),還額外增加了數(shù)據(jù)抽象、類和對(duì)象。所有的這些特性使得C++成為編寫(xiě)基于Linux的嵌入式和物聯(lián)網(wǎng)代碼的熱門(mén)選擇。這門(mén)編程語(yǔ)言的使用壽命已經(jīng)超過(guò)了30年,而且至今還依然很強(qiáng)大。
3、Java
C和C++都更接近底層設(shè)計(jì),所以其允許對(duì)其運(yùn)行的硬件進(jìn)行非常直接的控制。當(dāng)你在需要對(duì)硬件進(jìn)行非常精細(xì)的監(jiān)測(cè)和控制時(shí),他們都是很好的選擇,但這也意味著所寫(xiě)出的代碼專用化程度很高,也就是說(shuō)代碼的移植性比較差。
Java是一種面向?qū)ο蟮拈_(kāi)發(fā)語(yǔ)言,其擁有非常良好的移植性:編譯器中的硬件依賴型性非常少!為了實(shí)現(xiàn)對(duì)特定硬件部分的精細(xì)控制,Java依賴于各種硬件支持庫(kù)。
從經(jīng)濟(jì)角度上看,Java是一門(mén)非常強(qiáng)大的語(yǔ)言:對(duì)Java代碼的一次投入可以在多個(gè)不同的平臺(tái)收貨果實(shí)。而且在全球許多不同的大學(xué)中,Java也是作為計(jì)算機(jī)科學(xué)和電子工程的主要編程教學(xué)語(yǔ)言之一,所以懂得Java的人才也比較多。但是首先你要確定你選擇的平臺(tái)支持Java,因?yàn)橥ǔP阅茉降偷钠脚_(tái)對(duì)Java的支持也越低;而且還要確保你有合適的硬件支持庫(kù)。
4、JavaScript
人們很容易就將JavaScript是為了Java的變種,但這是錯(cuò)誤的。這兩種編程語(yǔ)言確實(shí)在一些地方有共同之處(比如兩者之間有一些庫(kù)是可以共用的),但這兩種語(yǔ)言是分別開(kāi)發(fā)出來(lái)的,并沒(méi)有語(yǔ)法和語(yǔ)義的共享。
JavaScript,顧名思義,是一種腳本語(yǔ)言。這種腳本語(yǔ)言被廣泛地應(yīng)用在網(wǎng)頁(yè)前端應(yīng)用的構(gòu)建上。比如,如果你想在樹(shù)莓派上面使用Apache服務(wù)器來(lái)收集基于Arduino的傳感器網(wǎng)絡(luò)數(shù)據(jù),JavaScript就能為你提供很大的幫助。
JavaScript出現(xiàn)在Netscape上,而現(xiàn)在它已經(jīng)成長(zhǎng)為一門(mén)功能齊全的語(yǔ)言。盡管如此,你卻不能使用其來(lái)為你的輕量級(jí)嵌入式控制器進(jìn)行開(kāi)發(fā),因?yàn)槠浣忉屝缘慕Y(jié)構(gòu)意味著需要為之付出額外的代價(jià);換句話說(shuō),你至少需要在樹(shù)莓派等級(jí)的設(shè)備上使用這門(mén)語(yǔ)言。
5、Python
一門(mén)在節(jié)假日開(kāi)發(fā)的、以一個(gè)戲劇劇團(tuán)命名的語(yǔ)言似乎看起來(lái)不應(yīng)該成為嚴(yán)肅的開(kāi)發(fā)應(yīng)用的候選者。然而,Python已經(jīng)成為了網(wǎng)頁(yè)開(kāi)發(fā)中的“go-to”開(kāi)發(fā)語(yǔ)言之一,而其應(yīng)用領(lǐng)域也已經(jīng)擴(kuò)展到了嵌入式控制和物聯(lián)網(wǎng)領(lǐng)域。Python在很多方面都非常靈活。比如,其實(shí)一種解釋性的語(yǔ)言,其可以被提交給運(yùn)行時(shí)編譯器或者通過(guò)多個(gè)預(yù)編譯器中一個(gè)運(yùn)行,這樣可以使得緊湊的可執(zhí)行代碼進(jìn)行分布式的處理。
Python對(duì)編程團(tuán)隊(duì)來(lái)說(shuō)非常的原因是其對(duì)代碼可讀性的強(qiáng)調(diào)。該語(yǔ)言的設(shè)計(jì)規(guī)范強(qiáng)調(diào)了可讀性和緊湊的、優(yōu)雅的語(yǔ)法的重要性。任何從事過(guò)優(yōu)化別人的C語(yǔ)言代碼工作的人都會(huì)對(duì)優(yōu)良的可讀性心存感激。
在眾多的語(yǔ)言中,Python成為嵌入式開(kāi)發(fā)語(yǔ)言的可能取決于嵌入式平臺(tái)是否有足夠的功率。對(duì)于任何需要收集數(shù)據(jù)的應(yīng)用而言,都需要以某種數(shù)據(jù)庫(kù)格式將其所收集到信息轉(zhuǎn)變?yōu)榭刂菩畔ⅲ?span>Python則是一個(gè)有力的競(jìng)爭(zhēng)者。
6、Go
首先要說(shuō)明的是Go語(yǔ)言和Go!語(yǔ)言并不一樣。這是兩種十分不同的語(yǔ)言,其使用的目的也十分不同。Go語(yǔ)言是由谷歌領(lǐng)銜推出的一款程序開(kāi)發(fā)語(yǔ)言,可廣泛地應(yīng)用在多種處理器和平臺(tái)上。盡管其和許多編程語(yǔ)言一樣,Go也在C中吸取了很多靈感,但Go在很多方面有C無(wú)法媲美的優(yōu)點(diǎn)。
Go增加了一個(gè)明確的哈希表的類型,這種類型對(duì)于從傳感器收集數(shù)據(jù)和發(fā)送數(shù)據(jù)到傳感器和執(zhí)行器都非常有用。對(duì)傳感器和設(shè)備網(wǎng)絡(luò)的進(jìn)一步支持是Go語(yǔ)言的關(guān)鍵之一,盡管其引入了一些風(fēng)險(xiǎn)。
Go支持多個(gè)信道上并發(fā)的輸入、輸出和處理。如果得到正確的使用,將使得整個(gè)傳感器和執(zhí)行器系統(tǒng)完全協(xié)調(diào)地運(yùn)作。但其風(fēng)險(xiǎn)是不同線程之間不一定知道彼此。如果程序員不小心,因?yàn)槠渲腥狈α藚f(xié)調(diào),系統(tǒng)可能會(huì)以某個(gè)完全無(wú)法預(yù)料的方式運(yùn)行。
7、Rust
Rust是Mozilla開(kāi)發(fā)的注重安全、性能和并發(fā)性的編程語(yǔ)言。創(chuàng)建這個(gè)新語(yǔ)言的目的是為了解決一個(gè)很頑疾的問(wèn)題:軟件的演進(jìn)速度大大低于硬件的演進(jìn),軟件在語(yǔ)言級(jí)別上無(wú)法真正利用多核計(jì)算帶來(lái)的性能提升。
正如Mozilla的其它軟件一樣,Rust也是一個(gè)開(kāi)源的項(xiàng)目,而且現(xiàn)在這門(mén)語(yǔ)言也正在飛速的進(jìn)化著。Rust具有很多和Go類似的性質(zhì),而且其還解決了Go語(yǔ)言的一個(gè)主要的大問(wèn)題。
因?yàn)?span>Go語(yǔ)言并不自動(dòng)在不同的“信道”數(shù)據(jù)結(jié)構(gòu)之間共享信息,程序可能會(huì)出現(xiàn)資源競(jìng)爭(zhēng)(race condition)的狀況,這是多線程編程中比較頭疼的問(wèn)題。因?yàn)椴煌倪M(jìn)程同時(shí)訪問(wèn)相同的共享數(shù)據(jù)而造成數(shù)據(jù)的不一致性會(huì)終導(dǎo)致系統(tǒng)失控。Rust包括了消除資源競(jìng)爭(zhēng)的功能,使得其在高度并行的程序方案中比Go語(yǔ)言的風(fēng)險(xiǎn)更低。
這門(mén)語(yǔ)言還需要一些發(fā)展的動(dòng)力,但如果你的團(tuán)隊(duì)需要打造一款需要并法計(jì)算的應(yīng)用程序,你應(yīng)該在Rust和Go之間做出合適的選擇,到底哪一個(gè)更適合你。
8、Parasail
如果你在你的物聯(lián)網(wǎng)應(yīng)用中需要考慮并行處理的要求,Parasail就是你所需要的語(yǔ)言。在Go和Rust語(yǔ)言中,我們已經(jīng)提到了并發(fā)。但如果你還不知道并行和并發(fā)之間區(qū)別(并行是指在同一時(shí)刻,有多條指令在多個(gè)處理器上同時(shí)執(zhí)行。并發(fā)是指在同一時(shí)刻,只能有一條指令執(zhí)行,但多個(gè)進(jìn)程指令被快速輪換執(zhí)行,使得在宏觀上具有多個(gè)進(jìn)程同時(shí)執(zhí)行的效果。)不要急著確定你所需要的編程語(yǔ)言,先研究研究吧。
9、B#
前面提到的所有語(yǔ)言都是大型的開(kāi)發(fā)語(yǔ)言,在應(yīng)用到嵌入式平臺(tái)時(shí)都需要經(jīng)過(guò)適當(dāng)?shù)木?jiǎn),而B#則一開(kāi)始就是作為一種小型的高效的嵌入式控制語(yǔ)言而設(shè)計(jì)的。嵌入式虛擬機(jī)(EVM)允許B#運(yùn)行在不同的平臺(tái)上,所需的內(nèi)存僅為24K,比其它開(kāi)發(fā)語(yǔ)言所需要的內(nèi)存要小得多。
B#看起來(lái)有一點(diǎn)類似于C#(如果你的貨你的團(tuán)隊(duì)有人從事過(guò)Microsoft
.NET項(xiàng)目開(kāi)發(fā),你一定不會(huì)對(duì)C#感到陌生),但其并不包含許多C#中對(duì)嵌入式項(xiàng)目沒(méi)有價(jià)值的特性,同時(shí)還增加了對(duì)實(shí)時(shí)控制的支持。
10、匯編語(yǔ)言
如果你真的對(duì)老古董感興趣,或是你的項(xiàng)目對(duì)緊湊度的要求非常非常高,那么匯編語(yǔ)言將是你的不二選擇(請(qǐng)不要說(shuō)機(jī)器語(yǔ)言,那不是人能讀懂的,好嗎?。?。匯編語(yǔ)言是一種用來(lái)封裝和得到純凈的機(jī)器碼的方式,而機(jī)器碼就是處理器終執(zhí)行的代碼。匯編代碼的編輯不需要太大的開(kāi)銷(xiāo),而且相關(guān)專家還可以用匯編代碼來(lái)實(shí)現(xiàn)其它更的語(yǔ)言所不能實(shí)現(xiàn)的功能。
然而壞消息是匯編編程沒(méi)有真正可用的工具來(lái)阻止你犯愚蠢的錯(cuò)誤。而且更糟糕的是匯編代碼的移植性非常差,甚至你為一款處理器而學(xué)習(xí)的匯編技巧也無(wú)法應(yīng)用到另一款處理器上。
對(duì)于骨灰級(jí)的程序員和產(chǎn)品的終發(fā)行版優(yōu)化時(shí),匯編可以為你提供很大的幫助,因?yàn)檫@時(shí)候你并不再需要考慮代碼的移植性了。但對(duì)于原型機(jī)開(kāi)發(fā)而言,這顯然不是一種有效的開(kāi)發(fā)方式;畢竟這個(gè)時(shí)代,你完全可以采用更加的開(kāi)發(fā)語(yǔ)言了。
11、Forth
Forth是另一款被優(yōu)化來(lái)為嵌入式系統(tǒng)開(kāi)發(fā)服務(wù)的語(yǔ)言。盡管其通常被用于系統(tǒng)層級(jí)的程序開(kāi)發(fā),但有一點(diǎn)卻不能不提:這款語(yǔ)言就像是一個(gè)宗教。你知道一些世界語(yǔ)(Esperanto)者會(huì)在機(jī)場(chǎng)用你完全不能理解的語(yǔ)言和你交談嗎?Forth就是程序開(kāi)發(fā)世界的Esperanto。
Forth是一種面向堆棧的語(yǔ)言,如果你有一個(gè)古老的惠普計(jì)算器(具備RPN(逆波蘭表達(dá)式)運(yùn)算功能,那么你就能在你的計(jì)算器上面發(fā)現(xiàn)Forth。這款語(yǔ)言自1970年代誕生以來(lái)一直都有人使用,但只有在正確地使用者手里才能發(fā)揮出其高產(chǎn)高效的本事,但對(duì)于其他人來(lái)說(shuō),由這門(mén)語(yǔ)言所設(shè)計(jì)的代碼簡(jiǎn)直是無(wú)法使用甚至不能閱讀的。
對(duì)于如今發(fā)展的如火如荼的物聯(lián)網(wǎng)來(lái)說(shuō),想要入門(mén)掌握好其中一門(mén)語(yǔ)言那是必須要做的功課,進(jìn)入粵嵌IT培訓(xùn)班,快速掌握python語(yǔ)言、嵌入式開(kāi)發(fā)等技術(shù),讓你憑借著扎實(shí)的能力在物聯(lián)網(wǎng)的世界里遨游。