十一款值得深入了解的物聯網編程語言
譯文對于物聯網項目而言,選擇編程語言的重要意義絕不在制定硬件平臺決策之下。在今天的文章中,我們將共同審視11款編程語言,并認真考量哪一種最適合自己的下一個編程項目。
物聯網開發項目目前正在全球范圍的諸多企業當中如火如荼地展開。新型硬件平臺的出現讓工程師們能夠以前所未有的便捷方式在物聯網應用當中構建嵌入式系統。一旦選定了合適的硬件平臺,接下來要做的就是為其開發應用軟件——先別高興得太早,到了這一步擺在我們面前的選項會更多、也更具挑戰。
就在不久之前,我們對于編程語言的選擇還受到硬件平臺方案的嚴格約束。不過時至今日,多數現代平臺已經基于開源標準并能夠支持多種編程語言類型,這樣出色的靈活性自然帶來了更多潛在選項。而這也正是我們今天所要解決的問題。
那么我們應該如何為特定物聯網項目選擇編程語言呢?在某些情況下,我們的潛在選項仍然會受到當前硬件平臺的限定。不過在其它條件下,大家完全可以立足于特定因素選擇語言類型,例如企業開發團隊對該語言的熟悉程度、其能夠在業務環境中整體物聯網系統的其它組件所使用,或者其代碼成果是否體積更小、執行效率更高或者編寫速度更快等等。
我們首先從眾多選項中挑選出了11款最為出色的語言,它們都能夠很好地完成嵌入式系統的編程任務。它們涵蓋范圍很廣,從用途廣泛的C++以及Java到專門面向嵌入式用例的Go以及Parasail皆在其中。每一款語言都有著自己的優勢與局限。在閱讀了今天的文章之后,也希望大家能夠在評論當中表達您的觀點與較為傾向的語言選項,幫助我們共同了解如何更好地構建起自己的嵌入式與物聯網開發項目。
C語言
作為一款最初用于進行電話交換機編程的語言,C確實是我們在考慮嵌入式系統開發時應當首先審視的合理選項。C語言屬于軟件開發世界中的一種通用語,其適用于幾乎每一款現有高級嵌入式系統平臺。某些平臺雖然無法直接支持C語言,但不可否認的是其仍然以基礎形式存在,支撐著SDK中的那些專用語言。
好消息是專業程序員們必然對C語言擁有較為深入的了解——如果做不到這一點,那么企業應該撥出專項資金幫助大家完成進修,這對于程序員自身的職業發展以及企業運營前景來說都將物有所值。從當下的角度審視,C語言身上確實存在著諸多過于陳舊的因素:它屬于過程語言而非面向對象語言;它并不具備內置的圖形用戶界面;而且采用編譯而非解釋機制。不過這一切負面因素反而在物聯網開發項目當中讓其成為最強而有力的語言候選人之一。
C++
自從上世紀八十年代初整個編程世界的發展車輪開始朝著面向對象語言滾動之時,Fortran、Cobol以及C這樣的過程語言就似乎注定了被人遺忘的命運。目前Fortran與Cobol已經徹底淪為利基型語言(雖然Cobol的利基范圍比較可觀,但其定位局限仍然非常明顯),而C語言則憑借著Bjarne Stroustrup的工作成果而繼續停留在公眾視野當中——其貢獻是為C語言開發出了一款面向對象的預處理程序,也就是我們所熟知的C++。
C++保留了C語言的特性,但同時加入了數據抽象、類以及對象等機制。這一切讓C++因為我們在Linux系統環境中編寫嵌入式及物聯網代碼時的熱門選項。這款編程語言自誕生至今已經跨越了三十多年的時光,但其在如今的嵌入式及物聯網開發領域仍然極具生命力。
#p#
Java
C與C++從起步階段的設計初衷就一直在于對其運行所在的硬件平臺進行直接控制。這種特性在需要對硬件進行細化程度極高的監測及控制時確實優勢明顯,但這同時也意味著我們所編寫的代碼需要從非常具體的角度考量硬件狀況。而用編程圈里的行話來說,就是代碼不太適合進行移植。
Java的設計思路則被打造成一款面向對象語言,因此具備非常出色的可移植性:編譯器當中幾乎不存在任何硬件依賴性。而要對特定硬件進行特殊而準確的控制,Java需要借助硬件所支持的庫并從中調用通用代碼。
這一切都讓Java擁有極具吸引力的經濟性定位:對Java代碼開發進行一次性投入,企業將能夠獲得足以運行在多種不同平臺之上的開發成果。Java同時也是當前人氣最高的主流編程語言之一,其被應用于成千上萬計算機科學與電子工程技術項目當中。因此我們能夠從人才市場上輕松找到能夠勝任相關工作的應聘者。但從另一方面講,選擇Java的問題在于我們必須確保自己所選定的平臺能夠支持Java(目前只有極少數強大的平臺會提供Java支持能力),同時又要保證這些硬件能夠支持我們為了實現特定控制功能所需要使用的庫。
JavaScript
從表面上看,大家很容易誤以為JavaScript屬于Java語言的某種衍生版本。完全可以理解,不過完全錯誤。這兩種語言確實在某種程度上存在類似或者說交集(例如某些庫可以同時與二者相兼容),但二者的開發過程完全獨立而且并不共享任何語法或者語義。
顧名思義,JavaScript是一種腳本語言,被廣泛應用于構建Web前端應用。如果大家打算在Raspberry Pi硬件平臺上使用Apache服務器,旨在從由Arduino傳感器構建的網絡當中提取數據,那么JavaScript絕對是個很好的起步選項。
自從被網景公司開發出來之時,JavaScript就一直在快速發展演進并已經成為一款功能齊備的語言。不過大家千萬別把它當成是什么輕量化嵌入式控制器——它所采用的解釋結構意味著我們需要承擔其運行成本。換言之,至少也得是Raspberry Pi這樣的系統才能承擔JavaScript所帶來的性能損失。
#p#
Python
這款在假期閑暇時間開發而成并借用著名喜劇團體命名的編程語言從表面上看似乎不太可能成為嚴肅開發項目的備選方案。然而事實證明,Python如今已經成為Web開發領域最具活力的語言選項之一,而且其應用范圍已經擴散到了嵌入式控制以及物聯網領域。Python在很多方面擁有極為出色的靈活性表現。舉例來說,它作為一種解釋語言能夠被提交至單一運行時編譯器當中,或者通過其中內置的預編譯器實現代碼運行,從而對其緊湊的可執行代碼進行分發。
而最讓編程團隊心動的是,Python語言擁有自己的一大專注重點,即高度強調代碼內容的可讀性。這款語言的設計規范提到了代碼可讀性以及緊湊優雅語法的重要意義。任何一位曾經試圖解讀他人C語言代碼并希望對其進行優化的朋友,應該都能深刻感受到代碼可讀性在實際工作中的關鍵作用。
與本篇文章提到的其它語言一樣,Python充當嵌入式語言的前提在于其運行所處的嵌入式平臺需要具備一定的計算能力。如果大家希望開發的是一款能夠獲取數據、將其以某種數據庫格式加以整理,而后匯總成表以實現信息控制的應用方案,那么Python絕對是位頗具競爭力的候選編程語言選手。
Go
首先必須強調一點:這里說的是“Go”,而不是“Go!”二者屬于完全不同的兩種語言,而且擁有完全不同的功能定位。Go由谷歌公司負責開發并廣泛適用于各類處理器及平臺。雖然它只是眾多源自C設計理念的編程語言當中的一種,但卻在面向特定嵌入式編程類型時擁有大量遠勝C語言的功能特性。
Go語言增加了一種顯式散列表類型,這些類型在從各種傳感器及執行器處收集數據并向其發送數據方面具備相當突出的實用性。Go語言還深入支持使用傳感器以及設備網絡的能力——當然,這同時也增加了潛在風險。
Go語言能夠大多種不同通道上支持并行輸入、輸出與處理。如果能夠正確使用,這一能力將使得整套傳感器及執行器組合得到良好協調。然而這種特性的風險在于,各通道之間也許并不能意識到對方的存在。如果編程人員有所疏忽,那么缺乏協調的系統就可能帶來不可預測的行為。從技術角度講,這顯然不是什么好事。
#p#
Rust
Rust語言由Mozilla公司開發而來。與Mozilla旗下的其它軟件類似,Rust屬于開源項目且擁有非常迅猛的演進速度。Rust語言擁有諸多源自Go的特性,不過它也解決了Go當中存在的一大主要問題。
由于Go語言無法自動在不同數據結構“通道”之間進行信息共享,因此最終開發出的程序有可能存在所謂“競態條件”。直白地講,這是一種無法控制的狀態,處于這一狀態下的系統會由于不同進程在運行時處于激烈沖突而導致工作無法完成。Rust語言當中包含的函數能夠消除競態條件,從而使其更為可靠地構建起高度并發程序。
同樣的,Rust語言對于運行平臺的性能也存在一定要求,不過如果大家的開發團隊希望開發一款涉及大量并發機制的應用,那么Rust與Go都是值得認真考量的編程語言選項。
Parasail
如果大家對于自己物聯網應用程序的并行處理能力擁有一定要求,那么Parasail語言也是個值得一試的選項。在之前介紹Go與Rust語言時,我們已經提到了編程概念當中的并發機制。如果大家不清楚并發與并行的區別(或者您的開發團隊無法明確解釋二者的差異),那么請在著手編碼之前認真查尋相關資料,保證自己的徹底明確之后再做決定。
Parasail是一款編譯型面向對象語言,其始終處于演進當中因此能夠通過與Java、Python、C#甚至是Ada(真的很難相信會在一種現代語言當中看到Ada的名頭)類似的語法進行編程。千萬別會錯意,如果大家打算構建一個物聯網項目,那么利用Ada進行編程絕對是個不錯的選擇。不過如果大家需要使用具備高度并行性的嵌入式代碼,那么Parasail則是最理想的語言選項。
#p#
B#
我們今天提到的很多語言都屬于大型系統語言,因此要讓其在嵌入式平臺上順利運行,我們需要對其進行具體調整。然而B#則不同,它的設計初衷就是一類著眼于小處的高效嵌入式控制語言。嵌入式虛擬機(簡稱EVM)允許B#語言運行在多種不同平臺之上,且內存占用量僅為24 k——遠低于我們之前提到的其它軟件包運行要求。
B#語言與C#在某種程度上比較類似(如果大家或者下轄技術團隊曾經開發過微軟.NET項目,那么對C#肯定不會陌生)。不過相較于C#,B#剔除了相當一部分在嵌入式項目中用不到的特性,并加入了對實時控制功能的支持——這一點在實際使用環境下顯然非常重要。
如果大家的項目如果大家的開發項目未來會運行在輕量級嵌入式平臺之上,其規模與復雜度皆低于Raspberry Pi,那么B#絕對是個值得認真考慮的編程語言選項。
匯編語言
如果大家希望嚴格遵循比較傳統的設計思路,或者需要盡可能讓自己的項目顯得比較緊湊,那么匯編程序就是達成目標的不二之選。匯編語言能夠構建并打包純粹的機器碼,從而保證大家在處理器之上擁有最為理想的執行效率。好消息是其對性能的要求被控制在最低水平,而且技術高超的行家能夠利用匯編語言實現很多在其它編程機制中根本不存在的優化技巧。
不過壞消息是,匯編語言的編程工作無法借力于網絡:大家幾乎找不到任何實用工具來幫助自己揪出開發成果中的各類錯誤。除此之外,匯編語言代碼以及相關程序編寫技能往往沒有任何承接性。具體來講,我們能夠針對一種處理器編寫出相關代碼,但這并不代表我們能夠面向其它處理器編寫出擁有同樣功能的代碼。
對于鐵桿程序員以及希望擁有終極優化效果的產品來講,匯編語言能夠將其體積控制在最低水平且保證其中不包含任何其它環境因素。不過可以肯定的是,匯編語言絕對不是構建原型方案的最佳方式——如果大家擁有較為充裕的空間及處理性能,那么請優先使用高級語言,現代語言中的諸多優勢還是能夠幫上忙的。
Forth
Forth是另一種專門針對嵌入式系統編程工作做出設計與優化的語言。雖然它的主要定位在于實現系統層級上的編程,但Forth還擁有另一大不可替代的優勢:它有點像是編程世界中的黑話。舉例來講,假如說某個群體以世界語作為母語,并傾向于使用它來跟我們交流,那么不懂世界語就會讓我們處于非常尷尬的境地。而在編程世界當中,Forth就是這樣一種等同于世界語的存在。
Forth語言屬于面向堆棧語言。如果大家經常使用那種老式惠普計算器(就是那種提供RPN操作模式的產品),那么肯定會對Forth具備一定程度的理解。作為一種誕生于上世紀七十年代的語言,Forth能夠在具備相關能力的程序員手中實現可觀的生產力與執行效率提升效果——而且其他人根本無法使用甚至閱讀由其編寫出的成果。
如果大家所在的開發團隊中存在著大量Forth程序員,那么請享受由此帶來的完全不同的工作體驗。而如果大家對Forth一無所知而又打算開發一款全新嵌入式項目,且樂于接受這一語言帶來的開發學習曲線,那么也不妨加以嘗試。不過如果各位身邊并不具備現成的Forth程序員儲備,同時又希望快速構建出原型設計方案,那么請直接選擇其它語言。
原文標題:11 IoT Programming Languages Worth Knowin