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。
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 的源代碼是如何變成二進制碼的,可分爲四個過程:
詞法分析是將源代碼視爲字符串序列,對各個字符串進行標記,生成 Token 序列。
語法分析是將 Token 序列按照 LALR(1)(向前查看和自底向上解析)的解析文法進行解析,生成一棵AST (抽象語法樹 )。
類型檢查分靜態類型檢查和動態類型檢查,靜態類型檢查會在編譯期對變量賦值、返回值和函數參數進行類型檢查;動態類型檢查在代碼運行時進行,可以實現向下類型轉換、延遲綁定和反射等功能。
中間代碼生成階段首先會進行 ssaconfig 的初始化,緩存可能需要用到的類型和指針;然後進行遍歷和替換,將內建函數 make、map、channel、new、select、panic、recover 等等替換成 runtime 包的函數。最後不斷地進行中間代碼生成,優化代碼,生成類似彙編代碼的代碼。
機器碼生成階段分兩個部分:一是 SSA 中間代碼降級、針對特定CPU架構的中間代碼優化和重寫,最後生成相當接近特定架構彙編代碼的指令;二是將特定架構的指令轉成二進制代碼。
深入學習 Go 語言的設計與實現之前要準備以下工作:
彙編者,二進制代碼的文本形式也,其最大的特點就是不可移植。Plan 9 彙編是貝爾實驗室的九號計劃的產物,目前被用於 Go 程序編譯的中間代碼,因爲 Go 的作者 Rob Pike,同時也是 Plan 9 彙編的作者。
Plan 9 彙編指令與 Intel 等彙編等的不同在於:
一般情況下,命令的源操作數在先,目的操作數在後。 如同樣是將十六進制的 10 傳送到 AX寄存器,在 Plan 9 中是 MOVQ $0x10, AX ,而在 Intel 彙編中是 mov rax, 0x10 。
棧的調整通過硬件 SP 寄存器進行加減運算實現。而 Intel 彙編中通過 push 和 pop 命令實現。
操作的數據長度取決於命令的後綴。而 Intel 彙編取決於寄存器。
// plan 9 彙編 |
通過分析 Plan 9 彙編代碼我們可以繪製出如下的棧結構:

如無特殊說明,本文標音採用甲子話拼音方案。甲子話系陸豐市甲子鎮通行的語言,屬閩南語潮汕話三甲片。
十二生肖本地讀音爲:
「干」是天干,有 10:
「支」是地支,有 12:
天干從甲開始,地支從子開始,天干地支相配形成 60 種組合,用來紀年。從甲子出發,60 年後又回到甲子,因此稱 60 年爲「一甲子」。
十二地支與十二生肖相對應,因此也用生肖紀年。如甲子年,地支爲「子」,對應生肖「鼠」,因此甲子年也稱之為「鼠年」。
問題1:已知 2020 年是鼠年,請問 2021 年是什麼年?
排在鼠之後的生肖是牛,因此 2021 年是牛年。
問題2:已知 2020 年是庚子年 /gên¹ zu² ni⁵/,請問 2021 年是什麼年?
庚之後爲辛,子之後爲丑,因此 2021 年是辛丑年 /sing¹ tiu² ni⁵/。
問題3:已知 1024 年是甲子年,問最近過去的甲子年和將要到來的甲子年是公元多少年?