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