如何以 C 語言撰寫泛型程式?

泛型 (Generics) 是一種無型別的程式,主要是用在靜態型別的語言上。撰寫泛型程式的好處是同一個演算法可以套件在不同型別上,減少重覆撰寫相同演算法但不同類別的程式碼。由於泛型的好處,很多資料結構和演算法的函式庫會用泛型程式來實作,一些實例像是 C++ 的 STL (Standard Template Library)、Java (或 C#) 的 Collections 等。 在 C11 以前的 C 不支援實質的泛型,所以在網路上宣稱的 C 泛型程式並不是真的泛型程式,而是用其他語法特性模擬出來的;所以在學習這些「泛型」程式時要注意其手法和限制。一般來說,C 的擬泛型程式有以下三種實作方式: 指向 void 的指標 (pointer to void) 巨集 (macr...
「點我閱讀更多」

為什麼要用 C 語言寫物件導向程式?

雖然 C 語言沒有直接支援物件導向程式的語法,但我們可以在一些真實世界的專案看到具有物件導向思維的 C 程式碼,一些知名的例子像是 Linux 核心和 GTK+ 等。然而,我們在 C 語言的教材很少直接探討這個議題,大部分教材的態度是在教完 C 語法後就轉往 C++,像是 C 程式設計藝術 (全華圖書) 的前半部是 C 語言,後面就塞入 C++ 來增加版面。那麼,我們為什麼要用 C 語言寫物件導向程式呢? 物件導向是一種程式設計的範式 (paradigm),理論上是抽象的程式設計思維,但卻會受到程式語言特性的影響,從每個程式語言的語法就可以看到不同程度的物件特性。對物件導向來說,最基本的是資料 (data) 和行為 (behavior) 連動所帶來的狀態 (state) 改變;再進一...
「點我閱讀更多」

如何撰寫虛擬碼 (Pseudocode)

直接使用程式碼來呈現 (資料結構和) 演算法,往往需注意過多細節,像是型別、陣列長度、存取權限、記憶體管理等,而且程式語言很多,單一語言能滿足的客群相對小。有許多演算法的書籍會轉而使用虛擬碼 (pseudocode) 來表示,由讀者自行將其轉為可用的程式碼。虛擬碼不需在意程式語言的細節,敘述上比較簡潔。 在虛擬碼和程式碼之間的轉換,需要一段時間的學習才能上手。但學過一段時間的程式設計後,反而會覺得程式碼比虛擬碼簡單,因為編譯器或直譯器會協助我們找出程式碼中的錯誤,而虛擬碼沒有固定的格式,只能由人工閱讀來確認是否正確。有時候我們需要撰寫虛擬碼而非程式碼,像是學校考試、學術報告、技術文件等;因此,除了能讀懂別人寫的虛擬碼,最好還是要能自己寫虛擬碼。 虛擬碼的風格差異很大,有些會用數學表...
「點我閱讀更多」

JavaScript 轉譯器百百種,孰優孰劣?

程式設計者對 JavaScript 的態度是毀譽參半,喜歡 JavaScript 的開發者會說 JavaScript 跨越網頁前後端、桌面端、行動端、物聯網,儼然是大一統的程式語言,討厭 JavaScript 的開發者會說 JavaScript 坑坑洞洞超多,為了相容性,舊洞不修又再加新特性,根本就疊床架屋。開發者對 JavaScript 強烈的情感一部分是來自於 JavaScript 目前是網頁前端實質的 (de facto) 標準,是寫網頁程式的必然之惡。 為了能在保持相容性的前提下改善 JavaScript 先天不良的體質,使用 JavaScript 轉譯器 (JavaScript Trans-compiler) 就成了一個可行的方向。這類工具的思維在於減少手動撰寫樣板程式碼的...
「點我閱讀更多」

[投票] 入門級網頁教學所用的輕量級框架

我們初學程式設計時,通常會先從最簡短的程式碼開始,隨著學習過程,慢慢地寫出更長的程式。但是,我們在學習網頁程式時,為了實務面的需求,反而會優先使用一些大而全的網頁框架。不過,也有一些輕量級的框架 (即微框架 microframework),沒有複雜的專案架構和設定檔,可以用單一的命令稿來撰寫網頁程式,這類輕量級框架,相當適合用來入門網頁程式。筆者最近即將著手撰寫一些入門級的網頁教學,而各位讀者可以決定這系列文章所用的教學工具。 由於網頁本身是語言中立的技術,根據不同目的會選用不同的網頁技術。而我們這一系列網頁教學的目的是用相短簡短的程式碼來學習網頁程式,減輕學習者的負擔,網站效能倒不是我們的第一考量。筆者考量易用性、流行度、資料豐富度等項度,初步選出以下四個框架: Flask...
「點我閱讀更多」