歡迎來到程式語言的世界!

你好!今天我們要一起探索人類與電腦溝通的不同方式。電腦雖然速度極快,但其實並不「聰明」——它們只聽得懂「開」與「關」(也就是 1 和 0,即二進制)。程式語言就是我們用來跨越這道鴻溝的工具,連結我們複雜的人類思維與電腦簡單的二進制大腦。看完這些筆記,你就會明白為什麼我們需要不同的程式語言,以及我們如何將想法轉譯成機器能夠執行的指令。


1. 分類:低階語言與高階語言

在電腦科學中,我們根據程式語言與電腦硬體的距離,或是與人類語言的相似度,將其進行分類。

低階語言 (Low-Level Languages)

之所以稱為「低階」,是因為它們非常接近硬體(CPU 的實際電路)。主要分為兩種類型:

1. 機器碼 (Machine Code):這是電腦的「母語」。它完全由二進制(1 和 0)組成。對人類來說,閱讀或編寫這些代碼非常困難,但電腦可以直接執行,無需任何轉譯。

2. 組合語言 (Assembly Language):這是比機器碼高一級的語言。它不使用二進制,而是使用簡短的縮寫,稱為助憶碼 (mnemonics)(例如 ADDSUBMOV)。組合語言中的每一條指令通常直接對應一條機器碼指令。

高階語言 (High-Level Languages)

之所以稱為「高階」,是因為它們更接近人類語言。例如 Python、Java 和 C#。它們使用像英文一樣的關鍵字(如 ifwhileprint)。

指令式高階語言 (Imperative High-Level Languages):你所使用的大多數語言都是「指令式」的。這意味著代碼由一系列指令組成,一步步告訴電腦如何完成任務。

打個比方:高階語言想像成食譜(「把蛋糕烤 30 分鐘」)。而低階語言就像烤箱內部的齒輪為了轉動定時器和點燃瓦斯所進行的細微機械運動。

快速回顧:優缺點比較

高階語言較易學習、除錯較快,並且具有可移植性 (portable)(可以在不同類型的 CPU 上運行)。不過,由於需要轉譯,執行速度通常較慢。

低階語言讓你對硬體有絕對的控制權,且非常節省記憶體。但編寫難度極高,且針對特定處理器 (processor-specific)(為某種 CPU 編寫的組合語言無法在另一種 CPU 上運行)。

重點總結:高階語言偏向程式設計師(易用性),而低階語言則偏向機器(效率與控制)。


2. 轉譯代碼

由於電腦只看得懂機器碼,任何以高階語言或組合語言編寫的程式都必須進行轉譯。你可以把它們想像成聯合國的翻譯官。

三種轉譯器類型

1. 組譯器 (Assembler):組合語言轉譯為機器碼

2. 編譯器 (Compiler):整份高階原始碼一次過轉譯成機器碼,並建立一個可執行檔案(例如 .exe)。你只需要編譯一次,之後機器碼就可以不斷執行,無需再透過編譯器。

3. 解譯器 (Interpreter):逐行轉譯高階代碼。它讀取一行、轉換成機器碼、執行,然後再移至下一行。如果遇到錯誤,它會立即停止。

記憶小技巧:編譯器想像成書本的完整翻譯——你需要等一段時間等待翻譯完成,但之後隨時都可以閱讀整本書。將解譯器想像成同步口譯員——他們隨你說話進行翻譯,但如果你停止說話,翻譯也就跟著停止。

你知道嗎?Python 通常是一種解譯語言,這就是為什麼你可以在程式執行到一半時才看到錯誤!而 Java 則結合了兩者的特點。

重點總結:編譯器產生的檔案速度快且獨立;解譯器非常適合逐行測試代碼,但執行速度較慢。


3. 中間邏輯:字節碼 (Bytecode)

有時候,編譯器並不會直接編譯成機器碼。相反,它會將原始碼轉譯成一種稱為中間語言 (Intermediate Language)字節碼 (Bytecode) 的東西。

為什麼要使用字節碼?

主要原因是可移植性。不同的電腦配備不同的 CPU。如果你直接為 Intel 晶片編譯成機器碼,它在 ARM 晶片(如手機中的晶片)上就無法運行。
透過先轉譯成字節碼,這種「中間語言」可以發送到任何裝置。該裝置隨後使用其特定的「虛擬機 (Virtual Machine)」將字節碼轉譯為屬於該裝置的機器碼。這就是 Java 如何實現其「一次編寫,隨處執行 (Write Once, Run Anywhere)」目標的方法!

快速回顧:常見錯誤提醒!
不要混淆原始碼 (Source Code)目的碼 (Object Code)
原始碼:你親手編寫的程式碼(例如 Python 或 C#)。
目的碼:電腦實際執行、經過轉譯的機器碼

重點總結:字節碼是一個中間步驟,使軟體更容易在不同類型的硬體上運行。


最終總結檢查表

• 你知道機器碼是二進制而組合語言使用助憶碼嗎?
• 你能解釋為什麼高階語言對人類來說更容易嗎?
• 你能描述編譯器(整份編譯)與解譯器(逐行轉譯)之間的差異嗎?
• 你理解字節碼如何讓代碼在不同裝置間保持可移植性嗎?

如果覺得這些內容很多,別擔心!只要記住:核心就是「轉譯」。我們希望使用類似英文的語言工作,而電腦只想要 1 和 0。這一章提到的所有內容,都只是為了讓這場「溝通」得以實現的工具。