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

你有沒有想過,為什麼世界上會有這麼多種程式語言?為什麼我們不能只用一種語言來解決所有問題呢?在本指南中,我們將探討不同的程式設計範式(Paradigms,即風格),以及電腦究竟是如何理解我們編寫的指令。別擔心,如果有些術語聽起來很「高深」,我們將會用簡單的類比把它們拆解開來!

1. 程式設計範式

範式簡而言之就是一種「思維方式」或程式設計風格。不同的問題需要不同的工具。舉例來說,你不會拿螺絲起子來敲釘子,對吧?

為什麼我們需要不同的範式?
有些語言被設計為追求極致速度,有些則設計為易於人類閱讀,還有一些是專門為了處理海量數據而構建的。

程序式程式設計 (Procedural Programming)

這是最常見的範式之一。它將程式視為一系列循序漸進的指令。你需要明確地告訴電腦如何完成一項任務。

關鍵特性:
• 使用序列 (Sequences)選擇 (Selection)(如 if 語句)和迭代 (Iteration)(如迴圈)。
• 將大型任務拆解為較小、易於管理的區塊,稱為程序 (Procedures)函式 (Functions)
• 數據與處理該數據的程式碼通常是分開存放的。

類比:想像一張烤蛋糕的食譜。你必須按照順序執行步驟:(1) 打雞蛋,(2) 攪拌麵粉,(3) 烘烤。這正是程序式程式碼的運作方式!

快速複習:程序式重點

程序式程式設計的核心在於邏輯和指令的順序。這就像是編碼界的「待辦事項清單」。

2. 組合語言與小人電腦 (LMC)

電腦真正能理解的只有機器碼(0 與 1)。然而,對於人類來說,編寫二進位碼簡直是天方夜譚!組合語言 (Assembly Language) 是一種「低階」語言,它就像是一座橋樑,使用稱為助記符 (Mnemonics) 的簡短文字代碼來代表機器指令。

小人電腦 (Little Man Computer, LMC)

為了幫助你理解組合語言的工作原理,OCR 使用了一個名為小人電腦 (LMC) 的模型。想像一個小人在郵件室(即 CPU)裡工作,他在郵箱(即 RAM)和計算機(即累加器 Accumulator)之間搬運寫著數字的紙條。

需要記住的常見 LMC 助記符:
ADD:將值加到累加器中。
SUB:從累加器中減去一個值。
STA:將累加器中的值儲存到指定的記憶體位址。
LDA:從記憶體位址載入一個值到累加器。
INP:獲取用戶的輸入。
OUT:輸出累加器中當前的值。
HLT:停止程式。

你知道嗎?
組合語言至今仍被廣泛用於智慧手錶或汽車引擎等領域,因為它允許程式設計師直接控制硬體,並使程式碼運行得極其迅速!

3. 記憶體定址模式 (Modes of Addressing Memory)

在組合語言中,當我們要從記憶體獲取數據時,有不同的方式來「定址」或尋找該數據。這可能會有點複雜,讓我們用郵政信箱來做類比。

1. 立即定址 (Immediate Addressing):
指令本身就包含了你要使用的實際數值,無需去別的地方尋找!
例子:「加 5」。你直接加上 5 就可以了。

2. 直接定址 (Direct Addressing):
指令提供了一個記憶體位址。你直接前往該位址並使用裡面找到的數值。
例子:「前往 10 號郵箱,使用裡面的數字。」

3. 間接定址 (Indirect Addressing):
指令提供了一個位址,但該位址裡面存放的是另一個位址!你必須先前往第一個位址,才能找到「真正」的數據儲存在哪裡。
例子:你打開 10 號郵箱,裡面寫著一張紙條:「真正的數據在 50 號郵箱裡。」

4. 索引定址 (Indexed Addressing):
你取一個「基底」位址,並加上一個「偏移量」(儲存在索引暫存器 Index Register 中的數字)來找到最終位置。這對於遍歷列表或陣列非常有用。
公式:\(最終位址 = 基底位址 + 索引暫存器\)。

記憶小撇步:「I-D-I-I」技巧

Immediate (立即):It's right here (就在這兒)。
Direct (直接):Drive to the address (開車前往該位址)。
Indirect (間接):Inside is another address (裡面是另一個位址)。
Indexed (索引):Increment the base address (遞增基底位址)。

4. 物件導向程式設計 (OOP)

OOP 是一種現代範式,它專注於物件 (Objects) 而非單純的動作。我們不再編寫一長串的指令清單,而是建立代表現實世界事物的「物件」。

OOP 關鍵概念:

類別 (Classes) 與物件 (Objects):
類別 (Class) 是一個藍圖(例如:一張通用汽車的設計圖)。物件 (Object) 是根據該藍圖製造出來的實體(例如:你鄰居那輛紅色的豐田汽車)。
屬性 (Attributes):物件擁有的數據(例如:顏色、最高時速)。
方法 (Methods):物件可以做的事情(例如:駕駛 drive()、鳴喇叭 honk())。

封裝 (Encapsulation):
這意味著「隱藏」物件內部的數據。你只能透過特定的方法來修改屬性。這能保護數據,避免程式中其他部分不小心更動到它們。

繼承 (Inheritance):
「子類別」可以獲取「父類別」的所有屬性和方法。例如,「卡車」類別可以繼承自「車輛」類別,並增加自己特有的功能,例如「拖曳能力 (TowingCapacity)」。

多型 (Polymorphism):
字面意思是「多種形式」。它允許同一個方法根據物件的不同而表現出不同的行為。
例子:「makeSound()」方法會讓「狗」物件發出「汪汪」,但會讓「貓」物件發出「喵喵」。

常見錯誤,記得避開!

學生經常混淆類別物件。記住:你無法駕駛一張汽車「藍圖」,你只能駕駛「實體車」。類別是計畫,物件是結果。

總結清單

在繼續學習之前,確保你能回答以下問題:
• 你能解釋程序式物件導向方法的區別嗎?
• 你知道 4 種定址模式及其不同之處嗎?
• 你能編寫一個簡單的 3 行 LMC 程式來相加兩個數字嗎?
• 你理解繼承如何透過重用程式碼來幫助程式設計師節省時間嗎?

繼續加油!你做得很好。程式設計範式是你所有喜愛軟體運作的基石!