在互聯(lián)網(wǎng)上,經(jīng)常有物聯(lián)網(wǎng)全棧開發(fā)編程語言的選擇這一議題。這是一個(gè)很無聊,而且被反復(fù)咀嚼的問題,卻總是被各類媒體、包括新媒體、出版社、雜志社用來吸引眼球。工程技術(shù)人員被迫站隊(duì),把純技術(shù)的爭論上升到類似宗教,“面子”的高度,很容易對事不對人,彼此之間黨同伐異。
工具鏈的選擇因素
互聯(lián)網(wǎng)全棧開發(fā)來自JavaScript的宣傳,特指Web前端和后端。物聯(lián)網(wǎng)時(shí)代則帶來了新的概念,加入了終端設(shè)備及網(wǎng)關(guān)的固件開發(fā),以及后面延展的數(shù)據(jù)分析、機(jī)器學(xué)習(xí)和人工智能。當(dāng)然,ML/AI已經(jīng)單獨(dú)成為一個(gè)門類,我們可以暫時(shí)可以不去考慮。
從很多角度看,工程中使用何種工具鏈取決于:
- 組織機(jī)構(gòu)的慣例;
- 現(xiàn)有代碼;
- 工程實(shí)現(xiàn)所需的框架成熟度;
- 開發(fā)者的技術(shù)背景;
- 效率要求;
如果是嵌入式系統(tǒng)硬件領(lǐng)域開發(fā),那么C/C++作為首選工作語言,那么選擇Python可以幫助擴(kuò)展到全棧開發(fā)。詳情請看我所著的《從芯片到云端:Python物聯(lián)網(wǎng)全棧開發(fā)》,但是Python在Web前端、可視化領(lǐng)域需要配合JS進(jìn)行工作。
如果是IT/CS/Web領(lǐng)域的工程人員,使用過C#/Java/JavaScript,選擇JS領(lǐng)域,尤其是Node.js的覆蓋范圍下,也可以實(shí)現(xiàn)全棧開發(fā)。但是在嵌入式開發(fā)所需的芯片仿真、邏輯設(shè)計(jì)、輔助工具、數(shù)據(jù)分析方面還需要補(bǔ)強(qiáng),需要Python的支持。
工程實(shí)踐中的工具鏈搭配
本節(jié)僅僅從開發(fā)效率出發(fā),推薦IoT常用的工具鏈。
| 任務(wù) | 語言 | 工具或框架 |
|---|---|---|
| 電路邏輯設(shè)計(jì) | HDL/Python | MyHDL |
| 模擬電路仿真 | C/Python | eispice/PyOPUS |
| 網(wǎng)絡(luò)仿真 | TCL/Python | NS |
| 固件開發(fā) | C++/Python/Js | MicroPython |
| 網(wǎng)關(guān)開發(fā) | C++/Python/Js | MicroPython/Python/Node.js/Node-RED |
| 設(shè)備連接服務(wù) | Python/Node.js | Twisted/Tornado/Node.js/Node-RED |
| Web服務(wù) | Python/Node.js | Flask/Django/Express |
| GPU編程 | C++/Python | PyOpenGL/PyOpenCL |
| FPGA編程 | C++/Python | PyNQ/Zynq |
| 3D/VR/AR | Js/Java/Python | VPython |
| Web運(yùn)維 | Python | Fabric |
| Web爬蟲 | Python/Node.js | Scrap |
| Web前端 | Js | JQuery |
| C/C++對接 | Python/Node.js | cffi |
| C#對接 | Python | IronPython/Mono |
| Java對接 | Python/Node.js | Jython |
| 數(shù)據(jù)分析 | Python | SciPy/NumPy |
| 數(shù)據(jù)可視化 | Python/Js | Matplotlib/D3 |
以上僅僅是典型案例,實(shí)際上可選的工具遠(yuǎn)不止這些。
敏捷開發(fā)的選擇
我日常開發(fā)所用的技術(shù)組合是:
| 任務(wù) | 語言 | 框架 |
|---|---|---|
| ARM內(nèi)核設(shè)備固件開發(fā) | C/C++ | mbed/Arduino |
| 其他內(nèi)核設(shè)備固件開發(fā) | C/C++ | Arduino |
| Linux網(wǎng)關(guān)軟件開發(fā) | C/C++/Python/Node | mosquitto/node-red/Twisted |
| 其他網(wǎng)關(guān)軟件開發(fā) | C/C++/Python | Arduino/MicroPython |
| 設(shè)備接入服務(wù) | Python/Node | Twisted/node-red |
| Linux Web | Python/Js | Cyclone/Flask/jQuery |
| Web前端 | Js | JQuery/Boostrap |
眼下,在這些技術(shù)棧組合上利用Python/Js的組合進(jìn)行一些代碼生成器,以提高開發(fā)效率。目前,暫未涉及Mobile APP的開發(fā)。
總結(jié)
IoT全棧開發(fā)鏈的選擇路徑,是Python,還是JavaScript,還是Python+JavaScript組合?選擇結(jié)果因人因事而異。
IoT的復(fù)雜度需要我們站在前一代成熟語言C/C++/Java/C#基礎(chǔ)上,選擇各類VHLL語言進(jìn)行更加高效的開發(fā)。所以不要考慮語法,和語言原生能力,因?yàn)檫@些都是可變因素,比如PyPy/TypeScript/WebAssembly等,更多的是就事論事進(jìn)行綜合選擇和組合。