Java

Android 所採用的語言是 Java,先從這開始談起。一般所謂 Java 其實包含三個元素,其一是 Java 這個「電腦語言」,也就是像這樣的東西:

class HelloWorld
{
    public static void main(String [] argv)
    {
	System.out.println("Hello, world!");
    }
}

也就是用人比較容易看懂的語言(也許不那麼容易啦,但至少比一堆 0 跟 1 來得好)來叫電腦做事,比如上個例子是在螢幕上印一行字 Hello, world。我們還會需要一個「編譯器」,來把這語言從人看得懂的,翻譯成電腦看得懂的。容後再論。

第二個元素是「Java 虛擬機器」(後稱JVM, Java virtual machine)。電腦的核心 CPU 是有很多不同種類的。一般我們用的是 Intel 的產品,有些是 32 位元、有些是 64 位元。有些人用的可能是 Power,例如部分蘋果電腦的使用者。還有一些小一點的電腦,可能就是用 ARM 架構。總之,不同的 CPU 使用方法也不同,指令是不能直接互通的。虛擬機器就是設定一些共通的指令,然後針對各種不同的架構各寫一個程式去配合這套指令。如此一來,我們只需要把程式編譯成「虛擬機器」看得懂的就行了。Java 使用的共通指令就稱做 “Java bytecode”。

其三是 Java runtime library,也就是一個「函式庫」,裡頭存了很多編譯好的現成程式,來讓開發者使用,這樣就可省下很多重覆的工作。比如上頭這例子裡頭的 System.out.println 就是函式庫提供的。那我們可以想像,如果在程式中我們用了很多某個函式庫裡頭的東西,但是用的人只拿到編譯好的程式,但沒有同樣的函式庫,那這程式還是不能用。比如說,Windows, Linux提供的基本函式庫就很不一樣,所以做同樣事情的程式,寫法可能完全不同。Java 函式庫裡頭提供的工具,是有標準可循的,所以以上的程式,不管是要在 Windows 上頭跑,或是 Linux 上頭跑,都是一樣的寫法。

二跟三兩者加起來,合稱 “Java Runtime Environment”, JRE. 它可以讓編譯好的 Java 程式「跨平台」。怎麼說呢?我們用 Java 這個語言寫程式,呼叫 Java 函式庫裡頭的工具,最後用編譯器編成共通的指令集,交給虛擬機器去執行。如此一來,同樣的程式在各個地方都能跑了。這雖然聽起來很棒,但我們可以想像,由於隔了一層虛擬機器跟函式庫,一定會比直接下命令來得慢,而且也要有人針對某作業系統跟某 CPU 架構去寫了這套東西,大家才能用。另外一個想法就是,那為何不直接把程式碼公開,讓大家針對不同的情況去處理,這樣就不需要虛擬機器,速度也一樣快,不就兩全其美了嗎?自由軟體走的就是這樣的路子。

問題是,許多公司不想公布自己的程式碼,因為必須要靠它賺錢。Java 讓他們可以不公布程式碼,只發行編譯好的程式,就在各平台上執行。使用者只需要安裝虛擬機器跟函式庫就行了。我們可以說,Java 是適合商業應用的。這點是很重要的一個特性。

以上的觀念大概瞭解了以後,我們看看 Android 在這部分做了什麼。

一、語言部分

Android 使用的 Java 語言並沒有不同,原本熟悉的工程師仍可以繼續使用。

二、虛擬機器

Android 使用的虛擬機器叫作 Dalvik,原本並不是針對 Java 設計的。它認識的指令集並不是 Java bytecode,而叫 Dalvik executable,簡稱 dex。Android 裡頭提供了一個工具程式叫 dx,可以把 Java bytecode 再翻譯成 dex,這樣 Dalvik 就知道怎麼執行它了。這虛擬機器為了適合在電話這種比較小型的平台上使用,而做了許多最佳化的處理,例如減低記憶體的使用,而且可以有效率的同時執行好幾個程式。它仰賴底層的 Linux 作業系統來幫他處理一些事情,意味著目前 Dalvik 是綁在 Linux 上的

三、函式庫

Android 提供了大部分的標準 Java 函式庫(來自於Apache Harmony),並把他們轉換成 dex 的格式,如此 Dalvik 才認得。除此之外,還提供了很多獨有的函式,讓使用者可以直接呼叫來使用電話、GPS等元件,或者是一些視覺的元件來取得跟其他 Android 程式相同的外觀。

Android 虛擬機器與函式庫合稱 Android Runtime。它有幾個特性:

  • 不能直接執行編譯好的 Java 程式。要轉換成 dex 檔案後才能執行。
  • 若此程式使用了 Android 未提供的函式,仍不能執行。
  • 若我們拿到了 Android 應用程式,無法在 Java Runtime 上跑起來。原因為 1. 必須把 dex 轉回 Java bytecode,這難度目前不明。2. 沒有 Android 提供的獨有函式。

仔細思考的話,會發現所謂 Android Runtime 跟 Java Runtime (尤其是 Sun所提供的套件)的不同處很多,只是「剛好」Android 提供了很多 Java 函式庫裡的功能,讓 Java 工程師可以無痛的轉換罷了。另外就是他仍然保持了對商業應用的親和性,只要發行編譯好的 dex 檔案,而不需公布程式碼。

資料來源:http://mmdays.com/2008/09/29/android-%e6%b7%ba%e6%8e%a2%e4%b8%80/

創作者介紹

香醇咖啡

香醇咖啡 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • 悄悄話