在最近的一篇文章中,嵌入式系統(tǒng)顧問Jacob Beningo提出了一個問題,即是否是時候退役C編程語言了,因為它在復雜性和潛在錯誤以及C開發(fā)人員短缺方面的局限性。作為回應,Andrei Gorine 認為 C 的緊湊占用空間使其比 Java、C# 和 Go 等資源密集型現(xiàn)代語言更具競爭力。
此外,C 語言直接控制應用程序行為和內存的能力使其成為需要近距離訪問硬件資源(如中斷和外圍設備)的系統(tǒng)的唯一可行選擇。對于嵌入式設備尤其如此,因為它們的基礎操作系統(tǒng)、驅動程序和相關 API 也傾向于用 C 語言編寫。
但是,這種高度靈活的控制級別可能會導致運行時行為出現(xiàn)問題。無論 C 語言最終是否停用,開發(fā)人員都需要當今的工具來確保應用程序的安全性和可靠性不會因人為錯誤或嵌入式設備日益互聯(lián)而受到損害。開發(fā)人員需要像管理高級語言一樣管理 C,以增強應用程序的安全性和可靠性。
托管 C 與非托管 C
C 語言與現(xiàn)代語言(如 Java、JavaScript 和 Python)之間的主要區(qū)別之一是后者的實現(xiàn)是托管的。這意味著代碼由運行時環(huán)境執(zhí)行,該運行時環(huán)境確保其在內存邊界、安全原則和優(yōu)化范圍內正確管理和執(zhí)行。
相比之下,C 語言是非托管的,這意味著程序員必須手動管理內存分配和釋放。這使得代碼更容易受到安全漏洞的影響,例如緩沖區(qū)溢出和內存泄漏。權衡是 C 代碼通常比托管代碼更快、更高效,但需要更多的努力來編寫和維護。
下面是托管 C 代碼和非托管 C 代碼之間主要區(qū)別的摘要:
| 托管代碼 | 非托管代碼 |
| 由公共語言基礎結構(運行時)執(zhí)行 | 由處理器編譯和執(zhí)行 |
| 不會發(fā)生內存緩沖區(qū)溢出 | 可能發(fā)生內存緩沖區(qū)溢出 |
| 提供內存保護并降低內存泄漏的風險 | 內存不受保護,分配函數(shù)和指針使用不當會導致內存損壞和系統(tǒng)崩潰 |
| 提供異常處理和內存清理等服務 | 不提供這些服務 |
| 可以輕松移植到不同的平臺,因為運行時環(huán)境抽象了硬件和操作系統(tǒng)的細節(jié) | 無法輕松移植,需要工程團隊經常從頭開始 |
| 運行時環(huán)境強制實施安全功能,例如類型安全和訪問控制 | 開發(fā)人員負責編寫安全可靠的代碼,這可能會增加出錯的風險 |
將兩全其美相結合:C 應用程序與用高級語言編寫的應用程序的可靠性
軟件容器使開發(fā)人員能夠在運行時環(huán)境中有效地管理 C 應用程序,盡管內存分配仍然需要手動管理。這是因為容器化為每個應用程序提供了一個安全且隔離的空間,從而降低了由于內存錯誤而導致系統(tǒng)崩潰的可能性。
托管 C 中的動態(tài)鏈接允許安裝新包,而無需開發(fā)人員重新編譯整個程序,從而節(jié)省開發(fā)時間。此功能傳統(tǒng)上與 Linux 相關聯(lián),現(xiàn)在可以通過使用小型軟件容器獲得,并在支持熱代碼替換的同時提供增強的可移植性和安全性。
MICROEJ VEE是一個微型軟件容器的一個例子,它為托管C,Java和JavaScript應用程序提供了沙盒機制。所有組件都由同一個運行時環(huán)境管理,確保安全可靠的共存。通過這種方法,工程師可以重復使用組件,確信它們將可靠、安全地工作。
使用安全軟件容器來隔離每個應用程序,允許用不同編程語言編寫的多個應用程序無縫共存,從而提供了顯著的優(yōu)勢。通過將托管 C 與安全容器相結合,這種方法彌合了嵌入式和企業(yè)開發(fā)之間的差距。托管 C 提供了 C 的靈活性,同時使開發(fā)人員無需管理安全內存、多任務同步和執(zhí)行其他低級任務。
這種方法還有助于在 C 語言中集成遺留代碼和現(xiàn)有軟件堆棧。這對于實現(xiàn)用嵌入式 C 語言編寫的協(xié)議特別有用,包括云連接器、Matter、LWM2M 和 MQTT。它也是MISRA C指南的補充,因為它克服了低級健壯性和安全問題。最后,像 MICROEJ VEE 這樣的容器允許動態(tài)鏈接,這意味著托管 C 可以動態(tài)鏈接和取消鏈接,就像用 VEE 容器支持的任何其他語言編寫的代碼一樣。
將托管和非托管 C 組合在一起以獲得最佳結果
使用安全軟件容器并不意味著需要管理所有 C 代碼。在像 MICROEJ VEE 這樣的虛擬執(zhí)行環(huán)境中,非托管 C 代碼(也稱為本機代碼)仍然可以發(fā)揮作用。所有直接與硬件和CPU寄存器接口的低級驅動程序和板級支持包都應在C語言中保持不受管理的狀態(tài),以最好地利用C與硬件的緊密聯(lián)系。
相比之下,對于更復雜的應用程序任務,使用托管代碼更方便、更高效。由于關注點分離,托管代碼提高了工作效率并減少了錯誤,并使代碼更具可移植性。
托管和非托管代碼庫仍可以通過抽象層和本機接口以受控方式進行交互。它稱為簡單本機接口或 SNI,它允許任何托管代碼調用本機函數(shù)、傳遞參數(shù)、獲取返回值并在專用空間中操作共享內存。
托管代碼中的高級堆棧和非托管代碼中的低級別硬件接口的這種拆分提供了理想的組合。
托管 C:未來的 C 語言
在復雜且不斷變化的開發(fā)環(huán)境中,開發(fā)人員必須能夠訪問利用最新硬件創(chuàng)新的尖端軟件和語言解決方案。盡管 C 語言是嵌入式開發(fā)中的領先語言,但仍需要使用工具和流程來管理其運行時行為,這些工具和流程可以釋放托管代碼的所有優(yōu)勢,以加速創(chuàng)新。
通過簡化開發(fā)過程并將安全性和可靠性卸載到運行時,托管 C 使開發(fā)人員能夠提高其應用程序的健壯性、安全性和可移植性,同時保持熟悉的編程語言。隨著技術的不斷發(fā)展,采用托管 C 代碼解決方案的開發(fā)人員將能夠更好地創(chuàng)建創(chuàng)新、安全和可靠的連接產品。
-
嵌入式
+關注
關注
5200文章
20457瀏覽量
334289 -
JAVA
+關注
關注
20文章
3001瀏覽量
116457 -
應用程序
+關注
關注
38文章
3344瀏覽量
60275
發(fā)布評論請先 登錄
如何提高嵌入式代碼質量?
嵌入式系統(tǒng)產品的可靠性
開發(fā)高可靠性嵌入式系統(tǒng)的技巧有哪些?
如何提升嵌入式系統(tǒng)的VxWorks安全性?
嵌入式實時多任務操作系統(tǒng)的安全性怎么樣?
嵌入式設備如何提高安全性
如何對嵌入式軟件進行可靠性測試
嵌入式軟件的安全可靠性控制
嵌入式系統(tǒng)軟件可靠性設計
嵌入式系統(tǒng)的可靠性設計
嵌入式系統(tǒng)硬件可靠性分析
如何提高嵌入式應用程序的安全性和可靠性
評論