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