第 1 章 Java 簡介
本章提要 1-1 甚麼是程式語言? 1-2 Java 程式語言簡介
1-1 甚麼是程式語言? 電腦就像是一位協助我們完成工作的朋友, 當我們與朋友一起工作時, 會使用大家都可以聽懂的語言相互溝通, 以便讓對方瞭解我們希望他做甚麼? 舉例來說, 大家都會說國語, 因此在一般的情況下, 只要以國語溝通, 通常都可以正確的完成工作。 不過想像如果你到了一個客家村落, 遇到了一位老婆婆, 她可能只聽得懂客家語, 想要向她問路, 國語可能就行不通了。
甚麼是程式語言? 這個情況在面對電腦的時候也是一樣, 雖然科幻片中聽得懂人說話的電腦不計其數, 但到目前為止, 這都還是人類的夢想而已。 要想讓電腦幫我們工作, 還是得說電腦懂得的語言, 這種可以讓我們與電腦溝通的語言, 就稱之為電腦語言 (Computer Language), 或者是程式語言 (Programming Language)。
甚麼是程式語言? 要求電腦為我們工作時, 可以分為以下幾個步驟: 先分析所要解決的問題。 找出解決問題的步驟, 這些步驟稱為解決此問題的演算法 (Algorithm)。 使用程式語言表達出前述解決問題的步驟, 這個動作就稱為撰寫程式 (Writing Program), 或者是設計程式 (Designing Program)。
甚麼是程式語言? 要求電腦依據上一步驟所寫好的程式執行, 看看是否能夠正確解決問題。這個動作就稱為測試 (Testing) 程式。 如果執行的結果有問題, 就再回到第 3 步, 檢查所撰寫的程式是否有錯誤, 並加以修正, 一直到程式的執行結果完全符合預期為止。這個動作稱為除錯 (Debug) 。
甚麼是程式語言?
演算法的定義 要明確的說明輸入的資料:亦即依照這個演算法解決問題時, 要先具備的條件是甚麼。 要明確的說明產生的結果:在特定的輸入資料下, 這個演算法執行之後, 會得到甚麼結果。只要輸入的資料相同, 這個演算法就應該要得到一樣的結果。
演算法的定義 要能夠在有限的步驟內完成:這一點是很重要的, 否則無法預估完成的時間。 舉例來說, 如果你立志要到美國旅行, 那麼達成這個目的的方法就不能是假如心情好, 就存 10 元, 這不能稱為演算法, 因為你無法預估甚麼時候會完成。 反之, 如果改成每天存 10 元, 那麼只要知道所需的總旅費, 就可以知道這個方法甚麼時候可以達成, 這才能稱為演算法。
演算法的定義 要明確的說明每一個執行步驟的動作, 而不能讓人不知道該如何進行。 要能證明可以解決問題。 一個演算法基本上要能夠用紙筆就可以模擬出執行的結果, 而不一定要使用電腦或是其他工具, 只是對於比較複雜的演算法, 我們不容易演練其執行過程而已。
程式語言的演進與分類 機器語言 (Machine Language) 組合語言 (Assembly) 高階語言 物件導向程式語言
機器語言 (Machine Language) 對於電腦來說, 它真正所懂得的語言只有一種, 就是機器語言。 所謂的機器語言, 其實就是以特定的數字來表示電腦所能進行的各個動作, 這些數字就稱為機器碼 (Machine Code)。
機器語言 (Machine Language) 舉例來說, 如果把電腦比喻為一個人, 那麼 0 可能代表要這個人往前走一步、1 代表往後退一步、2 代表往左轉 90 度, 而 3 代表往右轉 90 度, 那麼當你希望這個人往前走三步、再往右走三步時, 就必須下達 0003000, 當電腦看到這一串數字後, 就會依據每個數字所代表的意義動作。
機器語言 (Machine Language)
機器語言 (Machine Language) 任何一個人都可以看得出來, 這種以數字表達的語言並不適合人閱讀, 除非我們是在玩團康遊戲, 否則大可不必考驗自己的記憶力。 除此之外, 不同機型的電腦其機器語言並不相同, 換了另外一種電腦, 0 可能代表的是往後走一步, 一樣下達 0003000, 到達的地方就天差地遠了。 因此, 除了早期電腦的時代, 大家很快就發現要用這種方式撰寫程式, 實在太難了些。
組合語言 (Assembly) 為了解決機器語言的難題, 大家就想到了用一些符號來替代數字, 以方便人們辨識各個指令。 舉例來說, 如果以 forward 代替原本的 0 、backward 代替原本的 1 、left 代替原本的 2, 而用 right 替代原本的 3, 那麼同樣要往前走三步、再往右走三步的程式, 寫起來就變成這樣:
組合語言 (Assembly)
組合語言 (Assembly) 像是這樣使用文字符號替代機器碼撰寫程式的語言, 就稱為組合語言。 這種寫法絕對要比原本的 0003000 要容易懂得多, 不過這樣一來, 雖然人們看得懂, 但是電腦卻看不懂, 而必須透過一個翻譯的動作, 將這個用組合語言寫成的程式轉換成電腦看得懂的機器語言, 負責這個翻譯動作的就是組譯器 (Assembler)。
組合語言 (Assembly)
高階語言 不論是機器語言還是組合語言, 對於程式的描述都是以電腦所能進行的最基本動作為步驟, 因此這兩種語言被稱為低階語言 (Low-Level Language)。
高階語言 換言之, 本來是希望這個人向前走三步, 然後向右走三步, 但是因為電腦所能進行的基本動作的限制, 使得我們所寫出來的程式必須以向前走一步、向前走一步、向前走一步、向右轉 90 度、向前走一步、向前走一步、向前走一步這樣繁瑣的方式一步步描述實際進行的動作, 寫起程式來其實並不便利。
高階語言 為了解決這樣的問題, 因此就有人設計新的語言, 用比較接近人類思考的方式來撰寫程式。這種新的程式語言就稱為高階語言 (High – Level Language), 其中比較流行的有 C、Pascal、Basic 等等, 使用這種語言, 寫出來的程式就會像是:
高階語言 不但比較容易理解, 也不會像是低階語言所寫出來的程式那樣繁瑣。 不過電腦並無法看懂這樣的程式, 和組合語言一樣需要一個轉譯的動作, 將使用高階語言所撰寫的程式轉換成電腦所能看懂的機器語言, 然後才能依此執行。 這個轉換的動作就是由各種程式語言的編譯器 (Compiler) 所進行。
高階語言
物件導向程式語言 隨著軟體技術的不斷演進, 程式語言又從高階語言改良, 隨之而流行的就是物件導向程式語言 (Object-Oriented Language), 比較著名的有 Smalltalk、C++、以及本書的主題 Java。
編譯式與直譯式的程式語言 除了以程式語言本身的特質來分類以外, 也可以依據程式執行的方式來區別。 一般來說, 依執行方式程式語言分成編譯式語言與直譯式語言兩種。
編譯式的程式語言 所謂編譯式的程式語言, 其執行的方式是先將整個程式從頭到尾讀完, 翻譯成機器碼後電腦才開始依據程式中所描述的動作一一執行。 這就好像是一本翻譯書, 是先將原文書整個從頭到尾先翻譯好, 然後才拿給讀者閱讀。
編譯式的程式語言 這種作法的好處是, 只要書已經翻譯好, 那麼不論往後甚麼時候需要閱讀, 都不需要再重新翻譯, 就可以直接閱讀翻譯好的版本。 不過相對來說, 在第一次想要閱讀之前, 就必須先花時間等待譯者翻譯完畢才行。
編譯式的程式語言 對應到電腦實際的運作方式, 編譯式的程式語言執行的方式是先使用所謂的編譯器 (Compiler) 將撰寫好的原始程式轉譯成為機器碼, 然後再執行這份機器碼。 以後每次要執行同一個程式時, 就只需要執行這份轉譯好的機器碼, 而不需要花費時間重複再做轉譯的動作。
編譯式的程式語言 不過由於每種電腦的機器語言並不相同, 比如說我們常用的個人電腦(PC) 和麥金塔電腦 (Mac) 的機器語言就不相同。 因此, 同一個程式如果要在不同的機器上執行, 就必須使用專為該種電腦所設計的編譯器, 轉譯出符合該電腦的機器碼才行。
直譯式的程式語言 直譯式的程式語言剛好和編譯式的程式語言相反, 並不先將整個程式讀完, 而是每讀取程式中所描述的一個動作, 電腦隨即執行相對應的動作, 這樣邊讀程式、邊做動作。 這就好像是參加國際會議時的現場口譯一樣, 主講者邊講, 口譯者便即時翻譯出來給大家聽。
直譯式的程式語言 這種作法的好處是, 只要主講者講完第一句話, 口譯者便開始翻譯, 而不需要等待主講者整篇發言完畢。 但相對的, 由於口譯者即時翻譯完就結束了, 因此如果需要重新聽一遍, 就只好從頭再請口譯者翻譯一遍了。
直譯式的程式語言 對應到電腦實際的運作方式, 直譯式的程式語言是透過所謂的解譯器(Interpreter), 每閱讀完程式中所描述的一部份, 便立即要求電腦進行對應的動作, 一直到整個程式執行完畢為止。 由於沒有儲存轉譯的結果, 往後每次要再執行相同的程式時, 都必須要再花費時間透過解譯器重新轉譯。 直譯式的好處是程式寫完立即就可以開始執行, 而不需等待轉譯。
直譯式的程式語言
程式語言種類與執行方式的關係 大部分的程式語言, 都有其固有的執行方式。比如說, C 語言與 Pascal 一般都是編譯式, 而 Basic 一般則是直譯式。 不過這並不是絕對, 也有某些軟體公司為 C 語言做出直譯式的解譯器;相同的, 也有軟體公司為 Basic 語言做出編譯器。 以目前較為流行的程式語言來說, 兩種方式都各有擅場。 Java 可以算是混合的執行方式, 不但具有編譯式的特質, 也可以算是直譯式的程式語言。
1-2 Java 程式語言簡介 Java 程式語言的演進 Java 程式語言的特色
Java 程式語言的演進 Java 程式語言最早可追溯到 1990 年昇陽公司 (Sun Microsystems) 為資訊家電 (Information Appliance) 所組成的 Green 小組。 這個小組在 1992 年的時候開發了一個稱為 Star Seven (*7) 的小電腦 (有點像是今日流行的PDA) , Java 就是當時用來在這台小電腦上執行的程式語言。
Java 程式語言的演進 不過當時 Java 並不叫做 Java, 而是稱為 Oak, 主因是 Green 小組成員 James Gosling 的辦公室窗外正好有一棵橡樹, 因此取名為 Oak 。 但因為 Oak 已經被其他公司註冊為商標, 因此小組成員才將這個新的程式語言以平日工作時不離手的咖啡名稱命名, Java 於焉誕生。
Java 程式語言的演進 在 1995 年 Java 程式語言正式公開時, 主要是用來撰寫在網頁上執行的小程式, 稱為 Java Applet, 以便提供網頁與使用者互動的功能。 隨後在昇陽公司長期規劃之下, Java 程式語言不但成為軟體開發的主流之一, 而且功能越加完善, 涵蓋了一般應用軟體到網際網路應用程式、電子商務, 無一不是 Java 可以發揮長處的場合。
Java 程式語言的特色 簡單: 程式語言隨著年代的演進, 功能雖然越來越強, 但是語言本身也越來越繁複, 對於軟體開發人員來說, 不但整個學習與熟練的時間變長, 對於程式的除錯也越來越困難。 也正因為如此, Green 小組便捨棄了早期採用的 C++, 而自行發明了 Java, 就是將程式語言最精髓的部分萃取出來, 以降低軟體開發人員的負擔。
Java 程式語言的特色 跨平台 (Cross-Platform): 如同上一節所提到, 直譯式的語言雖然方便, 但每次執行都必須重新轉譯, 對於執行的效率有一定的影響。 編譯式的語言雖然可以重複執行轉譯完的成果, 但因為不同電腦的機器語言有所差異, 同樣的程式到了不同的電腦上, 還是得重新編譯才能執行。
Java 程式語言的特色 為了解決以上的問題, Java 程式語言採取了混合式的作法。 首先, Java 語言設計了一個假的電腦, 稱為 Java 虛擬機器 (Java Virtual Machine), 寫好的 Java 程式就在這個假的電腦上執行。 換言之, Java 雖然採取編譯式的方式, 但卻是將 Java 程式轉譯成 Java 虛擬機器的機器碼 (在 Java 中稱為 Byte Code) , 而不是直接轉譯成真正電腦的機器碼, 然後再由 Java 虛擬機器以直譯的方式依據轉譯出來的機器碼要求真正的電腦執行。
Java 程式語言的特色 透過這樣的方式, 只要在不同的電腦上都先建立好 Java 虛擬機器, 那麼同樣的程式就可以不需經過重新編譯就可以執行。 由於有這樣的特點, 因此 Java 程式語言在一開始就打出 Write once,run everywhere 的口號。
Java 程式語言的特色 網路功能 (Networking): 由於 Java 程式語言一開始的設計就已經考慮到了網路, 因此隨著網際網路日益盛行, 對於開發網路應用軟體特別便利的 Java, 自然成為開發人員率先考量的選擇了。
Java 程式語言的特色 例外處理 (Exception Handling): 天下事未必都能盡如人意, 程式執行的時候也有許多出人意料的狀況, 比如說網路突然斷線、硬碟空間不足、所要開啟的檔案被其他人刪除等等。軟體開發人員往往必須耗費複雜的邏輯與程式碼來處理這些狀況。 Java 程式語言採集 C++ 程式語言的例外處理方式, 去蕪存菁後, 提供給軟體開發人員一個簡單而又功能完善的架構, 可以妥善處理種種的例外狀況, 也使得 Java 成為值得軟體開發人員考慮的選擇。
Java 程式語言的特色 標準萬國碼 (Unicode): Java 程式語言內部採用 Unicode 來處理文字, 這也代表著不論你是哪一個國家或地區的開發人員, 都不必擔心 Java 不支援你所使用的語言, 省去了軟體開發人員必須處理當地語言的煩惱。
Java 程式語言的特色 多執行緒 (Multithreading):
Java 程式語言的特色 資源回收系統 (Garbage Collection):
Java 程式語言的特色 物件導向: 開發工具隨處可得: 如同本書附錄 A、C 所提, 只要連上網, 就可以下載最新版本的開發工具, 而不需要先耗費鉅資購買產品。
Java 平台簡介 在 Java 中, 我們將可以執行 Java 程式的環境稱為 Java 平台 (Java Platform)。 根據不同環境的特性, 可以區分為三種: J2ME (Java 2 Micro Edition):泛指消費性裝置上的 Java 執行環境, 像是手機、PDA 等等, 就屬於這一類。由於此類裝置的限制, 因此 J2ME 提供的能力比較簡化。
Java 平台簡介 J2SE (Java 2 Standard Edition) :這是一般應用的執行環境, 像是常見的個人電腦上所提供的 Java 執行環境就屬於這一種。如果沒有特別區分, 那麼一般所提的 Java 平台也多是指此, 而這個平台也是本書所介紹的主角。 J2EE (Java 2 Enterprise Edition) :這是為了商業運用所建構的平台, 提供大規模運算所需的能力。 每種平台皆對應有其開發套件, 例如 Java SE 的開發套件稱為 Java SE Development Kit (簡稱 JDK), 只要下載這個套件, 便可立即開發 Java 程式。