學習筆記:程式語言分類與翻譯程式

各位未來的電腦科學家,你好!歡迎來到令人興奮的程式設計世界。在本章中,我們將學習人類(也就是我們!)如何向電腦傳達指令,以及電腦又是如何理解這些指令的。你可以把這一章想像成學習如何打造一台「萬能翻譯機」!理解這些概念非常重要,因為它解釋了為什麼你的程式碼最終能執行得如此之快。

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)一次性翻譯成機器碼。

  1. 編譯器讀取原始的高階程式碼(即原始碼)。
  2. 它會檢查整個程式是否存在錯誤(語法錯誤)。
  3. 如果沒有錯誤,它會將整個程式轉換成一個名為目的碼 (object code)(即機器碼)的新檔案。
  4. 這個目的碼會被儲存為一個獨立的執行檔(例如 .exe 檔),使用者隨時都可以執行,而不需要再次使用編譯器。
編譯器的優缺點:
  • 優點(速度):一旦編譯完成,程式執行速度非常快,因為翻譯工作已經完成。
  • 優點(發布):它會建立一個永久的執行檔,可以在不共享原始碼的情況下進行銷售或分享。
  • 缺點(開發):在進行測試或執行之前,整個程式必須完全沒有錯誤。尋找錯誤需要重新編譯整個程式碼,這可能會很慢。
類比:翻譯過的書
編譯器就像把整本書從法文翻譯成中文。初期需要花費很長的時間(編譯),但一旦完成,任何人都可以立即閱讀這本中文書(執行檔)。

3.2 直譯器 (Interpreter)

直譯器 (Interpreter) 也是高階語言的翻譯程式,但它的運作方式與編譯器截然不同。

直譯器的工作原理:

直譯器會在程式執行時,逐行翻譯並執行原始碼。

  1. 直譯器讀取原始碼的第一行。
  2. 將該行翻譯成機器碼。
  3. 立即執行該行。
  4. 接著處理下一行,並重複上述過程。
直譯器的優缺點:
  • 優點(除錯):如果發現錯誤,直譯器會立即停止並告知程式設計師錯誤在哪一行,這使得測試和除錯過程變得更快。
  • 優點(測試):即使只完成了一小部分程式碼,程式也能立即執行。
  • 缺點(速度):程式執行的速度通常比編譯後的程式碼,因為程式每次執行時,每一行都必須重新翻譯。
  • 缺點(無執行檔):不會產生永久、獨立的執行檔。每次執行程式時,必須同時具備原始碼和直譯器。

3.3 組譯器 (Assembler)

組譯器 (Assembler) 是最簡單的翻譯程式類型。它的工作非常明確:將組合語言(助憶碼)翻譯成機器碼(二進位)。

由於組合語言本身就非常接近機器碼,因此這種翻譯過程相當直接,速度通常非常快。

快速比較檢查點
  • 編譯器 (Compiler):一次性翻譯整套 (Complete)程式。優點是執行速度快。
  • 直譯器 (Interpreter):互動方式 (Interactively)逐行翻譯。優點是有利於找出程式錯誤。

4. 編譯器與直譯器的比較

編譯器與直譯器之間的區別是考試中的一個重要考點。你必須能夠說明它們在方法、速度和產出物方面的差異。

以下是比較兩者關鍵差異的對照表:

翻譯程式的關鍵差異

特徵 編譯器 (Compiler) 直譯器 (Interpreter)
翻譯方法 一次性翻譯整個程式 逐行翻譯並執行。
產出檔案 產生永久、獨立的執行檔(目的碼)。 不產生永久的目的碼;每次執行程式時都會重新翻譯。
執行速度 (因為翻譯已經完成)。 (因為翻譯過程發生在執行時)。
錯誤處理 (除錯) 只有在檢查完整個程式後,才會報告所有錯誤。 一旦遇到第一個錯誤就會立即停止,使除錯更容易。

你知道嗎?Python 是一種非常流行的高階語言,在開發階段通常使用直譯器,因為它讓除錯變得非常迅速!不過,有些公司在追求極致執行速度時,會為 Python 使用專用的編譯器。

要避免的常見陷阱!

一個常見的錯誤是忽略了:儘管直譯器在最終執行程式時較慢,但對於程式設計師來說,在開發階段它們通常速度更快,因為它們能立即指出錯誤。回答問題時,務必說明為什麼其中一種較快(是執行速度還是除錯速度)。

章節重點總結

  • 低階語言 (LLL) 包括機器碼(1 和 0)和組合語言(助憶碼)。它們速度快,但與特定硬體綁定。
  • 高階語言 (HLL) 接近人類語言,易於除錯且具有可移植性。
  • 所有高階語言必須由編譯器直譯器翻譯成機器碼。
  • 編譯器會翻譯整個程式,產生一個執行速度快的執行檔。
  • 直譯器會逐行翻譯,雖然執行速度較慢,但對於程式設計過程中的快速除錯非常有效。