深度探索Go語言:對象模型與runtime的原理、特性及應用(簡體書)
商品資訊
系列名:計算機技術開發與應用叢書
ISBN13:9787302600855
出版社:清華大學出版社(大陸)
作者:封幼林
出版日:2022/08/01
裝訂/頁數:平裝/376頁
規格:24cm*17cm (高/寬)
版次:一版
商品簡介
本書主要講解了Go語言一些關鍵特性的實現原理,Nicklaus Wirth大師曾經說過:算法+數據結構=程序,語言特性的實現也不外乎就是數據結構+代碼邏輯。
全書共分為4個部分:第一部分是基礎特性(第1章~第3章),第二部分是物件模型(第4章~第5章),第三部分是調度系統(第6章~第7章),第四部分是內存管理(第8章~第9章)。書中主要內容包括:指針、函數棧幀、調用約定、變量逃逸、Function Value、閉包、defer、panic、方法、Method Value、組合式繼承、接口、類型斷言、反射、goroutine、搶占式調度、同步、堆和棧的管理,以及GC等。
書中包含大量的探索示例和源碼分析,在學會應用的同時還能了解實現原理。書中絕大部分代碼都是用Go語言實現,還有少部分使用匯編語言,都可以使用Go官方SDK直接編譯。探索過程循序漸進條理清晰,用到的工具也都是SDK自帶,方便讀者親自上手實踐。
本書適合Go語言的初學者,在學習語言特性的同時了解其實現原理。更適合有一定的Go語言應用基礎,想要深入研究底層原理的技術人員。同樣適合有一些其他編程語言基礎,想要轉學Go語言的開發者。
作者簡介
封幼林,資深軟件工程師,十多年IT從業經驗,曾涉足Win32桌面程序開發、Android移動端開發,以及互聯網服務器端開發等多個領域。喜歡研究底層技術,用自己的方法探究背後的實現原理。熱愛技術交流與分享,創建了微信公眾號“幼麟實驗室”,致力做一些形象、通透的計算機教程,讓開發者“知其然亦知其所以然”。
名人/編輯推薦
本書系統論述Go語言特性,從語言實現的角度深度探索Go語言特性,包含大量的探索示例和源碼分析,在學會應用的同時還能了解實現原理。閱讀本書不需要精通匯編語言、操作系統,但是需要對進程、線程這類基本概念有所了解。
序
近幾年來,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實際上是個不可分割的整體,在這裡會看到內存管理對類型系統的依賴。
本書源代碼
掃描下方二維碼,可獲取本書源代碼:
本書源代碼
致謝
感謝那些喜愛Go語言的網友對筆者的支持; 感謝清華大學出版社的趙佳霓編輯; 感謝我的家人,尤其是和我一起討論技術問題並幫忙整理書稿的妻子,給予我莫大的支持。
由於時間倉促,並且受限於筆者水平,書中難免有不妥之處,請讀者見諒,並提寶貴意見。
封幼林2022年5月
目次
第1章匯編基礎
1.1x86通用寄存器
1.1.132位架構
1.1.264位架構
1.2常用匯編指令
1.2.1整數加減指令
1.2.2數據傳輸指令
1.2.3入棧和出棧指令
1.2.4分支跳轉指令
1.2.5過程調用指令
1.3內存分頁機制
1.3.1線性地址
1.3.280386兩級頁表
1.3.3PAE三級頁表
1.3.4x64四級頁表
1.3.5虛擬內存
1.4匯編代碼風格
1.5本章小結
第2章指針(7min)
2.1指針構成
2.1.1地址
2.1.2元素類型
2.2相關操作
2.2.1取地址
2.2.2解引用
2.2.3強制類型轉換
2.2.4指針運算
2.3unsafe包
2.3.1標準庫與keyword
2.3.2關於uintptr
2.3.3內存對齊
2.4本章小結
第3章函數(44min)
3.1棧幀
3.1.1棧幀布局
3.1.2尋址方式
3.1.3又見內存對齊
3.1.4調用約定
3.1.5Go 1.17的變化
3.2逃逸分析
3.2.1什麼是逃逸分析
3.2.2不逃逸分析
3.2.3不逃逸判斷
3.3Function Value
3.3.1函數指針
3.3.2Function Value分析
3.3.3閉包
3.4defer
3.4.1最初的鏈表
3.4.2棧上分配
3.4.3高效的open coded defer
3.5panic
3.5.1gopanic()函數
3.5.2gorecover()函數
3.5.3嵌套的panic
3.5.4支持open coded defer
3.6本章小結
第4章方法(6min)
4.1接收者類型
4.1.1值類型
4.1.2指針類型
4.1.3包裝方法
4.2Method Value
4.2.1基於類型
4.2.2基於物件
4.3組合式繼承
4.3.1嵌入值
4.3.2嵌入指針
4.3.3多重繼承
4.4本章小結
第5章接口(27min)
5.1空接口
5.1.1一個更好的void*
5.1.2類型元數據
5.1.3逃逸與裝箱
5.2非空接口
5.2.1動態派發
5.2.2具體實現
5.2.3接收者類型
5.2.4組合式繼承
5.3類型斷言
5.3.1E To 具體類型
5.3.2E To I
5.3.3I To 具體類型
5.3.4I To I
5.4反射
5.4.1類型系統
5.4.2類型元數據詳細講解
5.4.3對數據的操作
5.4.4對鏈接器裁剪的影響
5.5本章小結
第6章goroutine(48min)
6.1進程、線程與協程
6.1.1進程
6.1.2線程
6.1.3協程
6.2IO多路復用
6.2.13種網絡IO模型
6.2.2示例對比
6.3巧妙結合
6.4GMP模型
6.4.1基本概念
6.4.2從GM到GMP
6.5GMP主要數據結構
6.5.1runtime.g
6.5.2runtime.m
6.5.3runtime.p
6.5.4schedt
6.6調度器初始化
6.6.1調度器初始化過程
6.6.2runtime.schedinit()函數
6.7G的創建與退出
6.7.1相關匯編函數
6.7.2runtime.newproc()函數
6.8調度循環
6.8.1runtime.schedule()函數
6.8.2runtime.findrunnable()函數
6.9搶占式調度
6.9.1Go 1.13的搶占式調度
6.9.2Go 1.14的搶占式調度
6.10timer
6.10.1一個示例
6.10.2數據結構
6.10.3操作函數
6.11netpoller
6.11.1跨平臺的netpoller
6.11.2TCP連接的Read()方法
6.12監控線程
6.12.1按需執行timer和netpoll
6.12.2搶占G和P
6.12.3強制執行GC
6.13本章小結
第7章同步(32min)
7.1Happens Before
7.1.1並發
7.1.2並行
7.2內存亂序
7.2.1編譯期亂序
7.2.2執行期亂序
7.2.3內存排序指令
7.3常見的鎖
7.3.1原子指令
7.3.2自旋鎖
7.3.3調度器物件
7.3.4優化的鎖
7.4Go語言的同步
7.4.1runtime.mutex
7.4.2semaphore
7.4.3sync.Mutex
7.4.4channel
7.5本章小結
第8章堆(17min)
8.1內存分配
8.1.1sizeclasses
8.1.2heapArena
8.1.3mspan
8.1.4mcentral
8.1.5mcache
8.1.6mallocgc
8.2垃圾回收
8.2.1GC root
8.2.2三色抽象
8.2.3寫屏障
8.2.4觸發方式
8.2.5GC Worker
8.2.6gctrace
8.3本章小結
第9章棧(8min)
9.1棧分配
9.1.1棧分配初始化
9.1.2棧分配邏輯
9.2棧增長
9.2.1棧增長檢測代碼
9.2.2棧增長函數
9.3棧收縮
9.4棧釋放
9.4.1小於或等於16KB的棧空間
9.4.2大於或等於32KB的棧空間
9.4.3棧釋放時機
9.5本章小結
主題書展
更多書展今日66折
您曾經瀏覽過的商品
購物須知
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。