owned this note
Sign in
--- 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: 注意 - 請透過 gitter (線上對話服務,可透過 GitHub 或 Twitter 帳號登入) 提交疑問和建議事項: ==[guts-general](https://gitter.im/embedded2015/guts-general)== - 歡迎遞交想學習和探討的子項目,請 [編輯「許願池」頁面](https://hackmd.io/Q8J3NEcUSKiQ8XAbO-IoZQ#) ::: <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 語言?](/s/HJFyt37Mx) (2017.05) * 與其瞎猜,不如從第一手材料研讀起 * 掌握 C 語言規格和演化 * 熟悉 GDB 在內的工具程式 * [指標篇](/s/HyBPr9WGl) (2015.11) (2016.09) (2018.02) * 解讀 C 語言規格書的 "object" * 重讀 "type" 的定義,並且理解 incomplete type 的意義 * 三位一體: Array, function, pointer types * 都稱為 _derived declarator types_ * `void *` 的設計考量 * C-style string * [函式呼叫篇](/s/SJ6hRj-zg) (2015.12) (2016.02) (2017.10) * process memory layout * application binary interface (ABI) * stack pointer * 重新檢閱 Heap: malloc() / free() 的實做 * [遞迴呼叫篇](/s/rJ8BOjGGl) (2016.11) (2018.07) * [記憶體管理、對齊及硬體特性](/s/BkuMDQ9K7) (2018.09) * 硬體的行為 * 消除對於 alignment, padding, memory allocator 的誤解 * 探討高效能 memory pool 的設計 * C11 標準的 aligned_alloc * [編譯器和最佳化原理篇](/s/Hy72937Me) (2016.01) (2017.10) * 以 GNU Toolchain 為探討對象,簡述[編譯器如何運作,以及如何實現最佳化](http://www.slideshare.net/jserv/how-a-compiler-works-gnu-toolchain) * C 語言程式如何轉換為機械碼,以及最佳化的空間和限制 * [C 編譯器原理和案例分析](/s/H1ZzeiCIQ) (2018.08) * 從[一個簡易的 JIT compiler](http://www.slideshare.net/jserv/jit-compiler),回顧 code generator / JIT compiler * 用不到一千行 C 程式,實現小型 C 語言編譯器 * [物件導向程式設計篇](/s/HJLyQaQMl) (2016.04) (2016.05) (2018.09) * Linux 核心、Apache HTTP 伺服器,以及 Gtk+ / GNOME 這些專案原始程式碼背後都應用大量物件導向設計方法 * 實踐物件導向,並強調帶來的效益 * 展示 GoF 的《Design Patterns》如何用 C 語言實做 * [前置處理器應用篇](/s/S1maxCXMl) (2016.06) * 回顧 C99/C11 的 macro 特徵,探討 C11 新的關鍵字 _Generic * 探討 C 語言程式的物件導向程式設計、抽象資料型態 (ADT) / 泛型程式設計 (Generics)、程式碼產生器、模仿其他程式語言,以 preprocessor 搭配多種工具程式的技巧 * [動態連結器](/s/HkK7Uf4Ml) (2016.08) (2018.10) * symbol 的奧義, dynamic linker 的行為, 用 GDB 追蹤 C 語言程式 * [連結器和執行檔資訊](https://hackmd.io/s/SysiUkgUV) (2019.02) * [執行階段程式庫 (CRT)](/s/Hkcr5cn97) (2018.10) * [技巧篇](/s/HyIdoLnjl) (2017.03) (2019.07) * 以矩陣運算的案例,實踐物件導向、指標操作、函式呼叫等觀念 * [數值系統篇](/s/BkRKhQGae) (2017.04) (2019.08) * [從打造類似 Facebook 網路服務探討整合開發](/s/B1s8hX1yg) (2017.04) * [goto 和流程控制](/s/B1e2AUZeM) (2017.11) * [linked list 和非連續記憶體操作](/s/SkE33UTHf) (2018.01) * [Stream I/O, EOF 和例外處理](/s/Sy8pJ0x9G) (2018.03) (2019.04) * [未定義行為篇](/s/Skr9vGiQm) (2018.07)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in via Google
New to HackMD?
Sign up