A1.4 程式翻譯(HL)
程式翻譯(Translation)是把人類寫的高階語言轉成 CPU 能執行的機器碼的過程,主要有編譯器(compiler)與直譯器(interpreter)兩種方式,以及結合兩者的位元組碼(bytecode)與即時編譯(Just-In-Time, JIT)。本子題只有 HL 需要學,重點是從錯誤偵測、翻譯時間、可攜性與適用情境比較各種翻譯方式。
HL 專屬子題
A1.4 整個子題只出現在 HL 考卷,SL 學生可略過本頁。
為什麼程式需要翻譯?
CPU 只認得自己架構的 機器碼(machine code),也就是一串二進位指令。組合語言(assembly language) 用助記符(例如 ADD、LOAD)一對一表示機器碼,由組譯器(assembler)翻譯。Python、Java 等 高階語言(high-level language) 一行可能對應很多條機器指令,需要編譯器或直譯器翻譯。
編譯器和直譯器有什麼不同?
- 編譯器(compiler):執行前把整個原始碼一次翻譯成機器碼,產生可執行檔(例如 C、C++、Rust)。
- 直譯器(interpreter):執行時逐行(或逐敘述)翻譯並立刻執行,不產生獨立可執行檔(例如傳統的 Python、JavaScript 直譯器)。
| 比較面向 | 編譯器 | 直譯器 |
|---|---|---|
| 錯誤偵測 | 編譯時一次列出所有語法錯誤,修完才能執行 | 執行到錯誤那一行才停下,之前的程式已經執行 |
| 翻譯時間 | 執行前要花時間完整編譯 | 不用先編譯,馬上開始執行 |
| 執行速度 | 快,已是機器碼並可最佳化 | 較慢,每次執行都要重新翻譯 |
| 可攜性 | 可執行檔綁定特定 CPU/OS,換平台需重新編譯 | 只要目標平台有直譯器,同一份原始碼就能執行 |
| 原始碼保護 | 只發布可執行檔,原始碼不外流 | 通常需要發布原始碼 |
| 適用情境 | 發布正式產品、效能要求高的軟體 | 開發與除錯、教學、腳本 |
位元組碼與 JIT 如何結合兩者優點?
位元組碼(bytecode) 是介於原始碼與機器碼之間的中間碼。以 Java 為例:
javac把.java編譯成平台無關的.class位元組碼。- 各平台的 Java 虛擬機器(Java Virtual Machine, JVM) 執行位元組碼。
- JVM 的 JIT 編譯器 在執行期間偵測常被執行的程式片段(hot spots),把它們編譯成原生機器碼並快取,之後直接執行機器碼。
flowchart LR
A["Main.java<br/>原始碼"] -->|javac 編譯| B["Main.class<br/>位元組碼"]
B --> C["JVM<br/>Windows"]
B --> D["JVM<br/>macOS"]
B --> E["JVM<br/>Linux"]
C -->|JIT| F["原生機器碼"]
這種「先編譯成位元組碼、再由虛擬機器直譯或 JIT」的做法,同時得到 可攜性(Write once, run anywhere)與 接近編譯語言的速度。Python(CPython)也會把原始碼先編成 .pyc 位元組碼再由虛擬機器執行;PyPy 則加入 JIT。
| 方式 | 錯誤偵測 | 啟動速度 | 執行速度 | 可攜性 |
|---|---|---|---|---|
| 編譯 | 最早(編譯期) | 快(已編好) | 最快 | 低 |
| 直譯 | 執行期 | 快(不用編譯) | 慢 | 高 |
| 位元組碼 + JIT | 編譯期抓語法錯誤 | 稍慢(JVM 暖機) | 熱點接近原生 | 高 |
推薦影音
最早的程式語言與編譯器
簡述:Crash Course 從機器碼、組合語言講到 Grace Hopper 發明的編譯器,說明高階語言為什麼需要翻譯,適合當本頁的背景知識。
編譯器與直譯器比較
簡述:用圖解比較編譯器與直譯器的運作流程、錯誤處理與執行速度,可搭配本頁的比較表複習。
練習題
練習 1:選擇翻譯方式
一家公司要開發 (a) 在多種作業系統上執行的桌面應用程式;(b) 嵌入式控制器上、需要極快反應的韌體。各建議用哪種翻譯方式?
參考答案
(a) 位元組碼 + 虛擬機器(例如 Java/JVM),同一份位元組碼可在各平台執行,JIT 提供不錯的效能。(b) 編譯成目標硬體的原生機器碼,執行最快、不需要虛擬機器的記憶體與暖機時間。
練習 2:錯誤偵測
一份程式第 3 行與第 50 行各有一個語法錯誤。分別說明使用編譯器與直譯器時,程式設計師會看到什麼。
參考答案
編譯器:編譯時同時回報兩個錯誤,程式完全不會執行。直譯器:第 1、2 行會先執行,到第 3 行才報錯停止;修好第 3 行後重新執行,要到第 50 行才會發現第二個錯誤。
練習 3:評估 JIT
Evaluate 使用 JIT 編譯的優缺點(至少各兩點)。
參考答案
優點:熱點程式碼編成原生碼,速度接近編譯語言;保留位元組碼的跨平台可攜性;可依實際執行資訊做最佳化。缺點:程式啟動時需要暖機,前期較慢;JIT 編譯器與快取佔用額外記憶體;行為較難預測,不適合嚴格即時系統。結論:適合長時間執行的伺服器與桌面程式,不適合資源極有限或要求即時性的嵌入式系統。