程式轉譯器簡介

你好!歡迎來到 AQA A Level 電腦科學之旅中最重要章節之一。你有沒有想過,電腦明明只看得懂 1 和 0,它是怎麼執行你用 Python 或 C# 等語言寫出的程式呢?

秘密就在於轉譯器 (Translator)。你可以把轉譯器想像成人類語言與機器邏輯之間的橋樑。在本指南中,我們將拆解不同類型的轉譯器、它們的運作方式以及使用時機。如果一開始覺得內容很多也不用擔心;我們會一步一步來!

1. 源代碼與目標代碼

在我們探討轉譯器本身之前,需要先了解程式的兩種「狀態」:

源代碼 (Source Code):這是程式設計師使用高級語言(如 Python 或 Java)或組合語言編寫的代碼。它對於人類來說易於閱讀和編寫,但 CPU 無法直接理解。

目標代碼 (Object/Executable Code):這是由轉譯器產生的機器碼 (Machine Code)。它完全由二進位(1 和 0)組成。這是 CPU 唯一能夠實際執行的「語言」。

類比:將源代碼想像成食譜,而目標代碼則是煮好的菜餚。你無法直接「吃」食譜;你需要一個「烹飪過程」將指令轉化為「胃」(CPU)能夠處理的東西!
重點總結:

轉譯器以源代碼作為輸入,產生目標代碼作為輸出。

2. 三種常見轉譯器

轉譯代碼主要使用三種軟體。根據你所使用的語言類型,每一種都有其特定的任務。

A. 組譯器 (Assembler)

組譯器用於將組合語言 (Assembly Language) 轉換為機器碼

由於組合語言是一種「低級」語言,每個指令通常對應一個唯一的機器碼指令。這稱為一對一關係 (one-to-one relationship)

B. 編譯器 (Compiler)

編譯器會將整個高級語言源代碼一次性轉換為目標代碼。它會掃描整個程式,並建立一個獨立的檔案(例如 .exe 檔案),讓使用者稍後可以執行。

編譯器速覽: - 一次過轉譯整個程式
- 產生一個可執行檔(目標代碼)。
- 轉譯過程較慢,但最終產生的程式執行速度非常快

C. 直譯器 (Interpreter)

直譯器會將高級語言源代碼逐行轉換為機器碼。它會讀取一行、翻譯一行,並在移至下一行之前立即執行該指令。

直譯器速覽: - 每次只轉譯並執行一行
- 不會儲存單獨的目標代碼檔案。
- 執行速度較,因為每次執行程式時都要重新轉譯。

記憶法:記住 A-C-I (Assembler 組譯器、Compiler 編譯器、Interpreter 直譯器)。
重點總結:

組譯器用於低級代碼。編譯器一次性轉譯所有內容。直譯器則邊讀邊轉譯。

3. 編譯器 vs 直譯器:哪個比較好?

沒有所謂「更好」——它們只是用途不同!以下是它們的比較:

什麼時候使用編譯器?
- 你希望獲得最快的執行速度(例如高階電子遊戲)。
- 你希望在不分享原始源代碼的情況下發布軟體(使用者只會收到 .exe 檔案)。
- 程式已經完成並準備發布給公眾使用。

什麼時候使用直譯器?
- 你正在除錯 (debugging)。由於程式在遇到錯誤時會立即停止,這讓找出錯誤變得容易得多!
- 你編寫的代碼需要在許多不同類型的電腦上執行(可移植性)。
- 你還處於開發程式的初期階段。

常見誤區:學生經常認為編譯器會「執行」程式。其實不會!它只負責轉譯。你稍後才執行生成的目標代碼檔案。相反,直譯器則是同時進行轉譯和執行。

4. 中間語言 (Bytecode,字節碼)

一些現代語言(如 Java)使用一種巧妙的「混合」方法。它們不是直接轉換為機器碼,而是將源代碼轉換為稱為字節碼 (Bytecode) 的中間格式。

什麼是字節碼?
這是一種中間的「半成品」語言。它既不是源代碼,也不是機器碼。

為什麼要用它?
1. 可移植性 (Portability):你可以將代碼編譯成字節碼一次。該字節碼隨後可以在任何擁有「虛擬機器」(如 Java 虛擬機器)的電腦上執行,無論是 Mac、PC 還是手機。這稱為平台獨立性 (Platform Independence)
2. 安全性:字節碼在你的程式與硬體之間充當了一層保護屏障。

你知道嗎? Java 字節碼方案的口號是「一次編寫,隨處執行」(Write Once, Run Anywhere, WORA)。
重點總結:

字節碼是由編譯器產生的中間代碼,隨後由目標設備上的直譯器(虛擬機器)執行。

最終複習檢查表

在繼續學習之前,確保你能回答這些問題:
- 我能定義源代碼目標代碼嗎?
- 我知道哪種轉譯器是用於組合語言的嗎?
- 我能說出編譯器相對於直譯器的兩個優點嗎?
- 我能解釋為什麼開發者會使用字節碼嗎?

如果一開始覺得很難,別擔心!程式轉譯是一個深奧的主題,但一旦你理解了「一次性完成」(編譯器)與「逐行執行」(直譯器)之間的區別,其餘的部分就會豁然開朗了。