不輟集

《Go 設計與實現》筆記之第一章 準備工作

深入學習 Go 語言的設計與實現之前要準備以下工作:

  1. 克隆 Go 倉庫源代碼並編譯它。
  2. 了解 Plan 9 彙編,知道 Go 的棧結構並能分析代碼的執行過程。

彙編者,二進制代碼的文本形式也,其最大的特點就是不可移植。Plan 9 彙編是貝爾實驗室的九號計劃的產物,目前被用於 Go 程序編譯的中間代碼,因爲 Go 的作者 Rob Pike,同時也是 Plan 9 彙編的作者。

Plan 9 彙編指令與 Intel 等彙編等的不同在於:

  1. 一般情況下,命令的源操作數在先,目的操作數在後。 如同樣是將十六進制的 10 傳送到 AX寄存器,在 Plan 9 中是 MOVQ $0x10, AX ,而在 Intel 彙編中是 mov rax, 0x10

  2. 棧的調整通過硬件 SP 寄存器進行加減運算實現。而 Intel 彙編中通過 push 和 pop 命令實現。

  3. 操作的數據長度取決於命令的後綴。而 Intel 彙編取決於寄存器。

    // plan 9 彙編
    MOVB $1, DI // 1 byte
    MOVW $0x10, BX // 2 bytes
    MOVD $1, DX // 4 bytes
    MOVQ $-10, AX // 8 bytes

    // intel 彙編
    mov rax, 0x1 // 8 bytes
    mov eax, 0x100 // 4 bytes
    mov ax, 0x22 // 2 bytes
    mov ah, 0x33 // 1 byte
    mov al, 0x44 // 1 byte

通過分析 Plan 9 彙編代碼我們可以繪製出如下的棧結構:

接續讀落

十二生肖、干支紀年法與Go語言編程

如無特殊說明,本文標音採用甲子話拼音方案。甲子話系陸豐市甲子鎮通行的語言,屬閩南語潮汕話三甲片。

十二生肖

十二生肖本地讀音爲:

  • 鼠牛虎兔 /cu² ngu⁵ hao² tao³/
  • 龍蛇馬羊 /lêng⁵ zua⁵ bhê² ion⁵/
  • 猴雞狗豬 /gao⁵ goi¹ gao² du¹/

干支紀年法

「干」是天干,有 10:

  • 甲乙丙丁 /gah⁴ ig⁴ bian² dêng¹/
  • 戊己庚辛 /bhao⁷ gi² gên¹ sing¹/
  • 壬癸 /rim⁶ gui³/

「支」是地支,有 12:

  • 子丑寅卯 /zu² tiu² ing⁵ bhao²/
  • 辰巳午未 /sing⁵ zi⁶ ngao² bhi⁷/
  • 申酉戌亥 /sing¹ iu² sug⁴ hai⁶/

天干從甲開始,地支從子開始,天干地支相配形成 60 種組合,用來紀年。從甲子出發,60 年後又回到甲子,因此稱 60 年爲「一甲子」。

十二地支與十二生肖相對應,因此也用生肖紀年。如甲子年,地支爲「子」,對應生肖「鼠」,因此甲子年也稱之為「鼠年」。

問題

問題1:已知 2020 年是鼠年,請問 2021 年是什麼年?

排在鼠之後的生肖是牛,因此 2021 年是牛年。

問題2:已知 2020 年是庚子年 /gên¹ zu² ni⁵/,請問 2021 年是什麼年?

庚之後爲辛,子之後爲丑,因此 2021 年是辛丑年 /sing¹ tiu² ni⁵/。

問題3:已知 1024 年是甲子年,問最近過去的甲子年和將要到來的甲子年是公元多少年?

接續讀落

Go 基礎

Go 又稱 Golang,是 Google 公司 2009 年發佈的一款開源編程語言,以簡潔而高效的代碼著稱。Go 目前使用 GOPATH 或 Go modules 管理項目中的第三方依賴,且不支持循環依賴。

Go 的基本數據類型有 16 種(不包含別名),可謂豐富。要注意的是 string 也是基本數據類型,表示一個 UTF-8 字符串,底層是 byte 數組。單個字符使用一個 int32 的別名 rune 表示,其值爲 Unicode 字符碼點。

Go 的變量使用 var 關鍵字聲明,也可以使用短變量聲明;常量則是使用 const 關鍵字聲明。

Go 有 if 條件語句、for 循環語句、switch 選擇語句和 defer 延遲執行語句。Go 的 for 語句兼具其他語言的 while 語句;switch 語句每個 case 條件都支持運算,且默認自動 break;defer 語句可以立即計算參數值,然後在函數 return 前執行。

Go 的可見性跟標識符的首字母是否大寫相關,大寫則是導出的,包外可見;小寫則是非導出的,包外不可見。

Go 有指針,要注意 & 是生成指向操作數的指針,而 * 是獲取指針指向的底層值。

Go 將一些字段組合成一個結構體(struct) 。結構體支持隱式間接調用,即 p.X 等價於 (*p).X(p 爲結構體指針)。

Go 支持數組,更重要的是支持一種名爲切片(slice) 的動態數組。切片是一個數組片段的描述,包含指向數組的指針、片段的長度和容量。

Go 支持映射(map)。

Go 支持函數(function)的命名返回值、多值返回、作爲值傳遞和閉包。還有一種稱爲方法(method)的特殊函數,其帶有接收者參數,接收者可以是值接收者也可以是指針接收者,指針接收者可以更改接收者的值。

