這本書詮釋了:
changkun.de/golang/
內容基於 go1.14
Go 語言從 2009 年誕生之初已有十餘年的歷史。 在這十年的過程中,Go 語言的熱度逐漸上升,Go 語言團隊也在持續不斷的每隔六個月的時間就釋出一個全新的 Go 版本。 縱觀大多數程式語言的歷史程式,令人驚訝的是 Go 語言自身在進化的這十餘年間, 語言本身並未發生太大變化,Go 語言的使用者能夠持續不斷寫出向後相容的應用。 從語言設計的角度而言,作為一門從誕生之初就考慮低成本、高併發、簡潔等原則的語言, 很難讓人不對其簡潔設計背後的各項實現機制以及具體工作原理所好奇。 本書就是一本討論 Go 語言原始碼工程中的技術原理及其演進歷程的書籍。
致讀者的話
讀者可能會好奇,設計總在演進、原始碼總在變化,為什麼要耗費力氣研究實際工作中可能永遠不會接觸的原始碼? 筆者以為不然,因為『軟體工程發生在程式碼被非原作者閱讀之時』,在閱讀原始碼的過程中, 我們除了能進一步加深對語言本身的理解,更重要的則是理解某個設計背後所使用的根本原理, 以及當其他人在實現這個設計的過程中發生的工程決策、實踐與實現技巧。 程式碼總是可以推倒重來,但原理卻能『永生』。
另外也會有讀者問,原始碼分析的文章這麼多,為什麼還要專門寫關於原始碼分析的書? 一個很重要的原因在於筆者在開始閱讀 Go 原始碼並查閱部分資料時, 發現已經存在的資料大多已經存在一定程度上的過時, 同時在分析原始碼的過程中並沒有細緻到介紹某段程式碼的產生背景與相關知識, 更沒有詳細的調研並介紹技術的理論原理和發展歷程。 這使得筆者在閱讀這類資料時無法鑑別其內容的正確性。由於 Go 的開發是相當活躍的, 因此本書希望對整個 Go 原始碼的技術原理和演進歷史進行一個相對完整的介紹。
注意,目前所有正文內容均為臨時寫作階段,內容可能較為混亂,部分內容為空屬於正常現象。 當全文初稿完成後會針對以下目標進行優化:
- 行文邏輯優化,補充大量配圖
- 原始碼刪減,只保留核心邏輯
- 對實際原理進行精煉,並延伸至理論
- 加強理論部分的描述,消除時效性較強的內容
- 理論與實踐為主,程式碼為輔
全書的組織結構
本書內容涵蓋整個 Go 語言的核心原始碼,這包括使用者程式碼能直接接觸的 Go 執行時元件、 與關鍵語言特性強相關的工具鏈、諸多重要的標準庫 sync
、context
、reflect
和 errors
等等。 在極少數情況下,本書會討論不同平臺下的實現差異,主要以 Linux amd64 為主,只在獨立設計的章節中討論其他平臺,例如 macOS 的 darwin 平臺、WebAssembly 等。
本書共分為四個主要部分。第一部分簡要回顧了與 Go 執行時及編譯器相關的基礎理論,包括程式基礎、並行程式設計、排程演算法以及記憶體管理等主題,並在其最後一章中簡要討論了 Go 程式的生命週期;第二部分著重關注 Go 的執行時機制,這包括 Go 執行時實現的排程器、記憶體分配器、垃圾回收器、核心語言特性以及程式的 ABI 以及執行時的型別系統等;第三部分則著眼於 Go 相關的工具鏈,包括編譯器、連結器、依賴管理以及執行時除錯等工具,其中包括 Go 編譯器對程式碼進行逃逸分析等語義分析、對 cgo 程式的翻譯和連結過程、Go 程式的自舉等等;第四部分則討論了一些依賴執行時和編譯器的標準庫,如 sync
、net
等;除此之外,還討論了一些與核心語言特性相關的標準庫,如 context
、errors
以及 contracts
。
《Go 語言原本》全書的組織結構
本書的參考文獻分為兩種不同的型別。在每個章節後都附有進一步閱讀的參考文獻, 這類文獻的主要目的是將讀者指向書中尚未進一步深入探討的話題,通常這類話題已經超出全書的討論範疇, 這類文獻給對該內容感興趣的讀者一個進一步閱讀的空間; 其二是書後的參考文獻,這些文獻是在編寫本書時引用、參考的主要文獻,讀者可以根據自己的需求選擇並查閱本書參考過的文獻。
閱讀的預備知識
閱讀本書的讀者應該具備一些基本的電腦科學素養,至少學過一門程式設計課程以及資料結構的課程,例如能夠熟悉地談論雜湊表、紅黑樹等概念。若你具備基本的離散數學和概率論知識,對謂詞、隨機變數等數學概念具有一定程度的理解,那麼將會對閱讀本書的部分章節有所幫助。
本書並未要求讀者已經掌握使用 Go 語言,因此會在開篇快速介紹 Go 的語言規範。如果你已經具備 Go 語言編碼和相關開發經驗,則會對閱讀本書有所幫助。
開始閱讀
社群的支援
本書的主頁( changkun.de/golang )以及 GitHub 倉庫( github.com/changkun/go-under-the-h... )上可以找到本書的更新情況以及一些額外的參考資料。 這是一本開源書籍,讀者還可以在 GitHub 倉庫上向作者發起關於本書內容的問題,或報告本書存在的錯誤。 筆者歡迎您在 GitHub 倉庫上提交 Issues 或 Pull Request。 其具體細節請參考如何參與貢獻。 如果您想要關注本倉庫的更新情況,可以點選倉庫的 Watch
。如果您喜歡本書,我們也非常高興能夠收到您的 Star
和資助。
致謝
筆者希望感謝他所在 Go 夜讀 社群小組的核心成員,感謝他們努力建設的 Go 語言社群環境,他們是:@yangwenmai, @qcrao, @eddycjy, @FelixSeptem,以及社群裡的朋友們積極參與並討論 Go 語言的相關問題,他們是:@cch123。
當然,本書的寫作離不開諸多熱心讀者的支援,筆者收到了來自下列人員的有幫助的評價和勘誤:@two, @yangxikun, @cnbailian, @choleraehyq, @PureWhiteWu, @hw676018683, @wangzeping722。筆者真心感謝這些人對本書內容的質疑與指正。當然,書中還可能有錯誤存在,希望得到更多的指正和反饋。
最後,筆者特別感謝 @egonelbre 所提供的 gopher 圖片設計。
許可
Go under the hood | CC-BY-NC-ND 4.0 & MIT © changkun
本作品採用《CC 協議》,轉載必須註明作者和本文連結