「你所不知道的 C 語言」系列講座
副標題:深度學習 C 語言
回歸第一手資料,透過反思 C 語言程式設計的細節,重新學習電腦原理 – jserv

講座說明
在大學教了幾年嵌入式系統課程後,我深深體會到這個事實:與其說學生對嵌入式系統掌握度不足,不如說為數眾多的人根本只是學了 C 程式語言的語法,而從未想過背後的原理、語言設計者的思維和理念,以及在真實環境中的關聯。
古希臘 Delphi 神殿前,有一則神諭寫道 “Know Thyself”,也就是「誠實面對自己」,我們程式設計師就該從技術、團隊合作、理性思考,以及培養堅忍不拔精神等方面, 找到自我,從而建立自信。
於是,從 2015 年秋季開始,我做了一系列的調整,重新探討 C 語言程式設計,安排了「你所不知道的 C 語言」系列講座,透過實體和線上直播課程,整理這二十年來程式設計經驗,帶著學員參考第一手的資料 (例如 ISO/IEC 9899 C 語言規格),並善用系統開發工具 (如 GNU Debugger),屏棄過往臆測為主的學習方式,探究實際 C 程式的行為並反思箇中原理,讓更多人得以正視自己的盲點,從而打下穩固的基礎。

你所不知道的 C 語言
為什麼要深入學習 C 語言? (2017.05)
與其瞎猜,不如從第一手材料研讀起
掌握 C 語言規格和演化
熟悉 GDB 在內的工具程式
指標篇 (2015.11) (2016.09) (2018.02)
都稱為 derived declarator types
解讀 C 語言規格書的 “object”
重讀 “type” 的定義,並且理解 incomplete type 的意義
三位一體: Array, function, pointer types
void *
的設計考量C-style string
函式呼叫篇 (2015.12) (2016.02) (2017.10) (2022.01)
process memory layout
application binary interface (ABI)
stack pointer
重新檢閱 Heap: malloc() / free() 的實做
遞迴呼叫篇 (2016.11) (2018.07)
記憶體管理、對齊及硬體特性 (2018.09)
硬體的行為
消除對於 alignment, padding, memory allocator 的誤解
探討高效能 memory pool 的設計
C11 標準的 aligned_alloc
編譯器和最佳化原理篇 (2016.01) (2017.10)
以 GNU Toolchain 為探討對象,簡述編譯器如何運作,以及如何實現最佳化
C 語言程式如何轉換為機械碼,以及最佳化的空間和限制
C 編譯器原理和案例分析 (2018.08)
從一個簡易的 JIT compiler,回顧 code generator / JIT compiler
用不到一千行 C 程式,實現小型 C 語言編譯器
物件導向程式設計篇 (2016.04) (2016.05) (2018.09)
Linux 核心、Apache HTTP 伺服器,以及 Gtk+ / GNOME 這些專案原始程式碼背後都應用大量物件導向設計方法
實踐物件導向,並強調帶來的效益
展示 GoF 的《Design Patterns》如何用 C 語言實做
前置處理器應用篇 (2016.06)
回顧 C99/C11 的 macro 特徵,探討 C11 新的關鍵字 _Generic
探討 C 語言程式的物件導向程式設計、抽象資料型態 (ADT) / 泛型程式設計 (Generics)、程式碼產生器、模仿其他程式語言,以 preprocessor 搭配多種工具程式的技巧
動態連結器 (2016.08) (2018.10)
symbol 的奧義, dynamic linker 的行為, 用 GDB 追蹤 C 語言程式
連結器和執行檔資訊 (2019.02)
執行階段程式庫 (CRT) (2018.10)
技巧篇 (2017.03) (2019.07)
以矩陣運算的案例,實踐物件導向、指標操作、函式呼叫等觀念
數值系統篇 (2017.04) (2019.08)
浮點數運算 (2020.03)
bitwise 操作 (2020.02)
從打造類似 Facebook 網路服務探討整合開發 (2017.04)
goto 和流程控制 (2017.11)
linked list 和非連續記憶體操作 (2018.01) (2022.01)
Stream I/O, EOF 和例外處理 (2018.03) (2019.04)
未定義行為篇 (2018.07)