Stack OverFlow 的聯(lián)合創(chuàng)始人杰夫·阿特伍德(Jeff Atwood)曾提出著名的“Atwood定律”片挂,即:
Any application that can be written in JavaScript, will eventually be written in JavaScript.
任何能夠用 JavaScript 實(shí)現(xiàn)的應(yīng)用幻林,最終都必將用 JavaScript 實(shí)現(xiàn)。
毫無(wú)疑問(wèn)音念,JavaScript 已然成為當(dāng)下最流行的編程語(yǔ)言之一沪饺,這點(diǎn)已經(jīng)不需要爭(zhēng)論了,不服的話前后端乃至全棧工程師肯定跟你急闷愤。最近整葡,hackereart 就發(fā)表過(guò)一篇博文氧卧,文中描述了2016年主流編程語(yǔ)言的使用情況:
他們因此預(yù)測(cè)今年最流行的語(yǔ)言將會(huì)是:
- JavaScript
- Java
- Python
- PHP
- R
- Matlab
- Arduino
- Swift
作為編程語(yǔ)言界的當(dāng)紅辣子雞鸣戴,JavaScript 已將其觸角延伸到了很多領(lǐng)域,變換出了很多新奇的玩法,下面的內(nèi)容我試圖探索一些 JavaScript 很少為人所知的玩法:
Espruino
Espruino 是一個(gè)專(zhuān)門(mén)為微控制器(MCU)設(shè)計(jì)的 JavaScript 解釋器流昏,最低資源開(kāi)銷(xiāo) 128KB Flash & 8KB RAM嗓袱,使用 MPL-2.0 協(xié)議開(kāi)源扫倡。
作者 Gordon Williams 簡(jiǎn)直就是個(gè)全才豹缀,最近還設(shè)計(jì)了一款硬件 Puck.js 來(lái)支持 Espruino。
在這位巨人的肩膀上鼠次,我做了一些修改更哄,讓其能夠兼容我自己開(kāi)發(fā)的硬件,修改后的代碼我已經(jīng)提交 GitHub 了腥寇,感興趣的小伙伴可以克隆下來(lái)玩玩成翩。
$ git clone https://github.com/makerdiary/Espruino.git
$ cd Espruino
# 將 YS-Beacon 連接至 PC
$ YS_BEACON=1 RELEASE=1 make flash
# 終端跳出一大堆字符,板子上的藍(lán)色燈閃爍赦役,最后一切輕松搞定~
...
[====================] 100%
DEBUG:root:reset stop on Reset
INFO:root:Programmed 446464 bytes (109 pages) at 14.56 kB/s
DEBUG:root:uninit board <pyOCD.board.mbed_board.MbedBoard object at 0x1025e8a90>
DEBUG:root:closing interface
Espruino 還有一個(gè)配套的開(kāi)發(fā)工具 Espruino Web IDE麻敌,可以用來(lái)編輯代碼、下載程序掂摔,甚至可用于圖形化編程术羔。下面是簡(jiǎn)單實(shí)現(xiàn) LED 閃爍的代碼,有沒(méi)有一種似曾相識(shí)的感覺(jué):
var on = false;
setInterval(function() {
on = !on;
LED1.write(on);
}, 500);
有意思的是乙漓,Espruino 硬件上跑著 JavaScript 的解釋器级历,上傳給它的 JavaScript 代碼只是保存在 RAM 中,掉電就沒(méi)有了叭披,這點(diǎn)跟瀏覽器的做法居然如出一轍寥殖,也正好體現(xiàn)了其具備動(dòng)態(tài)解析的特點(diǎn)。
JerryScript
如果說(shuō) Espruino 有點(diǎn)玩具化涩蜘,那 JerryScript 應(yīng)該說(shuō)就比較產(chǎn)品化了嚼贡,而且 JerryScript 的資源開(kāi)銷(xiāo)也不高,RAM 可小于 64KB皱坛,ROM 可小于 200KB编曼。
一說(shuō)到 JerryScript 就一定離不開(kāi) IoT.js 和三星,他們的“三角關(guān)系”是這樣的:
IoT.js 是一個(gè)使用 JavaScript 編寫(xiě)的物聯(lián)網(wǎng)應(yīng)用平臺(tái)剩辟;JerryScript 是一個(gè)適用于嵌入式設(shè)備的小型 JavaScript 引擎;而三星開(kāi)源了 IoT.js 和 JerryScript往扔。
整個(gè)內(nèi)部架構(gòu)如下:
下面這一小段代碼可以顯示 JerryScript 的基本工作流程:初始化引擎 → 解析 JavaScript 代碼 → 執(zhí)行代碼 → 結(jié)束運(yùn)行贩猎,釋放內(nèi)存。
{
jerry_init(JERRY_FLAG_ENABLE_LOG);
char script[] = "print ('Hello, World!');";
jerry_parse(script, strlen(script));
jerry_run();
jerry_cleanup();
}
查看 JerryScript 的源碼萍膛,發(fā)現(xiàn)已經(jīng)能夠在一些 RTOS(如 Zephyr吭服、mbed OS 等)上運(yùn)行了。去年在深圳舉行的 mbed Connect Asia 2016 大會(huì)上蝗罗,Jan Jongboom 說(shuō)他已經(jīng)將 JerryScript 帶到 mbed OS 5 上來(lái)了艇棕,還介紹了幾個(gè)簡(jiǎn)單的示例蝌戒。
既然已經(jīng)支持 mbed OS 5 了,那事情就好辦多了沼琉,可以輕松支援自己開(kāi)發(fā)的硬件北苟,至于開(kāi)發(fā)環(huán)境的搭建可以參考 README,不難實(shí)現(xiàn)打瘪。
$ git clone https://github.com/YS-Beacon/mbed-js-example.git
$ cd mbed-js-example
# 國(guó)內(nèi)的朋友可以使用淘寶鏡像安裝依賴(lài):cnpm install
$ npm install
# 此處 gulp 用于獲取 JerryScript 源碼
$ gulp
# 獲取 mbed os 最新源碼
$ cd ./build/jerryscript/targets/mbedos5/mbed-os
$ git checkout master
$ git pull
# 從我的倉(cāng)庫(kù)拉回相關(guān)目標(biāo)硬件配置文件
$ git remote set-url origin https://github.com/makerdiary/mbed-os.git
$ git pull
# 指定目標(biāo)板子友鼻,自動(dòng)編譯
$ gulp --target=YS_BEACON
再來(lái)看下 JavaScript 所編寫(xiě)應(yīng)用的源碼,是不是有種既陌生又親切的感覺(jué):
// blink_leds.js
var led = DigitalOut(LED1);
var blink = function() {
led.write(led.read() ? 0 : 1);
print("blink! LED is now " + led.read());
};
module.exports = blink;
// main.js
var blink = require('./blink_leds');
setInterval(function() {
blink();
}, 1000);
將編譯好的 mbedos5.hex
文件下載到目標(biāo)板闺骚,看看是不是你想要的結(jié)果:
Blockly
如果你對(duì)編程語(yǔ)言或命令行窗口閃爍的光標(biāo)感到恐懼的話彩扔,Blockly 或許是拯救你的利器,讓你變得好玩有趣僻爽。
Blockly 是 Google 開(kāi)發(fā)并開(kāi)源的一個(gè) JavaScript 庫(kù)虫碉,用于實(shí)現(xiàn)圖形化編程,只需拖動(dòng)一些表示變量胸梆、表達(dá)式敦捧、循環(huán)等含義的圖形塊,組合在一起就可以完成編程乳绕,是不是很酷绞惦?
實(shí)際上,Blockly 只做一件事:可視化編輯洋措,生成代碼济蝉。而代碼背后的行為,Blockly 是不管的菠发,這就留給開(kāi)發(fā)者們非常大的想象空間王滤,例如 Ozobot 就開(kāi)發(fā)了一個(gè)智能機(jī)器人玩具,玩家可以使用 Blockly 編程機(jī)器人的行為:優(yōu)酷視頻
是不是很好玩滓鸠?可惜就是沒(méi)有機(jī)器人雁乡。不過(guò),你可以先用 Espruino 體驗(yàn)一下 Blockly 的玩法糜俗,再一步一步構(gòu)建你自己的機(jī)器人(沒(méi)錯(cuò)踱稍,前面提到的 Espruino 是支持 Blockly 的):
未完待續(xù)
是不是還沒(méi)有玩過(guò)癮?更多好玩的東西悠抹,我還在探索中珠月,等我學(xué)上手就來(lái)分享,感興趣的朋友可以稍微關(guān)注一下楔敌。