- 深度探索Go語言:對象模型與runtime的原理特性及應用
- 封幼林編著
- 1718字
- 2023-08-10 16:55:31
前言
PREFACE
近幾年來,Go語言作為一門服務器端開發語言越來越受歡迎,簡潔易學的語法加上天生的高并發支持,還有日益完善的社區,讓很多互聯網公司開始轉向Go語言。隨著Go語言生態日趨成熟,各種組件框架如雨后春筍般涌現,市面上相關的書籍也多了起來,但是其中大部分是以應用為主,對于語言特性本身探索一般不太深入。筆者希望能夠有一本講解語言特性及實現原理的書,這也是寫作本書的動機。
筆者當年剛參加工作的時候,使用的第一門開發語言是C++。雖然之前在學校用過C語言和匯編語言,但在接觸到C++的一些面向對象特性時還是困惑了很久。直到有一天發現了《深度探索C++對象模型》,作者Stanley Lippman當年在貝爾實驗室工作,是世界上第1個C++編譯器——cfront的實現者,他從一個語言實現者的高度,對一些關鍵特性的實現原理及其背后的思考進行了詳細闡述,使筆者受益匪淺。后來因為工作的原因,筆者開始使用Go語言,因為有了C/C++相關的基礎,所以學習起來更加高效。尤其是當年學習C++對象模型,讓筆者認識到語言特性也是通過數據結構和代碼實現的,所以就按照自己的方式一邊學習一邊探索。第一次萌生要寫點東西的念頭是在給從PHP轉Go語言的妻子講完接口動態派發的實現原理后,用她的話來講就是有種豁然開朗的感覺,并鼓勵筆者把這些東西整理一下。后來我們就在微信公眾號上以幼麟實驗室的名義發布了一系列視頻和文章,主要分析語言特性的底層實現。在一年多的時間里,幼麟實驗室受到了廣大網友的好評與支持,清華大學出版社的趙佳霓編輯也是在此期間聯系了筆者,希望筆者能夠把自己的探索研究整理成書。因為寫作本書的關系,讓筆者能夠更系統地思考,收獲頗多。希望本書能夠幫助各位讀者,解決大家學習Go語言中遇到的一些困惑。
本書主要內容
第1章介紹x86匯編的一些基礎知識,包括通用寄存器、幾條常用的指令,以及內存分頁的實現原理等。
第2章介紹指針的實現原理,包括指針構成、相關操作,以及Go語言的unsafe包等。
第3章圍繞函數進行一系列探索,包括棧幀布局、調用約定、變量逃逸、Function Value、閉包、defer和panic等。
第4章介紹方法的實現原理,包括接收者類型、Method Value和組合式繼承等。
第5章圍繞接口對Go語言的動態特性展開探索,包括裝箱、方法集、動態派發、類型斷言、類型系統和反射等。
第6章介紹goroutine的實現,包括GMP模型、goroutine的創建與退出、調度循環、搶占式調度、timer、netpoller和監控線程等。
第7章介紹同步的原理及其相關的組件,包括內存亂序、原子指令、自旋鎖、Go語言runtime中的互斥鎖和信號量,以及sync.Mutex和channel等。
第8章介紹堆內存管理,包括heapArena、mspan等幾種主要的數據結構,mallocgc函數的主要邏輯,以及GC的三色抽象、寫屏障等。
第9章介紹棧內存管理,包括goroutine棧的分配、增長、收縮和釋放等。
閱讀建議
本書寫作過程主要使用了Go 1.16及之前的幾個版本,為了避免后續版本可能發生的不兼容問題,相關示例建議使用Go 1.13~Go 1.16編譯運行。
閱讀本書不需要精通匯編語言、操作系統,但是需要對進程、線程這類基本概念有所了解。畢竟Go語言可直接構建生成系統原生的可執行文件,如果想要深入理解一些語言特性的實現原理,還是建議學習并實踐一下多線程編程、IO多路復用這類關鍵技術。
第一部分主要包括指針和函數,筆者希望大家能夠通過這部分內容,對運行時棧及函數棧幀的相對尋址方式有深入的理解,為后續探索打下堅實的基礎。
第二部分想要表達對Lippman大師的崇高敬意,至今難忘初次閱讀《深度探索C++對象模型》時那種“初聞大道,喜不自勝”的心情。按照Lippman大師的解釋,對象模型應該是編譯器對自定義數據類型的建模,指導了對象內存布局及其他一些數據結構和代碼的生成。只有理解了語言特性的實現原理,才真正是磨刀不誤砍柴工。
第三部分從服務器端程序開發的角度,梳理了如何從最初的多進程、多線程,逐漸發展到現在的協程。runtime的調度邏輯還是比較復雜的,但是最核心的思想就是IO多路復用與協程的結合,讓每個任務有自己獨立的棧,而同步的核心就是確立Happens Before條件。
第四部分從堆和棧兩方面,梳理了內存管理的實現。內存分配方面應重點關注主要的數據結構。至于GC方面,應先理解宏觀層面的整體思想和流程,然后去研究一些細節會更加容易。整個runtime實際上是個不可分割的整體,在這里會看到內存管理對類型系統的依賴。
本書源代碼
掃描下方二維碼,可獲取本書源代碼:

本書源代碼
- Ext JS Data-driven Application Design
- Mastering Entity Framework
- 羅克韋爾ControlLogix系統應用技術
- Selenium Design Patterns and Best Practices
- VMware vSphere 6.7虛擬化架構實戰指南
- Mastering Kali Linux for Web Penetration Testing
- 深度強化學習算法與實踐:基于PyTorch的實現
- Python高效開發實戰:Django、Tornado、Flask、Twisted(第3版)
- Hands-On Reinforcement Learning with Python
- Apache Spark 2.x for Java Developers
- ExtJS高級程序設計
- Java編程的邏輯
- Hacking Android
- INSTANT PLC Programming with RSLogix 5000
- Hands-On Data Visualization with Bokeh