為嵌入式系統(tǒng)創(chuàng)建軟件的程序員對(duì)腳本并不陌生。他們選擇腳本是因?yàn)樗鼈兪墙鉀Q問題的最快方法。腳本用于自動(dòng)化構(gòu)建和運(yùn)行驗(yàn)證測(cè)試。解釋性語言——一種使編程語言成為腳本語言的通用定義——例如 Forth 已經(jīng)使用了幾十年,以減少代碼的內(nèi)存占用,同時(shí)以可移植的方式提高可維護(hù)性。
從玩具到工具
JavaScript 于 1995 年作為網(wǎng)頁(yè)編程語言首次出現(xiàn)。由 Brendan Eich 通過將類似 C 的語法應(yīng)用于基于原型的繼承而創(chuàng)建的 JavaScript 并未被視為為任何環(huán)境創(chuàng)建商業(yè)軟件的可行工具。這種看法慢慢地改變了。在幕后,JavaScript 通過 ECMA International 成為標(biāo)準(zhǔn),現(xiàn)在正在進(jìn)行第 6 次重大修訂。
雅虎的 Douglas Crockford 富有洞察力的工作創(chuàng)建了數(shù)據(jù)交換格式 JSON(JavaScript 標(biāo)準(zhǔn)對(duì)象表示法)作為 JavaScript 的嚴(yán)格子集。JSON 已迅速取代 XML,成為 Web 客戶端和服務(wù)器之間通信的首選數(shù)據(jù)格式,因?yàn)樗?jiǎn)單易用,尤其是 JavaScript 軟件。
2009 年,Ryan Dahl 推出了 node.js,這是一種使用 Google 閃電般快速的 V8 JavaScript 引擎在 JavaScript 中構(gòu)建 Web 服務(wù)器的高效方法。node.js 已被迅速采用,帶來了強(qiáng)大的開發(fā)人員生態(tài)系統(tǒng)和大量開源模塊。
O‘Reilly Media 的創(chuàng)始人 Tim O’Reilly 曾對(duì) JavaScript 從業(yè)余愛好者的玩具轉(zhuǎn)變?yōu)閷I(yè)工具的轉(zhuǎn)變發(fā)表了著名的評(píng)論:“過去學(xué)習(xí) JavaScript 意味著你不是一個(gè)認(rèn)真的軟件開發(fā)人員。今天,不學(xué)習(xí) Javascript 意味著同樣的事情?!?/p>
JavaScript 現(xiàn)在廣泛用于網(wǎng)頁(yè)、Web 服務(wù)器和移動(dòng)應(yīng)用程序。但還沒有在嵌入式系統(tǒng)中。這有望改變。
熟悉的語法
今天的大多數(shù)嵌入式編程都是用 C 完成的。與許多需要 C 程序員學(xué)習(xí)不同語法和編程風(fēng)格的腳本語言不同,JavaScript 的語法與 C 非常相似。有經(jīng)驗(yàn)的嵌入式開發(fā)人員可能只需要一個(gè)下午在他們能夠閱讀、理解和成功修改 JavaScript 代碼之前。
當(dāng)然,有效地使用任何編程語言都需要學(xué)習(xí)。許多 JavaScript 書籍都專注于構(gòu)建網(wǎng)頁(yè),但 David Flanagan 的優(yōu)秀 JavaScript:權(quán)威指南介紹了獨(dú)立于 Web 的語言。Crockford 頗具影響力的 JavaScript: The Good Parts 是一本面向有經(jīng)驗(yàn)的 JavaScript 程序員的固執(zhí)己見、務(wù)實(shí)的風(fēng)格指南。
但是腳本很慢
嵌入式開發(fā)人員對(duì)性能保持警惕。腳本語言天生就比 C 慢。因此,任何優(yōu)秀的嵌入式開發(fā)人員的第一個(gè)沖動(dòng)就是對(duì)任何腳本語言都抱有極大的懷疑。然而,提供卓越性能的可靠方法是可用的:
利用內(nèi)置函數(shù)和對(duì)象。JavaScript 語言具有復(fù)雜的內(nèi)置對(duì)象,支持?jǐn)?shù)組、JSON、正則表達(dá)式和其他字符串操作。這些實(shí)現(xiàn)通常在 JavaScript 引擎中得到了很好的優(yōu)化?;〞r(shí)間了解這些,以避免在您的腳本中重復(fù)它們的功能。
仔細(xì)編碼。因?yàn)槟_本比本機(jī)代碼慢,所以優(yōu)化良好的代碼對(duì)于性能至關(guān)重要。JavaScript 的動(dòng)態(tài)特性意味著 JavaScript 引擎通常無法像 C 編譯器那樣有效地優(yōu)化代碼。
不要試圖在腳本中做所有事情。本機(jī)代碼更快,因此將其用于計(jì)算復(fù)雜的功能。沒有一種語言適合所有情況,所以選擇最適合工作的語言,而不是試圖“100% 純正”。每個(gè) JavaScript 引擎都提供了一種從腳本調(diào)用本機(jī)代碼的方法。如果不確定性能,請(qǐng)先在 JavaScript 中實(shí)現(xiàn),因?yàn)樗菀讓?shí)現(xiàn)。之后,對(duì)系統(tǒng)進(jìn)行概要分析。如果存在性能瓶頸,請(qǐng)?jiān)?C 中重新實(shí)現(xiàn)該函數(shù)。
JIT 呢?
提高解釋代碼性能的常見解決方案是即時(shí)編譯器 (JIT)。JIT 將腳本代碼編譯為目標(biāo)設(shè)備上的本機(jī)代碼。JIT 的使用在現(xiàn)代 Web 瀏覽器的 JavaScript 引擎中很常見。但是,在嵌入式設(shè)備上使用 JIT 是有問題的,因?yàn)?JIT 本身需要額外的代碼空間,因?yàn)槌嗽寄_本代碼之外,本機(jī)代碼還需要消耗內(nèi)存,并且因?yàn)檫\(yùn)行 JIT 需要 CPU 周期。
與 Web 瀏覽器相比,嵌入式設(shè)備具有一個(gè)顯著優(yōu)勢(shì):雖然瀏覽器必須能夠高效地運(yùn)行數(shù)十億網(wǎng)頁(yè)中的任何一個(gè),但嵌入式設(shè)備只需要高效地運(yùn)行其內(nèi)置軟件。這使嵌入式開發(fā)人員可以選擇直接用 C 語言編寫性能關(guān)鍵的腳本,而不是依賴 JIT。
Mozilla 的一個(gè)項(xiàng)目 asm.js 中出現(xiàn)了使用 C 的有希望的替代方案。asm.js 定義了一個(gè)嚴(yán)格的 JavaScript 子集,它更容易轉(zhuǎn)換為本機(jī)代碼或 C 源代碼。asm.js 利用 C 和 JavaScript 之間的語法相似性來簡(jiǎn)化翻譯。嵌入式開發(fā)人員可以在 asm.js JavaScript 子集中編寫性能關(guān)鍵代碼,并將其編譯為本機(jī)代碼作為構(gòu)建過程的一部分,而不是依賴于 JIT。asm.js 的初始開發(fā)工作顯示性能約為最佳本機(jī)實(shí)現(xiàn)的一半,預(yù)計(jì)其他開發(fā)將縮小這一差距。
記憶
內(nèi)存空間是嵌入式開發(fā)人員的另一個(gè)關(guān)鍵問題。JavaScript 既有優(yōu)點(diǎn)也有缺點(diǎn)。一個(gè)明顯的缺點(diǎn)是用于執(zhí)行腳本的 JavaScript 引擎,這是一個(gè)不小的大小——從幾十千字節(jié)到幾兆字節(jié)不等,具體取決于引擎。因?yàn)?JavaScript 使用動(dòng)態(tài)類型,變量有一些額外的內(nèi)存開銷。作為最壞情況的示例,布爾值可能使用 16 個(gè)字節(jié)。
積極的一面是,JavaScript 使用垃圾收集器,無需顯式釋放內(nèi)存。通過這種簡(jiǎn)化,嵌入式開發(fā)人員有時(shí)間專注于開發(fā)的其他方面。此外,通過自動(dòng)釋放未使用的內(nèi)存,垃圾收集器消除了許多緩慢的、小的內(nèi)存泄漏,這些泄漏會(huì)導(dǎo)致長(zhǎng)期不穩(wěn)定,隔離和修復(fù)可能極具挑戰(zhàn)性。僅這一點(diǎn)就使得必須可靠運(yùn)行數(shù)月或數(shù)年的嵌入式系統(tǒng)變得非常重要。此外,在某些情況下,研究表明垃圾收集器的 CPU 要求低于顯式釋放內(nèi)存。
垃圾收集器的一個(gè)風(fēng)險(xiǎn),尤其是在內(nèi)存受限的環(huán)境中,是抖動(dòng)——垃圾收集器運(yùn)行得太頻繁以至于對(duì)系統(tǒng)性能產(chǎn)生不利影響。這個(gè)問題可以通過 JavaScript 編程風(fēng)格來避免,這種風(fēng)格在很大程度上限制了對(duì)嵌入式設(shè)備或應(yīng)用程序中主要狀態(tài)變化的新對(duì)象的創(chuàng)建。這種方法可以使內(nèi)存使用保持穩(wěn)定,因此垃圾收集器不需要經(jīng)常運(yùn)行。
用戶腳本
使用 JavaScript 的嵌入式設(shè)備可以選擇由最終用戶啟用腳本。由于 JavaScript 是一種托管執(zhí)行環(huán)境,因此可以通過安全地沙盒化腳本來確保最終用戶的腳本能力。通過允許消費(fèi)者、愛好者和專業(yè)程序員編寫設(shè)備腳本來實(shí)現(xiàn)的定制將創(chuàng)造新的機(jī)會(huì),就像智能手機(jī)上的應(yīng)用程序革命一樣。
今天的嵌入式 JavaScript
嵌入式設(shè)備不再是孤島。它們通過云中的網(wǎng)絡(luò)服務(wù)、網(wǎng)絡(luò)瀏覽器以及手機(jī)和平板電腦相互連接。JavaScript 是唯一可用于為所有人開發(fā)軟件的語言,以及他們使用 JSON 交換的數(shù)據(jù)。
JavaScript 在嵌入式設(shè)備上為嵌入式程序員簡(jiǎn)化開發(fā)工作——并為客戶提供更可靠、更可定制的產(chǎn)品——的潛力是巨大的。通過采用 JavaScript,嵌入式設(shè)備的創(chuàng)建者將能夠利用許多活躍的 JavaScript 程序員的創(chuàng)新。
作為一個(gè)行業(yè),我們正處于 JavaScript 在嵌入式設(shè)備中成為現(xiàn)實(shí)的風(fēng)口浪尖。幸運(yùn)的是,已經(jīng)有三種開發(fā)系統(tǒng)可供開發(fā)人員開始使用嵌入式 JavaScript:
Espruino 是一個(gè)單芯片開發(fā)板,標(biāo)榜為用于微控制器的 JavaScript。它運(yùn)行開源的 Espruino JavaScript 引擎,該引擎支持 JavaScript 標(biāo)準(zhǔn)的一個(gè)子集。
Tessel 將集成的 Wi-Fi 引入以 JavaScript 為中心的微控制器解決方案。Tessel 提供了與 node.js 兼容的 API,便于 node.js 開發(fā)人員采用。Tessel 將 JavaScript 翻譯成 Lua(另一種腳本語言)來執(zhí)行。翻譯實(shí)現(xiàn)了 JavaScript 標(biāo)準(zhǔn)的一個(gè)子集。
Marvell Semiconductor 的 Kinoma Create 是一款“基于 JavaScript 的物聯(lián)網(wǎng)構(gòu)建工具包”,運(yùn)行 Marvell Semiconductor 的 XS JavaScript 引擎,支持完整的 JavaScript 第 5 版標(biāo)準(zhǔn)。
這些開發(fā)系統(tǒng)中的每一個(gè)都是在嵌入式設(shè)備上開始 JavaScript 開發(fā)的好工具。盡管 JavaScript 在近 20 年前首次引入,但它才剛剛開始用于嵌入式計(jì)算。毫無疑問,這將有許多令人興奮的方式將進(jìn)一步發(fā)展。通過現(xiàn)在開始,您可以幫助塑造 JavaScript 在未來嵌入式系統(tǒng)中的使用方式。
審核編輯:郭婷
-
嵌入式
+關(guān)注
關(guān)注
5045文章
18817瀏覽量
298489 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2894文章
43312瀏覽量
366409 -
JAVA
+關(guān)注
關(guān)注
19文章
2943瀏覽量
104096
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論