透早睇了一頃《哥倫比亞的倒影》,內底是呾木心先生著紐約哥倫比亞大學行走時亓所見所想。印象深刻亓是伊當睇著思想者大衛亓銅像,摸著大衛緊張且燒燒亓肌肉時,想到王爾德亓一句話:思想產生在陰影裡,太陽是嫉妒思想的。
Concurrency in Go
Concurrency in Go is an excellent book written by Katherine Cox-Buday. And It is impressive and drive me to learn deeply about Go.
《Go並發編程》是凱瑟琳·考克斯布迪執筆的一本絕好的書籍。此書令我印象深刻,並驅使我深入學習Go。
《Go 設計與實現》筆記之第二章 編譯原理
編譯原理這一章講 Go 的源代碼是如何變成二進制碼的,可分爲四個過程:
- 詞法和語法分析 lexical and grammar analysis
- 類型檢查 type check
- 中間代碼生成 IR(intermediate representation) generation
- 機器碼生成 machine code generation
詞法分析是將源代碼視爲字符串序列,對各個字符串進行標記,生成 Token 序列。
語法分析是將 Token 序列按照 LALR(1)(向前查看和自底向上解析)的解析文法進行解析,生成一棵AST (抽象語法樹 )。
類型檢查分靜態類型檢查和動態類型檢查,靜態類型檢查會在編譯期對變量賦值、返回值和函數參數進行類型檢查;動態類型檢查在代碼運行時進行,可以實現向下類型轉換、延遲綁定和反射等功能。
中間代碼生成階段首先會進行 ssaconfig 的初始化,緩存可能需要用到的類型和指針;然後進行遍歷和替換,將內建函數 make、map、channel、new、select、panic、recover 等等替換成 runtime 包的函數。最後不斷地進行中間代碼生成,優化代碼,生成類似彙編代碼的代碼。
機器碼生成階段分兩個部分:一是 SSA 中間代碼降級、針對特定CPU架構的中間代碼優化和重寫,最後生成相當接近特定架構彙編代碼的指令;二是將特定架構的指令轉成二進制代碼。