--- tags: DYKC, CLANG, C LANGUAGE --- # 「[你所不知道的 C 語言](https://hackmd.io/@sysprog/c-prog/)」系列講座 副標題: ==深度學習 C 語言== 回歸第一手資料,透過反思 C 語言程式設計的細節,重新學習電腦原理 -- [jserv](http://wiki.csie.ncku.edu.tw/User/jserv) :::warning :warning: 注意 - 本講座針對「已實際撰寫 C 程式」的人,若你無相關背景知識,請參見李根逸博士的 [C 語言入門](https://feis.studio/c) - 歡迎遞交想學習和探討的子項目,請 [編輯「許願池」頁面](https://hackmd.io/@sysprog/By9B9jZcm) ::: <img style="display:block; margin:auto;" src="https://i.imgur.com/hx96Iy3.png"></img> ## 講座說明 在大學教了幾年嵌入式系統課程後,我深深體會到這個事實:與其說學生對嵌入式系統掌握度不足,不如說為數眾多的人根本只是學了 C 程式語言的語法,而從未想過背後的原理、語言設計者的思維和理念,以及在真實環境中的關聯。 古希臘 Delphi 神殿前,有一則神諭寫道 "[Know Thyself](https://en.wikipedia.org/wiki/Know_thyself)",也就是「誠實面對自己」,我們程式設計師就該從技術、團隊合作、理性思考,以及培養堅忍不拔精神等方面, 找到自我,從而建立自信。 於是,從 2015 年秋季開始,我做了一系列的調整,重新探討 C 語言程式設計,安排了「你所不知道的 C 語言」系列講座,透過實體和線上直播課程,整理這二十年來程式設計經驗,帶著學員參考第一手的資料 (例如 [ISO/IEC 9899](http://www.open-std.org/jtc1/sc22/wg14/www/standards.html) C 語言規格),並善用系統開發工具 (如 GNU Debugger),屏棄過往臆測為主的學習方式,探究實際 C 程式的行為並反思箇中原理,讓更多人得以正視自己的盲點,從而打下穩固的基礎。 :::info C is not a legacy language. C is not an antique language. Get your marketecture right: C is an artisanal language for programmers obsessed with hand-crafting the smallest details of their programs. ::: > [source](https://twitter.com/raganwald/status/1072507817070878723) ## 你所不知道的 C 語言 * [為什麼要深入學習 C 語言?](https://hackmd.io/@sysprog/c-standards) (2017.05) * 與其瞎猜,不如從第一手材料研讀起 * 掌握 C 語言規格和演化 * 熟悉 GDB 在內的工具程式 * [指標篇](https://hackmd.io/@sysprog/c-pointer) (2015.11) (2016.09) (2018.02) * 解讀 C 語言規格書的 "object" * 重讀 "type" 的定義,並且理解 incomplete type 的意義 * 三位一體: Array, function, pointer types * 都稱為 _derived declarator types_ * `void *` 的設計考量 * C-style string * [函式呼叫篇](https://hackmd.io/@sysprog/c-function) (2015.12) (2016.02) (2017.10) (2022.01) * process memory layout * application binary interface (ABI) * stack pointer * 重新檢閱 Heap: malloc() / free() 的實作 * [遞迴呼叫篇](https://hackmd.io/@sysprog/c-recursion) (2016.11) (2018.07) * [記憶體管理、對齊及硬體特性](https://hackmd.io/@sysprog/c-memory) (2018.09) * 硬體的行為 * 消除對於 alignment, padding, memory allocator 的誤解 * 探討高效能 memory pool 的設計 * C11 標準的 aligned_alloc * [編譯器和最佳化原理篇](https://hackmd.io/@sysprog/c-compiler-optimization) (2016.01) (2017.10) * 以 GNU Toolchain 為探討對象,簡述[編譯器如何運作,以及如何實現最佳化](http://www.slideshare.net/jserv/how-a-compiler-works-gnu-toolchain) * C 語言程式如何轉換為機械碼,以及最佳化的空間和限制 * [C 編譯器原理和案例分析](https://hackmd.io/@sysprog/c-compiler-construction) (2018.08) * 從[一個簡易的 JIT compiler](http://www.slideshare.net/jserv/jit-compiler),回顧 code generator / JIT compiler * 用不到一千行 C 程式,實現小型 C 語言編譯器 * [物件導向程式設計篇](https://hackmd.io/@sysprog/c-oop) (2016.04) (2016.05) (2018.09) * Linux 核心、Apache HTTP 伺服器,以及 Gtk+ / GNOME 這些專案原始程式碼背後都應用大量物件導向設計方法 * 實踐物件導向,並強調帶來的效益 * 展示 GoF 的《Design Patterns》如何用 C 語言實作 * [前置處理器應用篇](https://hackmd.io/@sysprog/c-preprocessor) (2016.06) (2022.02) * 回顧 C99/C11 的 macro 特徵,探討 C11 新的關鍵字 `_Generic` * 探討 C 語言程式的物件導向程式設計、抽象資料型態 (ADT) / 泛型程式設計 (Generics)、程式碼產生器、模仿其他程式語言,以 preprocessor 搭配多種工具程式的技巧 * [動態連結器](https://hackmd.io/@sysprog/c-dynamic-linkage) (2016.08) (2018.10) * symbol 的奧義, dynamic linker 的行為, 用 GDB 追蹤 C 語言程式 * [連結器和執行檔資訊](https://hackmd.io/@sysprog/c-linker-loader) (2019.02) * [執行階段程式庫 (CRT)](https://hackmd.io/@sysprog/c-runtime) (2018.10) * [技巧篇](https://hackmd.io/@sysprog/c-trick) (2017.03) (2019.07) * 以矩陣運算的案例,實踐物件導向、指標操作、函式呼叫等觀念 * [數值系統篇](https://hackmd.io/@sysprog/c-numerics) (2017.04) (2019.08) * [浮點數運算](https://hackmd.io/@sysprog/c-floating-point) (2020.03) * [bitwise 操作](/@sysprog/c-bitwise) (2020.02) * [從打造類似 Facebook 網路服務探討整合開發](/s/B1s8hX1yg) (2017.04) * [goto 和流程控制](https://hackmd.io/@sysprog/c-control-flow) (2017.11) * [linked list 和非連續記憶體操作](https://hackmd.io/@sysprog/c-linked-list) (2018.01) (2022.01) * [Stream I/O, EOF 和例外處理](https://hackmd.io/@sysprog/c-stream-io) (2018.03) (2019.04) * [未定義行為篇](https://hackmd.io/@sysprog/c-undefined-behavior) (2018.07)