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