Go 支持將一些方法簽名組成接口(interface)。接口的實現是隱式的,不需要「implements」。一個結構體作爲接收者定義了接口中的所有方法,那麼該結構體就是實現了該接口。因爲隱式的緣故,建議接口方法盡可能少,以便管理。接口是值,可以傳遞。底層值是 nil 的接口,其方法可以被調用;接口本身爲 nil ,則意味著其不保存值也不保存具體類型;空接口(interface{})是包含零個函數的接口,不是爲 nil 接口。

Go 的異常處理很簡單,只有 Error,沒有 throws。

Go 支持 Go 程,一種 Go運行時管理的輕量級線程。Go 程之間可以通過信道(channel) 通信,通過 Mutex 或 RWMutex 共享互斥變量,通過 WaitGroup 等待執行完成。

Go 中的信道還支持通過 for-range 循環讀取數據,當信道關閉時該循環自動退出。記住,只有發送方可以關閉信道,接收方不能。信道還支持 select 語句,其會阻塞到某一分支可以執行爲止,如沒有分支可以執行且設定了default 語句,會一直執行 default 語句。

接續讀落

JVM

JVM(Java Virtual Machine),即 Java 虛擬機,是操作系統上的一個程序,用於編譯、運行Java程序,使得 Java程序可以跨平台。關於 JVM 我們著重在內存區域、類的加載、對象的創建和內存管理四個部分。

內存區域分爲堆、方法區、程序計數器、虛擬機棧和本地方法棧。其中堆和方法區是線程共享的,程序計數器、虛擬機棧和本地方法棧則是線程私有的。堆是一大塊內存,幾乎所有的對象實例都在這裡分配;方法區在JVM 規範中是堆的一部分,不同的 JVM 可以有不同的實現,就 HotSpot VM 而言,在 JDK1.8 之前使用永久代實現方法區,在JDK1.8及之後使用直接內存上的元空間實現;程序計數器存放下一條指令的地址;虛擬機棧的每一個棧幀保存著方法的局部變量表、操作數棧、動態連接和方法返回地址;本地方法棧類似虛擬機棧,不過是調用 native 方法,在 HotSpot VM中虛擬機棧和本地方法棧合而爲一。

類的生命週期分爲加載、連接、初始化、使用和卸載四個過程,其中:

  1. 加載:將 .class 文件以二進制字節流方式讀入虛擬機,並在方法區給靜態變量分配空間,在堆中生成 Class 對象作爲訪問靜態變量的入口。
  2. 連接:分爲驗證、準備和解析三個階段,驗證階段驗證字節碼文件的合規性,準備階段將類變量賦予初始零值,解析階段將常量池中的符號引用轉爲直接引用。
  3. 初始化:執行 <clinit> 方法。

對象的創建過程依次是類加載檢查、分配內存、初始化零值、設置對象頭和執行<init> 方法。

  1. 類加載檢查:檢查類是否加載完畢。
  2. 分配內存:對象實例一般會分配在堆中,根據採用的垃圾回收器會選擇指針碰撞或空閒類表方式分配。JDK1.7之後啟用逃逸分析可以將未逃逸的對象分配到棧中。
  3. 初始化零值:給對象的成員變量設置初始的零值。
  4. 設置對象頭:對象頭包括所屬的類、對象哈希碼、GC分代年齡和鎖信息。
  5. 執行 <init> 方法。

Java 是自動內存管理的,內存的分配和回收由JVM進行控制。通常使用分代內存管理,分新生代、老年代和永久代(JDK1.8及之後無永久代),新對象優先在新生代 Eden 區分配,大對象直接分配到老年代,持續存活的對象也會被轉移到老年代。

內存回收涉及垃圾的判定、垃圾收集算法和垃圾收集器。

判定垃圾通常有引用計數法和可達性分析算法。

垃圾收集(GC)通常分部分收集(Partial GC)和整堆收集(Full GC),部分收集分新生代收集(Minor GC / Young GC)、老年代收集(Major GC / Old GC)和混合收集(Mixed GC)

垃圾收集算法通常有標記-清除算法、複製算法、標記-整理算法和分代收集算法。

垃圾收集器中 ParNew 最早採用並行收集,CMS 最早採用並發收集。JDK1.8 中默認使用 Parallel Scavenge(新生代) + Parallel Old(老年代) 收集器,JDK9之後默認使用 G1 收集器。

接續讀落

甲子話分類辭表(2020.12)

!!! 注意:本辭表已收錄在典合網中進行維護,請轉閱:https://dicthub.cn/dicts/kahtsi-ue !!!

序言(su⁶ ngiang⁵)

甲子鎮處在陸豐市,與惠來縣交界,語言文化上偏惠來(其實五百年前與惠來交界處同屬海豐縣)。甲子話是三甲地區(甲子、甲西、甲東三鎮)通行的語言,是甲子地方文化的重要載體之一。在學術上,甲子話被歸入粵東閩南語潮汕話片。

甲子話保留了好㩼中古乃至上古的漢語詞彙,比如:汝、諸母、新婦、箸、鼎、匏桸、雅、翹楚等等,還有極具地方特色的表達,比如:𨑨迌、走漆、理唔直、孤獨死相等等。然而無會寫甚至無會呾甲子話的人實在㩼,其中不少是受過義務教育其。 有鑑於此,本人草創此表,力求詞雅正且其音形義有所考據,權當拋磚引玉,歡迎大家儂做蜀討論改進。

另附本表主要參考資料:

  1. 《潮汕方言詞考釋》(林倫倫)
  2. 《海豐話分類辭表》(羅志海、鍾顯坤)
  3. 《潮典》
  4. 《新潮汕字典》(張曉山)
  5. 《台灣閩南語常用詞辭典》
  6. 《小學堂閩語》

阿華
2020年10月成稿,12月修訂

接續讀落