Back
Clang & Wasm 教學

C 語言 vs. Python

比較 C 語言與 Python 的核心差異,理解記憶體管理、型別系統與效能特性,探索兩者的應用場景與優勢。


目標

  • 幫助 已學過 Python 的學生 快速理解 C 語言的不同之處。
  • 讓學生掌握 C 的基本語法,為後續學習 C + WASM 做準備。
  • 說明 為何選擇 C + WASM 來學習系統級開發

1. C vs. Python 基本比較

語言類型

語言 類型 主要特點
Python 直譯式 (Interpreted) 由直譯器逐行執行,開發快速,適合腳本與資料處理。
C 編譯式 (Compiled) 需經過編譯後執行,運行速度快,適合系統級開發。

高階語言 VS 低階語言

  • Python 屬於 高階語言,更接近人類語言,開發容易但較慢。
  • C 屬於 低階語言,更貼近硬體,開發較難但執行效能高。

記憶體管理

語言 方式 特色
Python 自動管理 內建 垃圾回收 (GC),自動釋放不再使用的記憶體。
C 手動管理 使用 malloc() 配置記憶體,free() 釋放,需小心管理避免記憶體洩漏。

變數與型別

語言 型別系統 宣告方式
Python 動態型別 (Dynamically Typed) x = 10,可隨時改變型別。
C 靜態型別 (Statically Typed) int x = 10;,型別在宣告時確定,不能更改。

字串處理

語言 處理方式
Python 內建 str 型別,支援 .upper().replace() 等操作。
C 使用 char 陣列 (char str[] = "Hello";),需用 string.h 提供的函式操作。

函式定義

語言 定義方式
Python def add(a, b): return a + b
C int add(int a, int b) { return a + b; }

差異:

  • C 需要 明確定義型別 (int a, int b)
  • Python 無需指定型別

2. 範例程式比較

(1) Hello, World!

Python

print("Hello, World!")

C

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

差異點:

  • C 需要 #include <stdio.h> 標頭檔
  • C 需要 main() 函式作為程式入口
  • Python 使用 print(),C 則使用 printf()
  • C 需要 return 0; 來表示程式成功執行

(2) 變數與型別

Python

x = 10
y = 3.14
z = "Hello"

C

int x = 10;
float y = 3.14;
char z[] = "Hello";

差異點:

  • C 變數必須明確指定型別
  • C 沒有內建字串型別,需要 char[]

(3) 迴圈

Python

for i in range(5):
    print(i)

C

#include <stdio.h>

int main() {
    for (int i = 0; i < 5; i++) {
        printf("%d\n", i);
    }
    return 0;
}

差異點:

  • C 需要明確定義 int i
  • C 需要 printf("%d\n", i); 來格式化輸出
  • Python 有 range(),C 需要手動控制條件

(4) 函式

Python

def add(a, b):
    return a + b

print(add(3, 5))

C

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int main() {
    printf("%d\n", add(3, 5));
    return 0;
}

差異點:

  • C 函式需要定義回傳型別 (int add(int a, int b))
  • C 需要 main() 作為程式入口

3. C 語言的關鍵特性

  • 指標 (Pointers):C 提供指標 (int *ptr),可直接操作記憶體。
  • 手動記憶體管理:C 需要手動使用 malloc()free() 來配置與釋放記憶體。
  • 編譯 vs. 直譯
    • Python 直接執行 (python script.py)
    • C 需要先編譯 (clang -o hello.exe hello.c) 後執行 f(hello.exe)

範例:hello.c

#include <stdio.h>

int main(void) {
    printf("hello clang!\n");
    return 0;
}

用 clang 編譯成 EXE (成功後會再資料夾多一個 hello.exe 檔案)

clang -o hello.exe hello.c

執行 EXE

./hello.exe

4. C + WASM:為何選擇這條路?

  • C 是系統級語言,適用於 嵌入式、作業系統、效能要求高的應用
  • WebAssembly (WASM)
    • 可讓 C 直接 運作於在瀏覽器內,效能超越 JavaScript!
    • 可在類似於 wasmer 容器中執行。
    • 提供接近 原生效能,且能跨平台執行。

範例:用 wasm32-wasi-clang 編譯成 WASM

wasm32-wasi-clang --sysroot=$env:WASI_SYSROOT_PATH -o hello.wasm hello.c

這讓 C 程式能在 瀏覽器或 WASI 環境 執行!

範例:用 wasmer 執行 hello.wasm

wasmer run ./hello.wasm

結論

  • C 與 Python 各有優勢,C 更接近系統,適合高效能應用。
  • C + WASM 提供強大組合,讓 C 可在 瀏覽器與系統 皆能運行!
  • 本課程將會進一步深入 C 語言與 WebAssembly 🚀
SNPQ © 2025