聯(lián) 系 人:前臺
0519-85967018
0519-85967018
中國.江蘇
江蘇省常州市新北區(qū)富強(qiáng)路1號
江蘇省常州市新北區(qū)富強(qiáng)路1號
關(guān)注官方微信
物聯(lián)網(wǎng)應(yīng)用開發(fā)對編程語言的要求
1. 開發(fā)語言必須是跨硬件平臺的
所謂跨硬件平臺,指的是編寫的物聯(lián)網(wǎng)應(yīng)用程序,能夠在多種不同的目標(biāo)硬件設(shè)備上運行,而不用重新編譯甚至修改應(yīng)用程序。這里的不同的目標(biāo)硬件,主要是指CPU指令集,內(nèi)存大小,外設(shè)的接口類型,外設(shè)的訪問方式等等硬件層面的東西。如果開發(fā)語言不是跨硬件平臺的,那么針對一種硬件平臺開發(fā)的應(yīng)用程序,就只能運行在這一種硬件設(shè)備上。因為硬件平臺的具體細(xì)節(jié)情況,都體現(xiàn)在目標(biāo)程序中。最典型的例子是采用C語言開發(fā)的應(yīng)用程序,必須根據(jù)不同的目標(biāo)CPU指令集,編譯成匹配目標(biāo)指令集的二進(jìn)制代碼,才能運行。這樣如果切換到另外一種指令集的CPU,則必須重新編譯,甚至要重新修改應(yīng)用程序。這在硬件標(biāo)準(zhǔn)化程度非常高的個人計算機(jī)領(lǐng)域,問題不大,因為通用的CPU類型就那么幾種(Intel,ARM等),而且硬件配置都非常標(biāo)準(zhǔn),硬盤等存儲設(shè)備,顯示器,鍵盤/鼠標(biāo)等輸入設(shè)備,USB接口,網(wǎng)絡(luò)接口等等,都是標(biāo)配。因此針對不同硬件平臺的軟件移植工作量并不大。但到了物聯(lián)網(wǎng)時代,這顯然無法滿足物聯(lián)網(wǎng)硬件碎片化特征的需要。在物聯(lián)網(wǎng)環(huán)境中,目標(biāo)設(shè)備CPU的種類是PC時代的數(shù)十倍,同時硬件配置也各不相同,大部分物聯(lián)網(wǎng)設(shè)備的配置都千差萬別,因此,如果仍然采用傳統(tǒng)的不能跨硬件的開發(fā)語言來編寫物聯(lián)網(wǎng)應(yīng)用程序,那么對同一種功能的應(yīng)用程序來說,就需要針對不同的CPU類型,不同的硬件配置,分別進(jìn)行開發(fā)和部署。這顯然是無法逾越的困難。
而采用跨平臺的編程語言,則可以解決這個問題。比如針對智能攝像頭而言,A廠商的攝像頭個的配置,可能是ARM的CPU,USB接口,分辨率是1024*768等,而B廠商的攝像頭可能是基于x86的CPU,SPI接口?;跀z像頭編寫一個人臉識別程序,如果采用跨平臺的編程語言,則針對A廠商設(shè)備編寫的應(yīng)用程序,可以直接在B廠家的設(shè)備上使用。但是如果編程語言不是跨硬件平臺的,比如C/C++語言,則針對A廠家的攝像頭編寫的應(yīng)用程序,必須經(jīng)過重新編譯(甚至還需要大量的修改)之后,才能在B廠家的攝像頭上運行。物聯(lián)網(wǎng)設(shè)備的碎片化特征,決定了開發(fā)語言必須是跨硬件平臺的。
采用跨硬件平臺開發(fā)語言的另外一個好處,就是限制錯誤范圍,不會因為應(yīng)用程序?qū)用娴腻e誤,而導(dǎo)致整個系統(tǒng)崩潰。由于物聯(lián)網(wǎng)設(shè)備硬件配置的巨大差異,由硬件與軟件不匹配導(dǎo)致的錯誤會大大增加。比如,還是上面的智能攝像頭的例子,如果應(yīng)用程序通過人臉識別,發(fā)現(xiàn)可疑人員進(jìn)入某個特定的范圍,則會引發(fā)報警。報警的方式有很多種,比如會給智能攝像頭的后臺發(fā)送告警信息,調(diào)用本地的揚聲器發(fā)出警報,甚至在智能攝像頭的屏幕上輸出告警文字等。很可能有的攝像頭沒有配置本地?fù)P聲裝置,而有的攝像頭則沒有配置本地顯示器。這時候上述應(yīng)用程序的告警代碼,就會因為無法找到硬件而出現(xiàn)錯誤。如果這種錯誤不被有效隔離或者限制范圍,那么可能會導(dǎo)致整個系統(tǒng)的崩潰。
一般的采用跨平臺編程語言開發(fā)的應(yīng)用程序,都是運行在一個虛擬機(jī)或者解釋引擎之上的。虛擬機(jī)或者解釋引擎進(jìn)一步運行在物聯(lián)網(wǎng)設(shè)備的操作系統(tǒng)上。應(yīng)用程序?qū)用娴腻e誤,會被虛擬機(jī)或者解釋引擎捕獲,并進(jìn)行特定的處理,比如終止應(yīng)用程序的運行,而不會把應(yīng)用層面的錯誤傳播到系統(tǒng)層面。但是傳統(tǒng)的非跨硬件平臺的編程語言,則無法限制錯誤范圍。比如,采用C語言開發(fā)的應(yīng)用程序,如果因為堆棧溢出或者指針錯誤而導(dǎo)致內(nèi)存紊亂,則會導(dǎo)致整個系統(tǒng)崩潰,尤其是在內(nèi)存管理單元(MMU)功能缺失的情況下,而這在物聯(lián)網(wǎng)應(yīng)用中是非常普遍的。
跨硬件平臺編程語言的一個不足,就是其運行效率會比傳統(tǒng)的編譯型語言(C/C++等)要低一些。這是因為大多數(shù)跨硬件平臺的語言,都需要一個虛擬機(jī)(VM)或解釋引擎的支持才能正常運行。虛擬機(jī)或者解釋引擎本身是一個運行在物聯(lián)網(wǎng)操作系統(tǒng)之上的一個應(yīng)用程序,它會讀取應(yīng)用程序的可執(zhí)行文件或者源代碼,然后分析解釋,轉(zhuǎn)換為目標(biāo)CPU的指令并啟動運行。而傳統(tǒng)的編譯型語言,則直接把源代碼編譯為目標(biāo)計算機(jī)的指令集,可以直接被CPU執(zhí)行。顯然,這個中間轉(zhuǎn)換的過程,會降低應(yīng)用程序的執(zhí)行效率。但是執(zhí)行效率降低的程度,與虛擬機(jī)或者解釋引擎的實現(xiàn)強(qiáng)相關(guān)。有的虛擬機(jī)或者解釋引擎,采用一些優(yōu)化算法,并運用諸如“一次解釋,多次運行”等機(jī)制,可以使得這種效率上的損失降到最低。比如Google推出的V8引擎,可以使得JavaScript語言編寫的應(yīng)用程序,能夠基本達(dá)到C/C++程序的水平。因此,與跨硬件平臺編程語言配合的VM或者解釋器,也是至關(guān)重要的。
但無論如何優(yōu)化,JavaScript等跨硬件平臺語言始終無法真正趕上或者超于C/C++等編譯型語言的效率。因此在一些對實時性和執(zhí)行效率要求及其嚴(yán)格的場合,比如飛行控制,比如核電監(jiān)控等等應(yīng)用領(lǐng)域,在應(yīng)用之前必須經(jīng)過細(xì)致詳盡的評估測試。如果跨平臺語言無法滿足目標(biāo)場景的應(yīng)用,那么建議還是采用傳統(tǒng)語言來進(jìn)行應(yīng)用程序的開發(fā)。畢竟,采用跨平臺語言的初衷,是為了更好的擴(kuò)大物聯(lián)網(wǎng)應(yīng)用程序的運行范圍,能夠降低開發(fā)效率和開發(fā)難度,快速的形成物聯(lián)網(wǎng)生態(tài)圈。而這類要求極高的場景,已超出這個范疇。因此,對傳統(tǒng)編程語言和編程API的支持,是物聯(lián)網(wǎng)操作系統(tǒng)必須能夠提供的能力。
面向?qū)ο笫且环N程序設(shè)計方法,或者說它是一種程序設(shè)計范型,其基本思想是使用對象,類,繼承,封裝,消息等基本概念來模擬現(xiàn)實世界,從而完成程序設(shè)計任務(wù)。而在面向?qū)ο缶幊趟枷氤霈F(xiàn)之前,軟件行業(yè)流行的是模塊化的編程思想,即把一個大的計算機(jī)程序(或者代碼),按照功能拆分為一個一個小的源代碼模塊,通過明確定義的接口(API),把不同的功能模塊組裝在一起,形成最終的計算機(jī)程序。
而面向?qū)ο髣t是從現(xiàn)實世界中客觀存在的事物(即對象)出發(fā)來構(gòu)造軟件系統(tǒng),并在系統(tǒng)構(gòu)造中盡可能運用人類的自然思維方式,強(qiáng)調(diào)直接以問題域(現(xiàn)實世界)中的事物為中心來思考問題,認(rèn)識問題,并根據(jù)這些事物的本質(zhì)特點,把它們抽象地表示為系統(tǒng)中的對象,作為系統(tǒng)的基本構(gòu)成單位(而不是用一些與現(xiàn)實世界中的事物相關(guān)比較遠(yuǎn),并且沒有對應(yīng)關(guān)系的其它概念來構(gòu)造系統(tǒng))。這可以使系統(tǒng)直接地映射問題域,保持問題域中事物及其相互關(guān)系的本來面貌。
面向?qū)ο缶幊谭椒?,可以讓程序員以更接近實際世界的方式來理解應(yīng)用場景,建立程序開發(fā)模型,同時也可以大大加快開發(fā)速度。對于大型的軟件,面向?qū)ο笏枷肟梢院喕_發(fā)維護(hù)過程,降低開發(fā)成本。在物聯(lián)網(wǎng)領(lǐng)域,面向?qū)ο缶幊趟枷敫袃r值。因為我們面對的是一個一個的“物”,每個物體都可以抽象為程序開發(fā)領(lǐng)域的一個對象,通過不同對象(物)之間的消息交互,可以快速完成復(fù)雜應(yīng)用系統(tǒng)的開發(fā)。相比傳統(tǒng)的模塊化編程思想,面向?qū)ο缶幊趟枷敫m合物聯(lián)網(wǎng)應(yīng)用開發(fā)。
需要說明的是,面向?qū)ο缶幊趟枷胧且环N方法,是一種編程的理念,理論上說,與具體的編程語言是沒有關(guān)系的。眾所周知,C語言是面向過程的開發(fā)語言,但是完全可以用C語言開發(fā)以面向?qū)ο笏枷朐O(shè)計的應(yīng)用程序。比如HelloX物聯(lián)網(wǎng)操作系統(tǒng),完全采用面向?qū)ο蟮乃枷朐O(shè)計,但是在實現(xiàn)時,確是采用C語言來實現(xiàn)的。具體來說,就是采用C語言的函數(shù)指針,結(jié)構(gòu)體等等語言特性,來模擬出“對象”,“方法”,“消息”,甚至“繼承”等等面向?qū)ο蟮母拍?。另外一個例子就是,著名的Windows NT操作系統(tǒng)內(nèi)核,是完全按照面向?qū)ο笏枷朐O(shè)計的,但是其實現(xiàn),仍然是采用C語言。
但如果采用面向?qū)ο蟮恼Z言,以面向?qū)ο蟮姆椒▉黹_發(fā)物聯(lián)網(wǎng)應(yīng)用程序,會更加事半功倍。之所以用傳統(tǒng)的非面向?qū)ο笳Z言來開發(fā)應(yīng)用程序,是一種折中的選擇。因為如果采用C++或者Java等面向?qū)ο蟮恼Z言,則由于語言本身的一些機(jī)制,會給操作系統(tǒng)級的開發(fā)帶來影響。而且采用面向過程的語言來仿真面向?qū)ο缶幊陶Z言,也是不徹底的,很多機(jī)制根本無法模仿,比如函數(shù)或方法的重載,動態(tài)對象類型等等。如果不是系統(tǒng)級的程序開發(fā),不是必須要用C或者匯編等這一類底層編程語言,那么采用面向?qū)ο蟮木幊陶Z言是最好選擇。
而物聯(lián)網(wǎng)應(yīng)用開發(fā)則符合這個前提,它是應(yīng)用層面的開發(fā),不需要對底層硬件進(jìn)行管理和操作,因此不需要C/匯編等底層語言。這樣采用諸如Java,JavaScript,Python等面向?qū)ο蟮恼Z言,并采用面向?qū)ο蟮乃枷耄@然是最好選擇。
3. 支持事件驅(qū)動機(jī)制
與以人為中心的傳統(tǒng)軟件開發(fā)模式不同,物聯(lián)網(wǎng)時代的軟件,都是受“事件”驅(qū)動的。面向物聯(lián)網(wǎng)的程序,大多數(shù)情況下處理的是一個一個的外部事件,根據(jù)外部事件做出響應(yīng)。比如一個火警探測設(shè)備,會針對“探測到起火”等異步事件,做出對應(yīng)的動作。物聯(lián)網(wǎng)軟件開發(fā),很多情況下就是編寫一個一個的事件處理程序,并與事先定義好的事件關(guān)聯(lián)在一起。這樣一旦外部事件發(fā)生,則處理程序就會被調(diào)用。這種以“事件”為中心的物聯(lián)網(wǎng)編程方法,必須配以能夠支持完善事件驅(qū)動機(jī)制的開發(fā)語言。
需要說明的是,事件驅(qū)動是一種程序設(shè)計的方法,或者機(jī)制。很多語言都可以實現(xiàn)事件驅(qū)動的編程機(jī)制。比如C語言,通過聯(lián)合運用回掉函數(shù),函數(shù)指針等等語言特性,可以實現(xiàn)復(fù)雜的事件驅(qū)動機(jī)制。最典型的Windows操作系統(tǒng),就是采用C語言實現(xiàn)了完整的事件驅(qū)動機(jī)制。但是不同的語言,實現(xiàn)事件驅(qū)動機(jī)制的難易程度不同。采用C語言實現(xiàn)事件機(jī)制,需要相對復(fù)雜的語言特性,而且要設(shè)計一套復(fù)雜的底層框架來支持。但有的語言,實現(xiàn)事件機(jī)制則會相對簡單。比如JavaScript語言,由于其動態(tài)類型的特征,以及函數(shù)本身就是對象的特點,實現(xiàn)事件驅(qū)動機(jī)制會非常簡單。
4. Internet親和性
所謂Internet親和性,是指能夠與現(xiàn)有的Internet相關(guān)標(biāo)準(zhǔn)兼容,采用這種語言開發(fā)的應(yīng)用程序,能夠簡單容易的集成到Internet上。我們認(rèn)為,物聯(lián)網(wǎng)不會是一個全新的網(wǎng)絡(luò),不會從零開始建立,它必然是基于現(xiàn)有Internet的延伸。支撐Internet的大部分核心協(xié)議,比如IP協(xié)議,TCP/UDP協(xié)議,HTTP/HTTPS協(xié)議,都會在物聯(lián)網(wǎng)應(yīng)用中得到重用。同時,Internet上的數(shù)據(jù)傳輸格式,比如JSON,XML,正則表達(dá)式(RegExp),也會被大量重用到物聯(lián)網(wǎng)中。這樣物聯(lián)網(wǎng)就可以很容易的與現(xiàn)有的Internet互通和集成,重用現(xiàn)有的Internet基礎(chǔ)架構(gòu)。在此基礎(chǔ)上,再進(jìn)一步擴(kuò)展和壯大。
鑒于此,物聯(lián)網(wǎng)應(yīng)用程序開發(fā)語言,應(yīng)該能夠有效支持上述Internet已有的協(xié)議和特性。當(dāng)然,從理論上說,任何編程語言通過有效擴(kuò)展,都可以實現(xiàn)上述特性的支持。即使匯編語言,我們對其從底層對其進(jìn)行擴(kuò)展,比如先實現(xiàn)一個基于匯編語言的TCP/IP協(xié)議棧,基于此協(xié)議棧再實現(xiàn)一系列的協(xié)議,包括HTTP/HTTPS等。對于數(shù)據(jù)交換格式的支持,我們也通過匯編語言,實現(xiàn)完整的JSON,XML等數(shù)據(jù)格式的封裝和解析,實現(xiàn)完全的正則表達(dá)式。這樣缺少什么,就補(bǔ)充什么,必然能夠達(dá)到與Internet完全互通的目的。但是這種代價就太大了,從實現(xiàn)角度,基本上是不可行的。
而有的語言,由于在Internet應(yīng)用開發(fā)中被廣泛應(yīng)用,從而對上述特性有了成熟廣泛的支持。比如JavaScript,大部分的Intrernet前端應(yīng)用程序(即在瀏覽器內(nèi)運行的Internet頁面,腳本,或者插件等)都是采用JavaScript開發(fā)。隨著Node.js的流行和壯大,導(dǎo)致現(xiàn)在很多Internet的后端應(yīng)用,都是采用JavaScript開發(fā)的。而且在Internet的數(shù)據(jù)交互中被廣泛采用的JSON標(biāo)準(zhǔn),也是直接由JavaScript發(fā)展而來。JSON,就是JavaScript Object Notation的縮寫,是JavaScript用于內(nèi)部標(biāo)識對象的數(shù)據(jù)格式。由于這種格式簡單明了,表示能力強(qiáng),逐漸替代了廣泛使用的XML,成為Internet事實上的數(shù)據(jù)表示標(biāo)準(zhǔn)。因此,如果采用JavaScript作為Internet的應(yīng)用開發(fā)語言,那就會天然支持Internet已有的協(xié)議和標(biāo)準(zhǔn),從而與Internet做到最大程度的兼容和親和。
所謂的運行環(huán)境,是指支撐應(yīng)用程序正常運行的相關(guān)組件,這些組件不屬于某一個特定的應(yīng)用程序,是所有采用同一種編程語言開發(fā)的應(yīng)用程序都需要的公共組件。比如針對C/C++語言,C運行庫(clib)和C++運行庫就是運行環(huán)境的一部分,幾乎所有的C/C++應(yīng)用程序,都需要C運行庫的支持。操作系統(tǒng)在加載應(yīng)用程序的時候,同時要加載這些運行庫組件。運行庫提供了應(yīng)用程序所需的最基本函數(shù)和功能調(diào)用。
對于Java或者JavaScript,Python等這一類跨平臺的編程語言,除公共代碼庫等組件外,還需要虛擬機(jī)或者解釋引擎的支持。對Java語言來說,采用Java語言開發(fā)的應(yīng)用程序首先被編譯為Java字節(jié)碼,然后被Java虛擬機(jī)加載和執(zhí)行。而對于JavaScript等腳本語言來說,則直接被解釋引擎加載和解釋。從操作系統(tǒng)的視角來看,虛擬機(jī)或者解釋引擎本身就是一個應(yīng)用程序。
在物聯(lián)網(wǎng)環(huán)境中,如果某一種開發(fā)語言的運行環(huán)境太大,在一些資源受限的場合就無法使用。因此,物聯(lián)網(wǎng)應(yīng)用開發(fā)語言的運行環(huán)境,必須足夠緊湊,占用內(nèi)存必須足夠少。比如,在最極端的情況下,如果運行環(huán)境對內(nèi)存的最低要不應(yīng)該超過64K字節(jié)。
物聯(lián)網(wǎng)操作系統(tǒng)的最核心價值,就是提供一個公共的物聯(lián)網(wǎng)運行和開發(fā)平臺,使得各種各樣的物聯(lián)網(wǎng)應(yīng)用程序,都可以在這個平臺上開發(fā)和運行。這樣逐漸積累,最終會形成一個類似移動互聯(lián)網(wǎng)領(lǐng)域的生態(tài)鏈,支撐物聯(lián)網(wǎng)的大發(fā)展。而物聯(lián)網(wǎng)應(yīng)用開發(fā)語言是支撐這個生態(tài)環(huán)境壯大的基礎(chǔ)。
如果物聯(lián)網(wǎng)開發(fā)模式依然采用傳統(tǒng)的嵌入式開發(fā)模式,采用C或者匯編作為主要的開發(fā)語言,需要程序員掌握硬件層面的每一個細(xì)節(jié),包括CPU的指令集,硬件的I/O接口,甚至需要通過信號分析儀器去分析芯片的管腳輸入和輸出,則是無法推動物聯(lián)網(wǎng)生態(tài)鏈發(fā)展壯大的。這種開發(fā)模式的入門門檻太高,而且開發(fā)效率太低,針對某一個硬件或者場景開發(fā)的代碼,無法復(fù)用到其它的場景中。
因此,物聯(lián)網(wǎng)開發(fā)語言和對應(yīng)的開發(fā)模式必須足夠簡單,足夠方便,把這種傳統(tǒng)的開發(fā)門檻徹底降下來。理想的目標(biāo)是,任何一個具有計算機(jī)基礎(chǔ)的人員,經(jīng)過幾天甚至數(shù)小時的學(xué)習(xí),就可以開發(fā)出實用的物聯(lián)網(wǎng)程序。更理想的是,直接對已有的被廣泛使用的編程語言進(jìn)行改造,使之直接應(yīng)用于物聯(lián)網(wǎng)應(yīng)用程序的開發(fā)。這樣就可以充分利用已有的人才和代碼積累,“站在巨人的肩膀上”。比較典型的例子就是移動互聯(lián)網(wǎng)領(lǐng)域的Android操作系統(tǒng),采用Java語言作為應(yīng)用程序開發(fā)語言,這樣直接就繼承了現(xiàn)有的豐富的Java開發(fā)資源,把當(dāng)前數(shù)量龐大的Java工程師一下子變成了“Android程序員”。
同時,對于開發(fā)物聯(lián)網(wǎng)程序的方法和工具,也應(yīng)該充分降低門檻。原有的嵌入式開發(fā)模式,需要安裝專業(yè)的工具(編譯器,連接器,調(diào)試器等),同時需要復(fù)雜的命令來構(gòu)筑開發(fā)工具鏈。很多對嵌入式開發(fā)感興趣的工程師,都因為開發(fā)環(huán)境的復(fù)雜,工具鏈的繁瑣,而望而卻步。物聯(lián)網(wǎng)應(yīng)用開發(fā)必須改變這種狀況,對開發(fā)人員“足夠友好”。比如,采用單一的工具或集成開發(fā)環(huán)境,就可以完成程序的編寫,編譯,調(diào)試,模擬運行等所有開發(fā)工作。更簡單的方式是,直接采用腳本語言,開發(fā)人員甚至不需要安裝任何開發(fā)工具,直接通過記事本等文本編輯器編輯代碼,然后直接上傳到物聯(lián)網(wǎng)設(shè)備中即可運行。這樣開發(fā)門檻降下來了,自然會有大量的程序員加入進(jìn)來。再建立一種代碼分享機(jī)制,就會形成滾雪球效應(yīng),最終促進(jìn)物聯(lián)網(wǎng)生態(tài)環(huán)境的大發(fā)展。
從這個角度看,傳統(tǒng)的編譯型語言,比如C/C++,已經(jīng)不適合物聯(lián)網(wǎng)應(yīng)用的開發(fā)。而腳本語言,比如JavaScript,則更有優(yōu)勢。
二. 常見計算機(jī)開發(fā)語言對比分析
下面對當(dāng)前常見的計算機(jī)程序設(shè)計語言進(jìn)行分析,比對物聯(lián)網(wǎng)應(yīng)用開發(fā)對編程語言的要求,看看哪一種編程語言更適合物聯(lián)網(wǎng)的需求。下面的表格示意了常見編程語言的對比:
對比角度/編程語言 |
C |
C++ |
Java |
JavaScript |
Python |
跨硬件平臺 |
不支持 |
不支持 |
支持 |
支持 |
支持 |
面向?qū)ο? |
不支持 |
支持 |
支持 |
支持 |
支持 |
事件驅(qū)動機(jī)制 |
一般支持 |
一般支持 |
一般支持 |
良好支持 |
一般支持 |
Internet親和性 |
低 |
低 |
中 |
高 |
中 |
運行環(huán)境緊湊程度 |
高 |
高 |
中 |
中 |
低 |
從這個對比表中可以看出,JavaScript是最適合物聯(lián)網(wǎng)應(yīng)用開發(fā)的。首先,把不能支持“跨硬件平臺”特性的語言排除掉,這樣C/C++語言就被排除出可選范圍。再對比事件驅(qū)動機(jī)制和Internet親和性兩個角度,發(fā)現(xiàn)JavaScript語言最具有優(yōu)勢。對于運行環(huán)境的緊湊程度,Java和JavaScript不相上下,而Python語言目前不具有優(yōu)勢。因此綜合對比下來,JavaScript語言最適合物聯(lián)網(wǎng)應(yīng)用的開發(fā)。
下面對每種語言,進(jìn)行簡單分析。
首先看C語言,這是目前物聯(lián)網(wǎng)和嵌入式領(lǐng)域應(yīng)用開發(fā)的主流語言。但是由于C語言是一種編譯型語言,必須由編譯器根據(jù)目標(biāo)硬件的CPU指令集,把C語言編譯成適應(yīng)特定硬件的可執(zhí)行代碼。這樣的問題是,必須針對所有的目標(biāo)硬件,都要對C語言進(jìn)行編譯和鏈接。同時由于硬件層面的差異性,在一種硬件平臺上開發(fā)的C語言應(yīng)用,在移植到另外一個硬件平臺上時,必須修改源代碼。這顯然大大限制了C程序的應(yīng)用范圍。實際上,現(xiàn)在有大量的C語言代碼,但是這些代碼都是針對特定硬件開發(fā)的,因此無法直接移植。C++語言的情況與此類似。
C語言是一種面向過程的語言,沒有內(nèi)置的面向?qū)ο髾C(jī)制。這不像C++語言,C++語言提供了完整的面向?qū)ο缶幊陶Z法和機(jī)制,比如class關(guān)鍵字,template關(guān)鍵字,類的繼承,虛函數(shù)和函數(shù)重載等。這些豐富的面向?qū)ο蟮恼Z言特性,可以使得C++語言很好的支持面向?qū)ο蟮拈_發(fā)。但C語言就沒有提供此類內(nèi)置特性,因此不是一種面向?qū)ο蟮木幊陶Z言。
雖然采用C語言的函數(shù)指針,回掉函數(shù),結(jié)構(gòu)體(struct)等語言特性,可以實現(xiàn)簡單的面向?qū)ο髾C(jī)制和事件驅(qū)動機(jī)制,但是與其它內(nèi)置這些特性的開發(fā)語言相比,實現(xiàn)起來非常繁瑣,且有的特性根本無法實現(xiàn)。
雖然C語言有這些不足,但是始終無法否認(rèn)C語言是“編程語言之王”的崇高地位。正是C語言及C語言開發(fā)的軟件,比如UNIX操作系統(tǒng),Linux操作系統(tǒng)等,奠定了計算機(jī)領(lǐng)域的核心軟件基礎(chǔ)。支撐國計民生的核心系統(tǒng)中運行的核心程序,比如電力系統(tǒng),航空航天系統(tǒng),鐵路運輸系統(tǒng),核電控制系統(tǒng),通信網(wǎng)絡(luò)系統(tǒng)等等,大部分都是采用C語言開發(fā)。毫不夸張的說,是C語言支撐起了當(dāng)前的計算機(jī)和網(wǎng)絡(luò)世界。其它語言的底層運行環(huán)境,比如Java虛擬機(jī),JavaScript解釋引擎,Python解釋引擎等等,都是采用C語言開發(fā)。即使C語言滿足不了我們在這里定義的物聯(lián)網(wǎng)編程語言的要求,但是在一些性能和實時性要求極端的場合,C語言仍然是唯一選擇。
C++語言的大部分情況與C語言類似。但與C語言不同的是,C++提供了豐富完整的面向?qū)ο缶幊虣C(jī)制。但正是這些面向?qū)ο髾C(jī)制,使得C++語言的運行環(huán)境變得比C復(fù)雜和不確定,在對目標(biāo)可執(zhí)行代碼要求嚴(yán)格的嵌入式及操作系統(tǒng)領(lǐng)域,C++并不如C語言合適。比如,為了實現(xiàn)C++語言的對象構(gòu)造函數(shù)和析構(gòu)函數(shù),異常機(jī)制,虛函數(shù)等特性,C++語言編譯器在編譯的目標(biāo)代碼中,植入了程序員不可見的代碼。這對系統(tǒng)級的編程是非常致命的,因為這些不可見的內(nèi)置代碼,系統(tǒng)程序員無法感知,出了問題也無從查起。但是由于C++語言的面向?qū)ο蠹熬幾g型語言的高效快速等特征,使得C++語言非常適合對性能要求較高的應(yīng)用程序開發(fā),比如游戲應(yīng)用,Internet瀏覽器等性能要求較高的大型應(yīng)用程序。但是由于C++語言不能跨硬件平臺,因此不適合物聯(lián)網(wǎng)應(yīng)用開發(fā)。
Java作為一種面向?qū)ο蠛涂缙脚_語言,是比較適合物聯(lián)網(wǎng)應(yīng)用對開發(fā)語言的要求的。但是由于Java語言的開放程度并不如其它語言高,涉及到一些知識產(chǎn)權(quán)的糾葛。同時Oracle公司對Java的支持力度越來越低,因此Java語言呈現(xiàn)出逐漸式微的態(tài)勢。同時,在Internet親和性及事件驅(qū)動機(jī)制的支持力度上,Java并不如JavaScript,因此在我們的對比中,Java也被淘汰出局。
Python語言也是一種被廣泛應(yīng)用的腳本編程語言,尤其是在大數(shù)據(jù)分析,數(shù)學(xué)處理領(lǐng)域,得到廣泛應(yīng)用。但是其Internet親和性并不如JavaScript,同時截至目前,Python解釋器并沒有被優(yōu)化到可以支持資源受限系統(tǒng)應(yīng)用的水平,因此Python仍然不如JavaScript。
綜合比對下來,在物聯(lián)網(wǎng)應(yīng)用開發(fā)領(lǐng)域,JavaScript最終勝出。接下來,我們對JavaScript語言進(jìn)行更加詳細(xì)的闡述。需要說明的是,這僅僅是在“物聯(lián)網(wǎng)應(yīng)用”開發(fā)領(lǐng)域,JavaScript具備優(yōu)勢。在對性能和可靠性要求極度苛刻的物聯(lián)網(wǎng)系統(tǒng)級開發(fā)場景,JavaScript仍然不適合,C語言仍然是這種場景的唯一選擇。
還有其它一些比較流行的語言,比如C#,VB,VBScript,GO,Delphi,Object-C等編程語言,我們并沒有進(jìn)行重點分析和比對。這是因為有些語言的開放性不足,比如C#或者Object-C,都只能在廠商特定的平臺或工具上開發(fā),還有一些語言的應(yīng)用場景比較局限,因此暫時不作為重點分析對象。
因此,綜上所述,就目前來說,我們認(rèn)為JavaScript是比較適合物聯(lián)網(wǎng)應(yīng)用開發(fā)的編程語言。隨著物聯(lián)網(wǎng)的發(fā)展,未來或許有更加合適的編程語言被開發(fā)出來。
上一個新聞:物聯(lián)網(wǎng)+人工智能,未來大有可為
下一個新聞:企業(yè)如何應(yīng)用ERP?