程式設計基礎概念與運作原理
本文介紹程式設計的核心觀念,包含程式如何被執行、常見語法、基本資料結構,以及常見的程式設計範式。範例主要使用 C#,但這些觀念也適用於常見程式語言。
1. 什麼是程式與程式設計?
程式 (Program) 是一組指示電腦執行特定任務的指令集合。
程式設計 (Programming) 則是把問題拆解成邏輯步驟,並用程式語言描述這些步驟,讓電腦可以依照指令執行。
程式設計常見工作包含:
- 分析問題
- 設計流程
- 撰寫程式碼
- 測試與除錯
- 維護與重構
2. 程式如何被執行?
電腦 CPU 最終能直接執行的是 機器碼 (Machine Code),也就是由 0 與 1 組成的低階指令。
人類通常使用 C、C#、Python、JavaScript 等高階語言撰寫程式,因此程式在執行前或執行中,需要經過某種形式的翻譯。
2.1 編譯型語言
編譯型語言通常會在程式執行前,透過 編譯器 (Compiler) 將原始碼轉換成可執行的機器碼或目標平台格式。
常見例子:
- C
- C++
- Rust
- Go
特點
- 執行效能通常較好。
- 可在編譯階段發現許多錯誤。
- 產出的執行檔通常與目標平台有關。
- 常用於作業系統、嵌入式系統、驅動程式、高效能服務等場景。
2.2 直譯型語言
直譯型語言傳統上是指程式執行時,由 直譯器 (Interpreter) 讀取程式碼並執行。
常見例子:
- Python
- JavaScript
- Ruby
不過現代語言實作通常比「逐行直譯」更複雜。例如:
- Python 常會先編譯成 bytecode,再由 Python VM 執行。
- JavaScript 引擎通常會使用 JIT 編譯器優化熱點程式碼。
- Ruby、PHP 等語言也有各自的 VM 或最佳化機制。
因此,「編譯型」與「直譯型」比較像是教學上的分類,實務上很多語言都採用混合模型。
2.3 混合型 / 中間碼語言
有些語言會先編譯成中間碼,再由執行環境轉成機器碼或直接執行。
常見例子:
- Java:原始碼編譯成 bytecode,由 JVM 執行,並可透過 JIT 最佳化。
- C#:原始碼編譯成 IL,由 .NET CLR 執行,並可透過 JIT 或 AOT 轉成原生碼。
Java 至今仍廣泛應用於企業後端與 Android 生態;現代 Android 開發也大量採用 Kotlin。
2.4 簡化執行流程圖
不同語言與執行環境細節不同,但可用下圖理解大致流程:
flowchart TD
Source["原始碼 Source Code"] --> Translate["編譯器 / 直譯器 / 執行環境"]
Translate --> Bytecode["中間碼 / Bytecode / IL"]
Translate --> Native["原生機器碼"]
Bytecode --> VM["VM / JIT / AOT"]
VM --> Native
Native --> CPU["CPU 執行"]
CPU --> Output["輸出結果或系統狀態改變"]
3. 程式設計的核心元素
不同程式語言語法不同,但多數語言都會包含以下核心元素:
- 變數與資料型別
- 運算子
- 流程控制
- 函式
- 資料結構
以下以 C# 為例。
3.1 變數與資料型別
變數 (Variable) 是程式用來儲存資料的命名空間。程式可以透過變數名稱讀取或修改資料。
C# 是 靜態型別 (Static Typing) 與 強型別 (Strong Typing) 語言。變數在編譯期會有明確型別。
宣告變數時,可以直接寫出型別,也可以使用 var 讓編譯器根據右側初始值推論型別。var 不是動態型別,型別仍然會在編譯期決定。
常見資料型別
| 型別 | 說明 | 範例 |
|---|---|---|
int | 32-bit 整數 | 42, -7 |
double | 雙精度浮點數 | 3.14, -0.005 |
string | 字串 | "Hello" |
bool | 布林值 | true, false |
// 明確指定型別
int score = 95;
double pi = 3.14159;
string username = "Alice";
bool isPassed = true;
// 使用 var 進行型別推論
var autoScore = 95; // int
var autoPi = 3.14159; // double
var autoName = "Bob"; // string
var autoPassed = true; // bool
3.2 運算子
運算子 (Operator) 是用來對資料進行計算、比較或邏輯判斷的符號。
常見運算子
| 類型 | 運算子 | 說明 |
|---|---|---|
| 算術運算子 | + - * / % | 加、減、乘、除、取餘數 |
| 比較運算子 | > < >= <= == != | 比較兩個值,結果為 bool |
| 邏輯運算子 | && || ! | 且、或、非 |
| 指派運算子 | = += -= *= /= | 指派或累加運算 |
int price = 100;
double discount = 0.8;
double finalPrice = price * discount; // 80.0
bool isAffordable = finalPrice < 150; // true
bool shouldBuy = isAffordable && discount < 1.0;
3.3 流程控制
程式預設會由上到下執行。流程控制 (Control Flow) 可以改變程式執行路徑。
3.3.1 條件分支
條件分支會根據條件是否成立,決定執行哪一段程式碼。
flowchart TD
Start["開始判斷"] --> Condition{"條件是否成立?"}
Condition -->|是| TrueBlock["執行 if 區塊"]
Condition -->|否| FalseBlock["執行 else 區塊"]
TrueBlock --> End["結束"]
FalseBlock --> End
int age = 18;
if (age >= 18)
{
Console.WriteLine("已達法定年齡");
}
else
{
Console.WriteLine("未達法定年齡");
}
3.3.2 迴圈
迴圈用來重複執行一段程式碼。
常見迴圈:
for:通常用於已知重複次數。while:通常用於重複次數不固定,但有明確條件。foreach:常用於走訪集合中的每個元素。
flowchart TD
Start["進入迴圈"] --> Check{"條件是否成立?"}
Check -->|是| Body["執行迴圈內容"]
Body --> Update["更新狀態"]
Update --> Check
Check -->|否| End["離開迴圈"]
// 輸出 0、1、2
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i);
}
string[] fruits = { "apple", "banana", "orange" };
foreach (var fruit in fruits)
{
Console.WriteLine(fruit);
}
3.4 函式 / 方法
函式 (Function) 或 方法 (Method) 是把一段具備特定功能的程式碼封裝起來,方便重複使用與維護。
在 C# 中,函式通常會宣告:
- 回傳型別
- 函式名稱
- 參數
- 函式內容
int CalculateArea(int width, int height)
{
return width * height;
}
int area = CalculateArea(5, 10); // 50
使用函式的好處
- 降低重複程式碼。
- 提升可讀性。
- 方便測試與維護。
- 讓問題可以被拆成較小的邏輯單元。
3.5 資料結構
資料結構 (Data Structure) 是組織與儲存資料的方式,目的是讓程式能有效率地存取、搜尋、修改資料。
常見基礎資料結構
| 資料結構 | 說明 |
|---|---|
| 陣列 (Array) | 固定長度、有順序,透過索引存取 |
| List | 動態長度、有順序 |
| Dictionary | 鍵值對,透過 key 查找 value |
| Stack | 後進先出 (LIFO) |
| Queue | 先進先出 (FIFO) |
using System;
using System.Collections.Generic;
// 陣列
string[] fruits = { "apple", "banana", "orange" };
Console.WriteLine(fruits[1]); // banana
// List
List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");
// Dictionary
Dictionary<string, string> userProfile = new Dictionary<string, string>
{
{ "name", "Bob" },
{ "role", "Developer" }
};
Console.WriteLine(userProfile["role"]); // Developer
4. 常見的程式設計範式
程式設計範式 (Programming Paradigm) 是撰寫程式時採用的思考方式與架構風格。
4.1 程序式程式設計
程序式程式設計會把問題拆成一連串步驟與程序。
代表語言:
- C
- Fortran
- Pascal
適合描述清楚的操作流程,例如底層系統、嵌入式控制、簡單工具程式。
4.2 物件導向程式設計
物件導向程式設計 (OOP) 將資料與操作資料的方法包裝成物件,並透過類別建立物件結構。
核心概念包含:
- 封裝 (Encapsulation)
- 繼承 (Inheritance)
- 多型 (Polymorphism)
- 抽象 (Abstraction)
代表語言:
- C#
- Java
- C++
- Python
4.3 函數式程式設計
函數式程式設計 (FP) 將運算視為函式的組合,強調不可變資料與降低副作用。
代表語言或常見支援:
- Haskell
- Lisp
- F#
- C# 的 LINQ
- JavaScript 的陣列函式,例如
map,filter,reduce
5. 實務學習建議
如果剛開始學程式,可以依照以下順序建立基礎:
- 先熟悉變數、型別、運算子。
- 學會條件分支與迴圈。
- 練習把重複邏輯整理成函式。
- 熟悉陣列、List、Dictionary。
- 再進一步學習物件導向與專案架構。
- 最後再深入非同步、例外處理、測試、設計模式等進階主題。