4 IoT 平臺衡量標準
在討論 IoT 平臺之前,我們需要知道有哪些衡量標準來判斷一個 IoT 平臺的優(yōu)劣。下面是我提出的三個衡量標準
? 現代程序設計語言
? 面向應用的抽象
? 提供生產支持
4.1 現代程序設計語言
鑒于摩爾定律的存在,在現代軟件開發(fā)中,開發(fā)的效率比代碼執(zhí)行的效率要重要。所以,一個好的 IoT 平臺,需要有一門現代的程序設計語言。
我們不妨先看看 C/C++ 這個傳統(tǒng)的嵌入式開發(fā)語言在現代程序設計語言所需特性上的表現,如表1。
表1 C/C++在現代程序設計語言所需特性上的表現
再來看看 Ruff 選擇的 JavaScript 在這些特性上的表現,如表2。
表2 Ruff 選擇的 JavaScript 在這些特性上的表現
通過對比,不難發(fā)現,雖然 C/C++ 依然戰(zhàn)斗力十足,但作為“現代程序設計語言”,它們顯得不那么“現代”了?;蛟S你會好奇,Ruff 為什么選擇其它的“現代程序設計語言”,主要有下面幾點考量。
4.2 面向應用的抽象
什么是面向應用的抽象?對比兩段代碼,我們便不難發(fā)現,這兩段代碼完成是同樣的工作,點亮一盞燈。
先是傳統(tǒng)嵌入式風格,簡單起見,我們用了 Python 代碼做示例:
GPIO.output(11, GPIO.HIGH)
再是 Ruff 的代碼,用的是 JavaScript 語言
$(‘#led’).turnOn();
我們?yōu)槭裁葱枰布橄竽??因為我們看到整個軟件開發(fā)的趨勢就是抽象度越來越高,從匯編到 C 語言,再到Java,今天還會有各種各樣的 DSL (Domain Specific Language,領域特定語言)。早年間,編寫代碼,我們可能會質疑編譯器是否正確,手寫匯編效率會更高,但今天,我們肯定不會這么做,開發(fā)效率太低,因為有了抽象,底層的東西可以不斷優(yōu)化,越做越好。之所以抽象程度能不斷提升,還要拜摩爾定律所賜,硬件能力越來越強,一些執(zhí)行上的性能損失,我們是可以承受的。
那我們需要怎樣的抽象呢?從發(fā)展趨勢可以看出,抽象的趨勢一定是越來越接近問題領域。對于 IoT 平臺而言,一定是越來越接近于應用開發(fā)。在 IoT 平臺的嘗試中,我們看到了幾種不同的抽象。
? 無抽象
傳統(tǒng)的嵌入式開發(fā)按照這個標準,就是無抽象的,其特點是面向硬件接口編程。
GPIO.output(11, GPIO.HIGH)
? 編程接口抽象
諸如 Ruff、Tessel、Jonny-Five、Cylon.js 等一些 IoT 平臺開始提供面向應用的編程接口抽象,讓開發(fā)者無需關注底層的實現細節(jié)。
board.on(“ready”, function() {
var led = new five.Led(13);
led.strobe();
});
但在這里,我們不難發(fā)現,我們依然要對底層的接口有了解,否則,你便不知道,這段代碼中的13是做什么用的。
? 隔離硬件配置的抽象
Ruff 在提供面向應用的編程接口抽象基礎上,更進了一步,將硬件配置隔離出去。在 Ruff 代碼中,我們甚至看不出硬件配置是什么樣的。
$.ready(function (error) {
$(‘#led’).turnOn();
});
Ruff 之所以要提供隔離硬件配置的抽象,主要是為了提供生產支持。
4.3 提供生產支持
大家對于新出現的 IoT 平臺,普遍有一個誤解,這些平臺只能用在原型研發(fā)上,因為它們看到的是,采用 JavaScript 的硬件要求都很高,與現在普遍的硬件開發(fā)狀況不符?,F在 JavaScript 已經可以運行在一些資源有限的系統(tǒng)上,比如 MCU,Ruff 就有自己的 MCU 版本,支持了幾款不同的 MCU。
Ruff 所做的事情更進了一步,它將硬件配置與應用本身分離開來,這樣的做法帶來一些好處是
? 應用開發(fā)者無需關注硬件如何配置,可以將更多的將注意力放在應用邏輯本身
? 硬件具體的配置方式可以在具體的部署時決定
一旦硬件配置可以在部署時決定,便出現了另外一種可能,也就是,同一個應用可以運行在不同的硬件上,也就是跨硬件應用就出現了,這也就讓前面提及的“重復造輪子”的情況得到一定程度的緩解。
伴隨跨硬件應用的出現,還會有一個額外的作用:測試。以往硬件測試一定要在硬件上完成,因為前面提及的種種原因,硬件測試往往要部署一個包括系統(tǒng)在內的應用,所以,效率是極低的。而我們知道,應用開發(fā)中,大量的測試實際上是應用邏輯的測試,屬于軟件測試的部分,理論上是可以在開發(fā)機上完成的。因為有了硬件隔離,Ruff 就提供了在開發(fā)機上做軟件測試的能力,開發(fā)的效率由此得以提升。
下面是一個 Ruff 測試代碼的例子,可以在開發(fā)機上運行:
var runner = require(‘ruff-app-runner’);
var verify = require(‘ruff-mock’).verify;
exports[‘test should call turn on while application is ready’] = function() {
runner.run(appPath, function() {
verify($(‘#led’)).turnOn();
});
};
require(‘test’).run(exports);
評論
查看更多