學習筆記:程式語言分類與翻譯程式
各位未來的電腦科學家,你好!歡迎來到令人興奮的程式設計世界。在本章中,我們將學習人類(也就是我們!)如何向電腦傳達指令,以及電腦又是如何理解這些指令的。你可以把這一章想像成學習如何打造一台「萬能翻譯機」!理解這些概念非常重要,因為它解釋了為什麼你的程式碼最終能執行得如此之快。
1. 程式語言的分類
程式語言主要分為兩大類,分類依據是它們有多接近電腦的「原生語言」(也就是 1 和 0),或者是它們有多接近人類的語言。
1.1 低階語言 (Low-Level Languages, LLLs)
低階語言非常貼近硬體和中央處理器 (CPU)。對於人類來說,這類語言通常很難閱讀、編寫和除錯(修正錯誤)。
低階語言的主要特性:
- 與硬體相關 (Hardware-specific):為某種 CPU 編寫的程式碼,通常無法在另一種 CPU 上執行。
- 執行速度非常快,因為它們幾乎不需要翻譯,或是只需極少的翻譯。
低階語言主要有兩種類型:
a) 機器碼 (Machine Code)
這是 CPU 唯一能原生理解的語言,完全由二進位數字(1 和 0)組成。
- 範例:0010 1100 0001 0000(這可能代表「將兩個數字相加」)。
- 為何困難:試想一下,如果只能用 1 和 0 來寫一本小說,人類幾乎是不可能辦到的!
b) 組合語言 (Assembly Language)
開發組合語言的目的是為了讓低階語言對人類來說稍微容易一點。它不使用 1 和 0,而是使用稱為助憶碼 (Mnemonics)(發音:nee-mon-iks)的簡短代碼。
- 助憶碼:指令的簡短且易於記憶的縮寫。
- 範例:與其寫 0010,你可能會寫 ADD(代表加法)或 MOV(代表移動數據)。
- 需求:儘管它使用了文字,組合語言仍然需要一個翻譯程式(稱為組譯器 (Assembler))將其轉換為機器碼。
快速複習:低階語言執行速度快、與硬體綁定,且人類難以閱讀。它們分為機器碼(二進位)和組合語言(助憶碼)。
1.2 高階語言 (High-Level Languages, HLLs)
高階語言的設計初衷是讓人類更容易閱讀、編寫和理解。它們使用的詞彙和結構與人類語言及數學相似。
高階語言的主要特性:
- 可移植性 (Portable):在一部電腦上編寫的程式碼,通常可以在許多不同類型的硬體(例如 Mac、PC、Linux)上執行,無需進行重大修改。
- 抽象化 (Abstract):程式設計師不需要了解 CPU 硬體的具體細節。
- 更容易除錯 (debug) 和維護。
範例:Python、Java、C++ 和 JavaScript 等語言都是高階語言。
如果你想讓電腦將兩個數字相加,在高階語言中,你只需寫:
total = num1 + num2
這比寫幾頁的 1 和 0 明確多了!
類比時間:
把程式語言想像成駕駛汽車:
低階語言:你必須手動調整每一個零件:火星塞的點火正時、燃油噴射量、活塞上的精確壓力。
高階語言:你只需要踩下油門踏板(簡單!),車子就會自動幫你處理所有複雜的機械運作。
2. 翻譯的必要性
這裡有一個黃金法則:CPU 只能執行以機器碼(二進位)編寫的指令。
由於高階語言(如 Python)是以類似英語的單字編寫的,因此在 CPU 執行之前,必須將它們轉換為機器碼。這個轉換過程稱為翻譯 (translation),而執行此轉換的程式則稱為翻譯程式 (translators)。
如果剛開始覺得這很複雜也不要擔心!翻譯程式就像在異國工作的人類口譯員一樣——它們架起了溝通的橋樑。
3. 翻譯程式的類型(語言橋樑)
你需要知道三種主要的軟體翻譯程式:組譯器 (Assemblers)、編譯器 (Compilers) 和直譯器 (Interpreters)。
3.1 編譯器 (Compiler)
編譯器 (Compiler) 是一種專門處理高階語言的翻譯程式。
編譯器的工作原理:
編譯器會在程式執行前,將整個原始碼 (source code)一次性翻譯成機器碼。
- 編譯器讀取原始的高階程式碼(即原始碼)。
- 它會檢查整個程式是否存在錯誤(語法錯誤)。
- 如果沒有錯誤,它會將整個程式轉換成一個名為目的碼 (object code)(即機器碼)的新檔案。
- 這個目的碼會被儲存為一個獨立的執行檔(例如 .exe 檔),使用者隨時都可以執行,而不需要再次使用編譯器。
編譯器的優缺點:
- 優點(速度):一旦編譯完成,程式執行速度非常快,因為翻譯工作已經完成。
- 優點(發布):它會建立一個永久的執行檔,可以在不共享原始碼的情況下進行銷售或分享。
- 缺點(開發):在進行測試或執行之前,整個程式必須完全沒有錯誤。尋找錯誤需要重新編譯整個程式碼,這可能會很慢。
編譯器就像把整本書從法文翻譯成中文。初期需要花費很長的時間(編譯),但一旦完成,任何人都可以立即閱讀這本中文書(執行檔)。
3.2 直譯器 (Interpreter)
直譯器 (Interpreter) 也是高階語言的翻譯程式,但它的運作方式與編譯器截然不同。
直譯器的工作原理:
直譯器會在程式執行時,逐行翻譯並執行原始碼。
- 直譯器讀取原始碼的第一行。
- 將該行翻譯成機器碼。
- 立即執行該行。
- 接著處理下一行,並重複上述過程。
直譯器的優缺點:
- 優點(除錯):如果發現錯誤,直譯器會立即停止並告知程式設計師錯誤在哪一行,這使得測試和除錯過程變得更快。
- 優點(測試):即使只完成了一小部分程式碼,程式也能立即執行。
- 缺點(速度):程式執行的速度通常比編譯後的程式碼慢,因為程式每次執行時,每一行都必須重新翻譯。
- 缺點(無執行檔):它不會產生永久、獨立的執行檔。每次執行程式時,必須同時具備原始碼和直譯器。
3.3 組譯器 (Assembler)
組譯器 (Assembler) 是最簡單的翻譯程式類型。它的工作非常明確:將組合語言(助憶碼)翻譯成機器碼(二進位)。
由於組合語言本身就非常接近機器碼,因此這種翻譯過程相當直接,速度通常非常快。
- 編譯器 (Compiler):一次性翻譯整套 (Complete)程式。優點是執行速度快。
- 直譯器 (Interpreter):以互動方式 (Interactively)逐行翻譯。優點是有利於找出程式錯誤。
4. 編譯器與直譯器的比較
編譯器與直譯器之間的區別是考試中的一個重要考點。你必須能夠說明它們在方法、速度和產出物方面的差異。
以下是比較兩者關鍵差異的對照表:
翻譯程式的關鍵差異
| 特徵 | 編譯器 (Compiler) | 直譯器 (Interpreter) |
|---|---|---|
| 翻譯方法 | 一次性翻譯整個程式。 | 逐行翻譯並執行。 |
| 產出檔案 | 產生永久、獨立的執行檔(目的碼)。 | 不產生永久的目的碼;每次執行程式時都會重新翻譯。 |
| 執行速度 | 快(因為翻譯已經完成)。 | 慢(因為翻譯過程發生在執行時)。 |
| 錯誤處理 (除錯) | 只有在檢查完整個程式後,才會報告所有錯誤。 | 一旦遇到第一個錯誤就會立即停止,使除錯更容易。 |
你知道嗎?Python 是一種非常流行的高階語言,在開發階段通常使用直譯器,因為它讓除錯變得非常迅速!不過,有些公司在追求極致執行速度時,會為 Python 使用專用的編譯器。
要避免的常見陷阱!
一個常見的錯誤是忽略了:儘管直譯器在最終執行程式時較慢,但對於程式設計師來說,在開發階段它們通常速度更快,因為它們能立即指出錯誤。回答問題時,務必說明為什麼其中一種較快(是執行速度還是除錯速度)。
章節重點總結
- 低階語言 (LLL) 包括機器碼(1 和 0)和組合語言(助憶碼)。它們速度快,但與特定硬體綁定。
- 高階語言 (HLL) 接近人類語言,易於除錯且具有可移植性。
- 所有高階語言必須由編譯器或直譯器翻譯成機器碼。
- 編譯器會翻譯整個程式,產生一個執行速度快的執行檔。
- 直譯器會逐行翻譯,雖然執行速度較慢,但對於程式設計過程中的快速除錯非常有效。