返回筆記列表

2026/05/11

程式設計基礎概念與運作原理

本文介紹程式設計的核心觀念,包含程式如何被執行、常見語法、基本資料結構,以及常見的程式設計範式。範例主要使用 C#,但這些觀念也適用於常見程式語言。

ProgrammingBasics

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 不是動態型別,型別仍然會在編譯期決定。

常見資料型別

型別說明範例
int32-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. 實務學習建議

如果剛開始學程式,可以依照以下順序建立基礎:

  1. 先熟悉變數、型別、運算子。
  2. 學會條件分支與迴圈。
  3. 練習把重複邏輯整理成函式。
  4. 熟悉陣列、List、Dictionary。
  5. 再進一步學習物件導向與專案架構。
  6. 最後再深入非同步、例外處理、測試、設計模式等進階主題。