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

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

你所不知道的 C 語言
為什麼要深入學習 C 語言? (2017.05)
與其瞎猜,不如從第一手材料研讀起
掌握 C 語言規(guī)格和演化
熟悉 GDB 在內(nèi)的工具程式
指標篇 (2015.11) (2016.09) (2018.02)
都稱為 derived declarator types
解讀 C 語言規(guī)格書的 “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 為探討對象,簡述編譯器如何運作,以及如何實現(xiàn)最佳化
C 語言程式如何轉換為機械碼,以及最佳化的空間和限制
C 編譯器原理和案例分析 (2018.08)
從一個簡易的 JIT compiler,回顧 code generator / JIT compiler
用不到一千行 C 程式,實現(xiàn)小型 C 語言編譯器
物件導向程式設計篇 (2016.04) (2016.05) (2018.09)
Linux 核心、Apache HTTP 伺服器,以及 Gtk+ / GNOME 這些專案原始程式碼背後都應用大量物件導向設計方法
實踐物件導向,並強調帶來的效益
展示 GoF 的《Design Patterns》如何用 C 語言實做
前置處理器應用篇 (2016.06)
回顧 C99/C11 的 macro 特徵,探討 C11 新的關鍵字 _Generic
探討 C 語言程式的物件導向程式設計、抽象資料型態(tài) (ADT) / 泛型程式設計 (Generics)、程式碼產(chǎn)生器、模仿其他程式語言,以 preprocessor 搭配多種工具程式的技巧
動態(tài)連結器 (2016.08) (2018.10)
symbol 的奧義, dynamic linker 的行為, 用 GDB 追蹤 C 語言程式
連結器和執(zhí)行檔資訊 (2019.02)
執(zhí)行階段程式庫 (CRT) (2018.10)
技巧篇 (2017.03) (2019.07)
以矩陣運算的案例,實踐物件導向、指標操作、函式呼叫等觀念
數(shù)值系統(tǒng)篇 (2017.04) (2019.08)
浮點數(shù)運算 (2020.03)
bitwise 操作 (2020.02)
從打造類似 Facebook 網(wǎng)路服務探討整合開發(fā) (2017.04)
goto 和流程控制 (2017.11)
linked list 和非連續(xù)記憶體操作 (2018.01) (2022.01)
Stream I/O, EOF 和例外處理 (2018.03) (2019.04)
未定義行為篇 (2018.07)