你好,未來的程式設計師!歡迎來到程式語言的世界

歡迎來到計算機科學中最令人興奮的章節之一!本章將探討人類如何與電腦進行溝通——這就像是在學習數位世界中的「秘密握手」。

不用擔心「編譯器」(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)

編譯器是一種程式,它在程式執行之前,將整個高階語言程式一次過全部翻譯成機器碼。

編譯的步驟:
  1. 編譯器獲取整個原始碼文件。
  2. 它會掃描程式碼中的錯誤(語法、邏輯)。如果發現錯誤,程序會停止,設計師必須修正它們。
  3. 如果沒有錯誤,編譯器會生成一個全新的、獨立的檔案,其中包含目的碼(機器碼)。這個新檔案通常被稱為可執行檔 (executable file)
  4. 電腦隨後可以直接執行這個可執行檔,而無需編譯器或原始碼。
編譯器的優缺點:
  • + 優點(速度):編譯後的程式執行速度非常快,因為翻譯工作早已完成。
  • + 優點(發布):程式設計師只需要分享可執行檔,從而保護了原始碼。
  • – 缺點(除錯):如果發現錯誤,每次修改後都必須重新編譯整個程式,在開發階段可能會較慢。
比喻:編譯器就像書籍翻譯員

編譯器就像是將一本法文書籍「整本」翻譯成中文的翻譯員。一旦中文版譯好了,你就可以快速閱讀它,而無需那位翻譯員隨時在場。

3.3 直譯器 (Interpreter)

直譯器是一種逐行翻譯並執行高階語言程式的工具,一次只處理一條指令。

直譯的步驟:
  1. 直譯器讀取原始碼的第一行。
  2. 將該行翻譯成機器碼。
  3. CPU 立即執行該行翻譯後的指令。
  4. 然後移動到下一行(重複步驟 2 和 3)。

關鍵點:直譯器不會產生獨立的可執行檔。原始碼必須在每次執行程式時重新進行翻譯。

直譯器的優缺點:
  • + 優點(除錯):非常適合找出錯誤。如果第 50 行出錯,程式會立即在第 50 行停止,讓你輕鬆定位問題。
  • + 優點(開發):測試小變更的速度很快,因為不需要等待完整的編譯過程。
  • – 缺點(速度):整體執行速度較慢,因為每次執行程式時都必須進行翻譯(存在翻譯負擔)。
  • – 缺點(執行):每當使用者想執行程式時,必須同時提供原始碼和直譯器軟體。
比喻:直譯器就像現場口譯員

直譯器就像研討會上的即時口譯員。演講者說一句(原始碼),翻譯員立即說出對應的語言(執行),然後等待下一句。這比閱讀已翻譯好的書籍慢,但如果發生錯誤(如發音錯誤),可以立即發現並更正。

3.4 比較編譯器與直譯器

這是考試中的熱門考點!請使用下表來牢記它們的分別:

特性 編譯器 (Compiler) 直譯器 (Interpreter)
翻譯方式 一次過翻譯整個程式 逐行翻譯並執行。
輸出檔案 建立獨立的目的碼(可執行檔)。 不會建立獨立的可執行檔。
執行速度 快(翻譯只需進行一次)。 較慢(每次執行程式時都要翻譯)。
除錯(發現錯誤) 較難;需嘗試完整翻譯後才會報告錯誤。 容易;發現錯誤時立即停止。
對原始碼的需求 僅在編譯時需要;執行時無需原始碼。 每次執行程式時都需要原始碼。
記憶小技巧 (Mnemonic):

Compiler (編譯器) = Complete (完整的) 翻譯。
Interpreter (直譯器) = Interrupts (會在出錯時中斷)。

總結重點

電腦只理解機器碼(1 和 0)。我們使用高階語言是因為它們對人類來說更容易編寫。這些語言必須透過組譯器(用於組譯語言)、編譯器(一次翻譯並產生可執行檔)或直譯器(逐行翻譯,每次執行皆需原始碼)進行翻譯。

你已經掌握了軟體如何與硬體溝通的基礎——這是非常重要的一大步!