Java在嵌入式系統中的解決方案
一、引言
本文引用地址:http://dyxdggzs.com/article/150399.htmJava的設計者企圖建立一個(gè)簡(jiǎn)單的、面向對象的、智慧的、已經(jīng)解譯的、強大的、安全的、架構合理的、可移植的、高性能的、多線(xiàn)程的、動(dòng)態(tài)的語(yǔ)言。為使Java對開(kāi)發(fā)者有吸引力,Sun公司融合了類(lèi)似于C語(yǔ)言的語(yǔ)法和結構。然而Sun最終沒(méi)有達到這個(gè)目標,Java還是被證明不適合小型的電子設備,這很大程度是因為它大而且速度慢。應用Java程序所需要的處理能力和內存量,對這類(lèi)設備來(lái)說(shuō)太昂貴了。
然而,Sun公司設計Java時(shí)最重要的是平臺無(wú)關(guān)及網(wǎng)絡(luò )集成。一個(gè)無(wú)須更改能夠在幾種不同硬件和軟件平臺運行的程序,對網(wǎng)絡(luò )環(huán)境來(lái)說(shuō)是一個(gè)理想的程序。對想建立通過(guò)網(wǎng)絡(luò )來(lái)通訊并利用網(wǎng)上資源的分布式程序的開(kāi)發(fā)者來(lái)說(shuō),一種在任何平臺上都有內置的和標準的網(wǎng)絡(luò )支持的語(yǔ)言是一個(gè)大實(shí)惠。
1、Java語(yǔ)言與嵌入式
對于選用嵌入式編程語(yǔ)言,一般說(shuō),越是高級的語(yǔ)言,其編譯和運行庫施加的開(kāi)銷(xiāo)越大,你的應用程序也越大,越慢。已經(jīng)公認用匯編語(yǔ)言能寫(xiě)出最小最快的程序,其次是用C或Forth,接下來(lái)較大的是C++或Basic,然后才是Java。因此一般來(lái)說(shuō),編程人員都會(huì )首選匯編和C,而然后才會(huì )考慮C++或Java。
但是嵌入式開(kāi)發(fā)者為何要來(lái)關(guān)注Java呢?筆者以為,隨著(zhù)不斷增長(cháng)的市場(chǎng)需求,很多嵌入設備必須適應網(wǎng)上交流的需要,為了迎合此要求,考慮這種到開(kāi)發(fā)Internet應用程序的便利,眾多開(kāi)發(fā)者都發(fā)現使用這種語(yǔ)言是有意義的。另一個(gè)原因是隨著(zhù)內存條及32位處理器價(jià)格的下降,最初在嵌入系統使用Java太昂貴的問(wèn)題不再有了。隨著(zhù)使用Java的成本代價(jià)減少,它的很多優(yōu)點(diǎn)應當被考慮作為嵌入平臺。
2、Java對于嵌入式的優(yōu)點(diǎn)分析
Java語(yǔ)言的優(yōu)點(diǎn)在于:它當初就是由理解和信奉網(wǎng)絡(luò )計算夢(mèng)想的一個(gè)小巧而專(zhuān)注的開(kāi)發(fā)組設計的,雖然該語(yǔ)言最初的實(shí)施方案有點(diǎn)缺陷,有許多后來(lái)已被解決了,但為了這個(gè)夢(mèng)想,他們很少在技術(shù)上妥協(xié),結果誕生了一種專(zhuān)為以相互通訊為主要目的的設備而設計的語(yǔ)言。
有許多技術(shù)上的優(yōu)點(diǎn)都可能會(huì )引導嵌入系統開(kāi)發(fā)者選擇Java,以下就是這些優(yōu)點(diǎn)(其中有幾個(gè)也適用于通用編程)
A)與處理器無(wú)關(guān)
Java的第一個(gè)優(yōu)點(diǎn)就是與處理器無(wú)關(guān),這個(gè)優(yōu)點(diǎn)似乎與嵌入式系統沒(méi)什么相干。傳統上,嵌入程序就是針對特定的微處理器設計并在其上運行的,而C語(yǔ)言程序的可移植性則可通過(guò)編譯或交叉編譯來(lái)保障。
但是在Sun公司的模型中,一個(gè)程序可能是存儲在一個(gè)系統上,而被下載并運行在另一個(gè)完全不同的系統上;設備可能從不同地方下載一些程序來(lái)在一個(gè)處理器上運行,或者不同的處理器運行一個(gè)程序,通過(guò)網(wǎng)絡(luò )在相互間傳遞數據。使用Java,一個(gè)嵌入式系統就可能成為一個(gè)通用的通信設備,能下載并運行能完成特定任務(wù)的程序。
對嵌入式系統,這是一個(gè)新的模型,已經(jīng)有一些開(kāi)發(fā)者正在向它靠攏。例如,電視機機頂盒的供應商已宣布并入JVM,以使用戶(hù)能通過(guò)Java applets在他們觀(guān)看電視的同時(shí)接收到的支持該電視節目的一些內容。這樣你在觀(guān)看足球比賽時(shí),看到的支持內容就可以是對球員的技術(shù)統計;若你在看電影,看到的支持內容就可以是演員的背景資料。JVM還被并入到移動(dòng)電話(huà)中,這樣用戶(hù)可接收股票報價(jià)信息、比賽分數及其他即時(shí)信息。
筆者以為,這是一個(gè)恰當的設計和實(shí)施模型。其一是你在選擇開(kāi)發(fā)平臺時(shí)更加靈活了。你無(wú)需在與目標相同的平臺上開(kāi)發(fā),也不用去關(guān)心交叉編譯,因為Java字節碼能在任何有JVM的操作系統中運行;另一個(gè)優(yōu)點(diǎn)是:幾乎所有的檢測和調試可以獨立于目標設備來(lái)進(jìn)行。但是,一些數據輸入和硬件交互要求在目標(或是很好的仿真系統)上測試。由于個(gè)別JVM有時(shí)有兼容性的問(wèn)題,你應該在所有將用到該程序的平臺上測試它。但一般來(lái)說(shuō),你并不要高級而昂貴的、配備有邏輯探針、ICE以及其它調試工具的、針對目標平臺的開(kāi)發(fā)環(huán)境。
B)面向對象的編程
Java是一種純粹面向對象的語(yǔ)言。所有代碼和數據都是某個(gè)類(lèi)的一部分,沒(méi)有全局變量或是獨立于類(lèi)存在的代碼,一個(gè)對象是一個(gè)類(lèi)的實(shí)例,對象是通過(guò)調用操作方法,或者說(shuō)函數來(lái)操作的,而這些方法或函數也是類(lèi)的一部分,對象的方法就對象的數據進(jìn)行操作。Java類(lèi)被組織成一個(gè)等級層次,在層次結構中,一個(gè)子類(lèi)能夠繼承其超類(lèi)的行為,并可用子類(lèi)所具備的一些特有功能來(lái)擴展其超類(lèi)的功能。對象模型是你能定義對應真實(shí)事物的數據結構,使得程序的任務(wù)和任務(wù)如何實(shí)現者二者之間的轉換變得基本上透明。
面向對象的設計和編程的優(yōu)點(diǎn)在于其開(kāi)發(fā)速度和代碼的可維護性,許多面向對象的開(kāi)發(fā)都能通過(guò)利用和更改現存類(lèi)庫來(lái)完成,而不是創(chuàng )造一個(gè)新的結構,這就使開(kāi)發(fā)加快了,例如,一個(gè)硬件開(kāi)關(guān)能在軟件中使用一個(gè)開(kāi)關(guān)對象來(lái)實(shí)現,該對象包含用于控制和操作開(kāi)關(guān)的所有必需的數據和代碼。面向對象的方法還盡量使用自然的結構,使其有很高的可讀性,且可輕易更改和加強。
C)安全和安全操作
由于有了JVM,一個(gè)Java應用程序與操作系統或硬件完全隔絕,因此計算機病毒或其它作祟的的代碼就很難獲得對設備的控制。虛擬機是主機設備和那些可能難以確定其質(zhì)量和可靠性的軟件之間的一個(gè)保護層。
另外,Java設計者從該語(yǔ)言中去掉了指針變量的概念。Java不能任意訪(fǎng)問(wèn)其內存位置,它們只能讀寫(xiě)有Java內存分配管理系統創(chuàng )建的對象。由于Java編譯器所強制的嚴格的分類(lèi)機制,從理論上來(lái)說(shuō),訪(fǎng)問(wèn)那些未分配給程序的內存區域是不可能的。這個(gè)限制使得要寫(xiě)惡意代碼的程序變得非常困難了。
對Java applet施加的限制就更加嚴格了。由于Java applet被設計成從Internet上下載,因而被視為不可信任的代碼,除非它包括你已認定為可信任的主機的數字指紋。JVM在內存的一個(gè)稱(chēng)之為sandbox的區域運行諸如applet這種不可信任的代碼。它給每個(gè)applet分配資源和特權,并將其限定在這些分配區域范圍中。
D)內存管理
Java的內存管理遠比其他語(yǔ)言簡(jiǎn)單,因為它不使用指針。當對象被實(shí)例化時(shí),內存被動(dòng)態(tài)分配。正如我們前面分析的,對個(gè)別內存地址的訪(fǎng)問(wèn)被Java的設計者視為一個(gè)對安全的潛在危險,因此,訪(fǎng)問(wèn)也被禁止。而且,Sun的網(wǎng)絡(luò )模型已假定你也許不知道目標處理器,而引用專(zhuān)用內存地址變得沒(méi)有必要。去掉指針的結果不僅提高了安全性,還簡(jiǎn)化了編程,錯誤也減少了。
在C語(yǔ)言中,可以用值或引用的方式來(lái)訪(fǎng)問(wèn)數據。事實(shí)上,出于靈活性和控制考慮,非原始數據類(lèi)型都由引用方式來(lái)存取,即通過(guò)指針訪(fǎng)問(wèn)。因此,值和引用的不同變得非常清楚,特別是:因為你不得不使用不同的符號(*和)來(lái)存取數據。要用這兩種不同的訪(fǎng)問(wèn)方式,你必須清楚理解它們是什么以及你為什么應該使用這一個(gè),而不使用那一個(gè)。
在Java中,由值和引用來(lái)存儲是無(wú)縫的,尤其因為其符號都一樣。兩者間唯一不同在于數據類(lèi)型本身:所有原始數據類(lèi)型始終由值的方式存取;所有對象,包括字串、數組以及文件流,始終由引用方式訪(fǎng)問(wèn)。聲明為原始數據變量類(lèi)型包含該變量的值,聲明為對象的變量則包含對該對象(即該對象的地址)的一個(gè)引用,而非對象自身的引用。僅僅聲明一個(gè)對象變量并不給對象分配內存,你必須用“new”關(guān)鍵字來(lái)分配內存和創(chuàng )建對象。
這兩種方法最根本的不同在于:不可能象在C中那樣就Java內存地址做指針算術(shù)或其他操作。Java中對象的地址是相對的(或虛擬的),它由虛擬機任意分配,因此你沒(méi)有理由還想要指針地址。
E)垃圾收集
垃圾收集自動(dòng)收集內存中未引用的內存,并將其歸回空閑內存鏈表中。JVM使用此功能將不在使用的內存還給系統。
當Java程序說(shuō)明并實(shí)例化一個(gè)對象或數組時(shí),它僅僅做一個(gè)JVM請求,訪(fǎng)問(wèn)其下面的系統內存(通常是通過(guò)主機操作系統)并分配內存,Java的垃圾收集系統通過(guò)內存收集對象,然后檢查它們的引用鏈。Java的垃圾收集系統的工作方式一般是搜索內存中的對象,然后檢查它們的引用表。它計算程序中有多少變量當前正在引用每個(gè)對象。若對象的引用數目為零,它知道此對象不再在使用了,它的內存可以收回。其結果就是,不必像你在C語(yǔ)言所作的那樣,要人工來(lái)釋放分配的內存。在C中,釋放內存是一個(gè)必要、耗時(shí)且易出錯的細節。Java自動(dòng)而精確的處理此過(guò)程,去除了C/C++程序中那種常見(jiàn)的錯誤致因。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論