歡迎來到程式翻譯的世界!

你好!你是否曾經好奇過,電腦到底是怎麼讀懂你用 Python 或 Java 寫的程式碼呢?電腦雖然運算速度快得驚人,但其實它們的「頭腦」很簡單:它們只看得懂二進制(0 和 1)。對電腦來說,讀取 "print('Hello')" 的難度就跟烤麵包機去讀莎士比亞的十四行詩一樣,根本是不可能的任務!

在這一章,我們將探索計算機世界裡的「萬能翻譯官」。你將會認識組譯器 (Assemblers)編譯器 (Compilers) 以及直譯器 (Interpreters)。這些工具成功拉近了人類創意與電腦邏輯之間的距離。別擔心,即使聽起來有點硬核,我們會透過大量的類比將這些概念拆解開來,保證你一聽就懂!


1. 原始碼 (Source Code) 與目的碼 (Object Code)

在我們深入認識翻譯工具之前,必須先搞懂翻譯過程的「前」與「後」。

原始碼 (Source Code): 這是由程式設計師使用高階語言(如 Python)或低階組合語言編寫的程式碼。它是人類可讀的,但 CPU 無法直接執行。
目的碼/執行檔 (Object Code): 這是翻譯後的最終產品。它是 CPU 可以直接執行的機器碼(二進制)。一旦擁有了目的碼,電腦就知道該怎麼做了。

類比:你可以把「原始碼」想像成食譜,而「目的碼」則是實際做出來的蛋糕。你無法直接吃掉食譜,你需要透過烹飪過程將食譜轉換成「胃」(CPU)能夠消化的食物!

快速複習:
- 原始碼: 人類寫的程式。
- 目的碼: 電腦執行的程式。


2. 組譯器 (The Assembler)

組譯器 (Assembler) 是一種非常專業的翻譯工具,專門用來處理組合語言 (Assembly Language)(一種低階語言)。

組合語言使用簡短的單字,稱為「助記符」(Mnemonics,例如 ADDSUBMOV) 來代表機器指令。因為每一個組合語言指令通常都精確對應到一個機器碼指令,所以翻譯過程非常直接。

角色:組合語言翻譯成機器碼

關鍵要點: 組譯器是「一對一」的翻譯。一行組合語言通常會變成一行二進制代碼。


3. 編譯器 (The Compiler)

編譯器 (Compiler) 適用於高階語言。它會在程式執行前,將整個原始碼檔案一次過翻譯成目的碼。

運作方式(步驟):
1. 你寫好程式碼。
2. 你執行編譯器。
3. 編譯器會檢查整個檔案是否有錯誤。
4. 如果沒有錯誤,它會產生一個獨立的執行檔(例如 Windows 上的 .exe)。
5. 之後你想執行程式時,直接打開那個執行檔即可。

編譯器的優點:
- 速度: 翻譯工作早已完成,所以程式執行起來非常快。
- 隱私: 你可以分享執行檔給別人,而不需要公開你的原始碼。

編譯器的缺點:
- 除錯 (Debugging): 如果出現錯誤,你必須修改程式碼,然後重新編譯整個程式。
- 平台限制: 為 Windows 編譯的程式,通常無法在 Mac 上執行。

類比:編譯器就像一位專業的翻譯員,將整本法文小說翻譯成英文書。一旦書印刷好了,英文讀者就可以立即閱讀,而不需要那位翻譯員在場,也不需要原始的法文書。


4. 直譯器 (The Interpreter)

直譯器 (Interpreter) 的運作方式則完全不同。它會以「逐行」的方式,即時地對原始碼進行翻譯並執行。

運作方式(步驟):
1. 直譯器先看第一行程式碼。
2. 檢查該行有無錯誤。
3. 將該行翻譯成機器碼,並立即要求 CPU 執行。
4. 接著移到下一行,重複同樣的過程。

直譯器的優點:
- 除錯容易: 程式在執行到錯誤的那一刻就會立刻停止,讓你清楚知道問題出在哪裡。
- 可攜性: 只要電腦安裝了直譯器,同一份原始碼可以在任何機器上運行。

直譯器的缺點:
- 速度較慢: 因為它在執行時同步進行翻譯,所以執行速度不如編譯程式。
- 需保留原始碼: 你必須將原始碼和直譯器軟體一起提供給使用者。

類比:直譯器就像聯合國會議上的即時口譯員。當發言者說出一句法文時,口譯員會立刻說出英文翻譯。如果發言者講錯了,口譯員會當場停止。


5. 編譯與直譯:該如何選擇?

如果搞不清楚哪個「比較好」也不用擔心,這通常取決於你的使用情境!

在以下情況使用編譯器:
- 你希望程式執行速度越快越好(例如高階大型遊戲)。
- 你想將軟體商業化發行,但不希望公開原始碼。

在以下情況使用直譯器:
- 你正處於開發和測試程式碼的階段(原型製作)。
- 你希望程式能輕鬆地在多種不同類型的電腦上執行。

你知道嗎?
Python 是直譯式語言的代表,而 C++ 則是編譯式語言的著名例子!


6. 中間語言 (Bytecode)

一些現代語言(如 Java)採用了一種聰明的「中間路線」。它們不會直接翻譯成機器碼,而是先將原始碼翻譯成一種稱為中間碼 (Intermediate Code)(通常稱為 Bytecode/位元組碼)的東西。

過程:
1. 編譯器將原始碼轉換成 Bytecode
2. 這種 Bytecode 隨後由使用者電腦上的直譯器(通常稱為虛擬機 Virtual Machine)來執行。

為什麼要這麼做?
這讓我們同時擁有兩者的優勢!Bytecode 是「預先翻譯」過的,所以比原始程式碼快,同時又具備高度的可攜性。你只需將程式編譯成一次 Bytecode,這份程式碼就能在手機、筆電或冰箱上運行,只要它們有正確的虛擬機即可!

關鍵要點: 中間碼是高階程式碼與機器碼之間的緩衝地帶,專為可攜性而設計。


總結檢查清單

看看你是否能向他人解釋以下考試關鍵點:
- 組譯器 (Assembler): 將組合語言助記符轉為機器碼(一對一)。
- 編譯器 (Compiler): 一次過翻譯整個程式;產生執行檔。
- 直譯器 (Interpreter): 逐行翻譯並執行;非常適合除錯。
- 原始碼 (Source Code): 人類可讀的版本。
- 目的碼 (Object Code): CPU 執行的二進制版本。
- Bytecode: 部分編譯程式所使用的可攜式中間語言。

常見錯誤提醒: 許多學生以為直譯器會像編譯器一樣產生一個永久的檔案。它不會! 直譯器是在你每次執行程式時都進行「即時」翻譯,不會儲存任何新檔案。

繼續練習!你做得很好!理解這些基本概念是成為頂尖電腦科學家的基石。