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