你好,未來的程式設計師!歡迎來到程式語言的世界
歡迎來到計算機科學中最令人興奮的章節之一!本章將探討人類如何與電腦進行溝通——這就像是在學習數位世界中的「秘密握手」。
不用擔心「編譯器」(compiler)或「機器碼」(machine code)這些術語聽起來很嚇人。我們將使用簡單的比喻,一步步為你拆解這些概念。在這一節結束時,你將會理解那些能把你腦中絕妙的創意,轉化為實體軟體的基本工具!
1. 為何需要程式語言
想像一下,你需要向機器人下達詳細的指令。如果你用廣東話或英文對它大喊,機器人可能聽不懂。電腦也是一樣——它們擁有自己獨特的語言。
電腦理解的是什麼(真相是……)
從核心層面來看,所有的電腦(特別是 CPU)只理解電訊號:開或關,也就是 1 或 0。這種二進制序列就是電腦的「母語」。
- 問題:對於人類來說,使用成千上萬個 1 和 0 來編寫複雜的程式(例如遊戲或試算表軟體)是不可能的,而且效率極低。
- 解決方案:我們使用人類更容易閱讀和編寫的「程式語言」。這些語言隨後需要一個特殊的翻譯官,將我們的指令轉換成電腦能聽懂的 1 和 0。
2. 程式語言的級別
程式語言是根據它們與電腦硬體的「親疏程度」來分類的:靠近硬體的稱為「低階」,而靠近人類語言的則稱為「高階」。
2.1 低階語言(更接近硬體)
低階語言對人類來說很難掌握,但對電腦而言運作速度極快。它們通常與所使用的處理器(CPU)型號直接掛鉤。
A. 機器碼 (Machine Code)
這是最低階的語言——也是 CPU 唯一能直接執行的語言。
-
格式:二進制(一系列的 1 和 0)。
例子:10110000 01100001(這可能代表「載入數字 97」的意思)。 - 難度:極高,容易出錯,而且幾乎無法除錯(debug)。
- 優勢:用機器碼寫的程式運作速度極快,因為不需要經過任何翻譯。
B. 組譯語言 (Assembly Language)
組譯語言是高一階的語言。它使用簡短的代碼來代替 1 和 0,讓程式設計師閱讀起來稍微容易一點。
- 格式:使用助記符(Mnemonics,發音為:nee-MON-icks)。助記符是簡單的三字母代碼,代表機器碼指令。
-
助記符例子:
- ADD(相加兩個數字)
- MOV(移動數據)
- JMP(跳轉到不同的指令)
- 硬體依賴性:組譯語言與特定處理器的架構(設計)直接綁定。為 Intel CPU 編寫的程式,如果不經過修改是無法在 ARM CPU 上執行的。
低階 = 人類難以閱讀、電腦運作極快、依賴特定硬體。
2.2 高階語言(更接近人類語言)
高階語言 (HLLs) 是你通常會學習的語言,例如 Python、Java 或 C++。它們旨在讓人類能輕鬆地編寫複雜的程式。
- 格式:使用類似英文和標準數學符號的語法。
-
例子:
IF score > 90 THEN print("Excellent") - 可移植性 (Portability):高階語言程式通常具有「可移植性」。這意味著同一個程式可以在不同類型的電腦(例如 Windows、Mac、Linux)上執行,只需很少甚至不需要修改。
- 易用性:與低階語言相比,它們更容易編寫、除錯和維護。
第一個成功的高階語言是 1950 年代誕生的 Fortran!它的設計初衷是為了讓科學計算比直接用組譯語言編寫更加簡單。
3. 語言翻譯工具(不可或缺的橋樑)
由於電腦只懂機器碼(1 和 0),任何用組譯語言或高階語言編寫的程式,在 CPU 執行前都必須經過翻譯。
程式設計師寫的程式稱為原始碼 (Source Code)。翻譯後、可直接執行的版本則稱為目的碼 (Object Code)。
3.1 組譯器 (Assembler)
組譯器是最簡單的翻譯工具。
- 功能:它將組譯語言直接轉換為機器碼。
- 過程:這是一種一對一的翻譯(一個助記符指令對應一個機器碼指令)。
3.2 編譯器 (Compiler)
編譯器是一種程式,它在程式執行之前,將整個高階語言程式一次過全部翻譯成機器碼。
編譯的步驟:
- 編譯器獲取整個原始碼文件。
- 它會掃描程式碼中的錯誤(語法、邏輯)。如果發現錯誤,程序會停止,設計師必須修正它們。
- 如果沒有錯誤,編譯器會生成一個全新的、獨立的檔案,其中包含目的碼(機器碼)。這個新檔案通常被稱為可執行檔 (executable file)。
- 電腦隨後可以直接執行這個可執行檔,而無需編譯器或原始碼。
編譯器的優缺點:
- + 優點(速度):編譯後的程式執行速度非常快,因為翻譯工作早已完成。
- + 優點(發布):程式設計師只需要分享可執行檔,從而保護了原始碼。
- – 缺點(除錯):如果發現錯誤,每次修改後都必須重新編譯整個程式,在開發階段可能會較慢。
編譯器就像是將一本法文書籍「整本」翻譯成中文的翻譯員。一旦中文版譯好了,你就可以快速閱讀它,而無需那位翻譯員隨時在場。
3.3 直譯器 (Interpreter)
直譯器是一種逐行翻譯並執行高階語言程式的工具,一次只處理一條指令。
直譯的步驟:
- 直譯器讀取原始碼的第一行。
- 將該行翻譯成機器碼。
- CPU 立即執行該行翻譯後的指令。
- 然後移動到下一行(重複步驟 2 和 3)。
關鍵點:直譯器不會產生獨立的可執行檔。原始碼必須在每次執行程式時重新進行翻譯。
直譯器的優缺點:
- + 優點(除錯):非常適合找出錯誤。如果第 50 行出錯,程式會立即在第 50 行停止,讓你輕鬆定位問題。
- + 優點(開發):測試小變更的速度很快,因為不需要等待完整的編譯過程。
- – 缺點(速度):整體執行速度較慢,因為每次執行程式時都必須進行翻譯(存在翻譯負擔)。
- – 缺點(執行):每當使用者想執行程式時,必須同時提供原始碼和直譯器軟體。
直譯器就像研討會上的即時口譯員。演講者說一句(原始碼),翻譯員立即說出對應的語言(執行),然後等待下一句。這比閱讀已翻譯好的書籍慢,但如果發生錯誤(如發音錯誤),可以立即發現並更正。
3.4 比較編譯器與直譯器
這是考試中的熱門考點!請使用下表來牢記它們的分別:
| 特性 | 編譯器 (Compiler) | 直譯器 (Interpreter) |
|---|---|---|
| 翻譯方式 | 一次過翻譯整個程式。 | 逐行翻譯並執行。 |
| 輸出檔案 | 建立獨立的目的碼(可執行檔)。 | 不會建立獨立的可執行檔。 |
| 執行速度 | 快(翻譯只需進行一次)。 | 較慢(每次執行程式時都要翻譯)。 |
| 除錯(發現錯誤) | 較難;需嘗試完整翻譯後才會報告錯誤。 | 容易;發現錯誤時立即停止。 |
| 對原始碼的需求 | 僅在編譯時需要;執行時無需原始碼。 | 每次執行程式時都需要原始碼。 |
Compiler (編譯器) = Complete (完整的) 翻譯。
Interpreter (直譯器) = Interrupts (會在出錯時中斷)。
總結重點
電腦只理解機器碼(1 和 0)。我們使用高階語言是因為它們對人類來說更容易編寫。這些語言必須透過組譯器(用於組譯語言)、編譯器(一次翻譯並產生可執行檔)或直譯器(逐行翻譯,每次執行皆需原始碼)進行翻譯。
你已經掌握了軟體如何與硬體溝通的基礎——這是非常重要的一大步!