本書是一本深入探討計算機科學(xué)與技術(shù)的圖書,旨在幫助讀者更好地理解計算機內(nèi)部的工作原理,并探索從內(nèi)存到線程等核心知識。本書適用于對計算機科學(xué)和底層技術(shù)感興趣的讀者,無論是學(xué)習(xí)計算機基礎(chǔ)知識還是進一步擴展技術(shù)視野,都能從本書中獲益良多。在這本書中,作者以清晰、易懂的語言詳細介紹計算機內(nèi)存的結(jié)構(gòu)和工作原理。讀者將了解內(nèi)存的層次結(jié)構(gòu)、存儲器管理、緩存和內(nèi)存映射等關(guān)鍵概念,從而更好地理解計算機是如何存儲和訪問數(shù)據(jù)的。此外,本書還深入討論了線程和并發(fā)編程。讀者將學(xué)習(xí)多線程編程的基本概念和技術(shù),并了解線程同步、互斥鎖、信號量等并發(fā)控制機制。通過實例和案例研究,讀者將能夠編寫高效、可靠的多線程應(yīng)用程序。無論您是學(xué)生、工程師還是對計算機科學(xué)與技術(shù)感興趣的讀者,本書都將成為您不可或缺的參考資料。
在技術(shù)迭代加速的當下,《計算之道 卷Ⅰ:計算機組成與高級語言》為讀者打開理解計算機底層邏輯與高級語言運作的窗口。書中從馮?諾依曼架構(gòu)、e進制等基礎(chǔ)出發(fā),拆解邏輯門、CPU等硬件組件,解析計算機數(shù)據(jù)處理的核心原理;同時深入?yún)R編語言、編譯原理與C語言等內(nèi)容,闡述高級語言從設(shè)計到執(zhí)行的全流程。
無論是想夯實專業(yè)基礎(chǔ)的學(xué)生,還是期望提升編程能力的開發(fā)者,都能在書中找到價值。它將晦澀的理論融入實際案例,用深入淺出的方式,為讀者搭建起從硬件到軟件的知識橋梁,助力掌握計算技術(shù)的核心精髓。
為什么要寫這本書
因為計算機編程的知識往往是分散的,我們需要對其進行歸納和總結(jié),以構(gòu)建一個完整的知識體系。同時,我希望為社會貢獻一份微薄的力量。學(xué)習(xí)在很大程度上取決于個人的領(lǐng)悟,我期望讀者通過閱讀本書能夠確定適合自己的學(xué)習(xí)路徑。
本書非常適合那些已經(jīng)接觸過計算機編程、具備一定代碼編寫能力,但對計算機整體體系結(jié)構(gòu)和底層原理了解不深的讀者。本書旨在幫助他們深入了解計算機的工作機制和基本原理。本書內(nèi)容涵蓋 Intel 芯片的工作機制、編譯器與連接器的原理,對這三個領(lǐng)域感興趣的讀者同樣適合閱讀。
本書中的大多數(shù)源代碼示例都與 C 語言相關(guān),涉及的范圍包括但不限于 Linux 內(nèi)核、glibc 庫以及 Bison。同時,本書在介紹編譯器實現(xiàn)的部分采用了 Java 代碼。因此,讀者最好具備一定的 C 語言和 Java 語言基礎(chǔ)知識。
如何閱讀這本書
本書按照計算機從硬件到軟件的架構(gòu)進行設(shè)計,讀者可根據(jù)個人學(xué)習(xí)需求,查閱并學(xué)習(xí)各章節(jié)的內(nèi)容。我將前三章歸類為概念篇或抽象篇,它們主要介紹相關(guān)概念的形成過程,而這些內(nèi)容并未具象化到某個產(chǎn)品或編程語言。首先,我們從計算機的組成講起(包括 CPU、內(nèi)存的實現(xiàn)),幫助讀者理解硬件底層的原理。接著,我們探討匯編語言的重要性,它是如何基于硬件層面構(gòu)建的。隨后,我們通過指出匯編語言的局限性,引出更易于閱讀和理解的編程語言。最后,我們通過分析不同層級語言(高級語言、低級語言)之間的關(guān)系,闡述編譯器的工作原理。從第 5 章開始,內(nèi)容變得更加具體和實踐,以 Intel 匯編語言為例,詳細介紹匯編指令的設(shè)計(對操作系統(tǒng)的支持指令)以及特定指令(PUSH 和 MOV)的工作原理。我們使用 C 語言來展示其特性,并與前文中的語言設(shè)計概念相呼應(yīng)。此外,我們還描述程序結(jié)構(gòu)的完整加載和運行過程(動態(tài)鏈接器原理)。最后,為了加深讀者的理解,我們以內(nèi)存分配為例,詳細講解內(nèi)存分配的整個流程。
勘誤和支持
由于本人水平有限,書中難免存在錯誤和疏漏,懇請讀者不吝賜教并指出。如果讀者有任何寶貴意見和建議,歡迎您發(fā)送電子郵件到我的郵箱,期待收到您的真誠反饋。
黃俊
專注于研究Java語言
專注于研究Hotspot
專注于研究Linux內(nèi)核
專注于研究C語言與匯編
專注于研究架構(gòu)設(shè)計
專注于研究多線程并發(fā)處理
專注于研究高效學(xué)習(xí)方式
曾就職于美團、阿里
前新東方業(yè)務(wù)架構(gòu)師
張仲文
資深技術(shù)專家,擁有九年互聯(lián)網(wǎng)項目開發(fā)經(jīng)驗。自Java編程入門,深入探索操作系統(tǒng)原理與計算機科學(xué)精髓,深入閱讀Linux源碼,對計算機底層原理有著深厚的研究。致力于解構(gòu)和探索計算機之道。
第 1 章 計算機的組成 1
1.1 一顆計算機種子 1
1.2 百花齊放 2
1.2.1 馮·諾依曼架構(gòu) 3
1.2.2 哈佛架構(gòu) 4
1.3 e 進制 5
1.3.1 進制 5
1.3.2 二進制 6
1.3.3 三進制 6
1.3.4 e 進制 7
1.3.5 其他進制 8
1.4 邏輯門與運算單元 10
1.4.1 NMOS 與 PMOS 10
1.4.2 非門(NOT) 10
1.4.3 與門(AND) 11
1.4.4 與非門(NAND) 11
1.4.5 或門(OR) 11
1.4.6 解復(fù)用器(de-multiplexer,DEMUX) 12
1.4.7 復(fù)用器(multiplexer,MUX) 13
1.4.8 異或門(XOR) 14
1.4.9 多位組合電路 15
1.4.10 半加器(Half Adder) 17
1.4.11 全加器(Full Adder) 18
1.4.12 十六位負數(shù)判斷(IsNeg) 18
1.4.13 十六位加法器(Adder16) 18
1.4.14 算術(shù)邏輯單元(ALU) 19
1.5 D 觸發(fā)器與存儲單元 20
1.5.1 RS 觸發(fā)器 20
1.5.2 D 觸發(fā)器 21
1.5.3 bit一位存儲器 22
1.5.4 十六位寄存器 22
1.5.5 高位寄存器內(nèi)存組合 23
1.5.6 小結(jié) 24
1.6 振蕩器與計時器 25
1.7 CPU 的組成 26
1.7.1 PC 計數(shù)器 26
1.7.2 寄存器 27
1.7.3 功能定義 27
1.7.4 CPU 實現(xiàn) 30
1.8 計算機的組成 32
1.8.1 內(nèi)存 32
1.8.2 其他設(shè)備 33
1.8.3 計算機實現(xiàn) 34
1.9 網(wǎng)絡(luò)服務(wù)的組成 35
1.9.1 單體網(wǎng)絡(luò)服務(wù) 35
1.9.2 分布式服務(wù) 36
1.10 小結(jié) 37
第 2 章 匯編語言 39
2.1 指令集體系結(jié)構(gòu)(ISA) 39
2.2 CISC 40
2.3 RISC 40
2.4 Intel 指令集 41
2.4.1 指令前綴 42
2.4.2 操作碼 43
2.4.3 ModR/M與SIB 44
2.4.4 位移與立即數(shù) 45
2.5 通用匯編指令 45
2.5.1 MOV、ADD、SUB 45
2.5.2 MLU、DIV、SHL、SHR 45
2.5.3 PUSH、POP 46
2.5.4 JMP、JXX 47
2.6 匯編的內(nèi)存結(jié)構(gòu) 47
2.6.1 位寬 47
2.6.2 步長 47
2.7 匯編 器 48
2.7.1 簡單匯編 48
2.7.2 匯編器 49
2.8 小結(jié) 54
第 3 章 如何設(shè)計一門語言 55
3.1 語言的目標 55
3.2 類型系統(tǒng) 55
3.3 抽象操作 56
3.3.1 匯編拓展 56
3.3.2 寄存器拓展 57
3.4 內(nèi)存抽象 57
3.4.1 數(shù)組 58
3.4.2 結(jié)構(gòu)體 58
3.5 進程內(nèi)存結(jié)構(gòu) 58
3.5.1 堆 59
3.5.2 棧 59
3.5.3 數(shù)據(jù)段 60
3.5.4 代碼段 60
3.5.5 應(yīng)用程序二進制接口 61
3.6 小結(jié) 61
第 4 章 編譯器 63
4.1 編譯原理 63
4.1.1 詞法分析 64
4.1.2 語法分析 76
4.1.3 語義分析 115
4.2 GCC 編譯器源碼 131
4.3 其他編譯器 152
4.4 小結(jié) 152
第 5 章 Intel 與匯編 154
5.1 Intel 歷史 154
5.2 Intel 編碼語法 156
5.3 基礎(chǔ)寄存器 157
5.3.1 通用寄存器 157
5.3.2 段寄存器 159
5.3.3 狀態(tài)寄存器 161
5.3.4 指令指針寄存器 161
5.4 Intel 內(nèi)存分段 163
5.5 Intel 內(nèi)存分頁 168
5.6 保護模式 170
5.6.1 數(shù)據(jù)段的訪問與檢查 172
5.6.2 代碼段的訪問與檢查 173
5.6.3 調(diào)用門 176
5.6.4 中斷與異常 179
5.6.5 任務(wù)管理 187
5.7 其他 190
5.7.1 多核處理器 190
5.7.2 APIC 192
5.8 Intel 指令原理 193
5.8.1 PUSH 指令 193
5.8.2 MOV 指令 194
5.8.3 ADD、MUL、DIV、SUB 指令 195
5.8.4 LIDT/LGDT 196
5.9 小結(jié) 197
第 6 章 C 語言 198
6.1 C 標準歷史(維基百科) 198
6.1.1 基于 B 語言的第一個 C 版本 199
6.1.2 結(jié)構(gòu)體和 UNIX 內(nèi)核重寫 199
6.1.3 K&R C 199
6.1.4 ANSI C 和 ISO C 200
6.1.5 C99 201
6.1.6 C11 202
6.1.7 小結(jié) 202
6.2 宏定義 202
6.3 變量與常量 203
6.4 函數(shù) 206
6.5 數(shù)組與指針 209
6.6 結(jié)構(gòu)體 214
6.6.1 位操作 216
6.6.2 其他 218
6.6.3 返回值 219
6.7 可變數(shù)組 222
6.8 其他特性 224
6.8.1 浮點型運算 224
6.8.2 聯(lián)合體和枚舉 225
6.8.3 標準庫 227
6.8.4 extern/volatile 227
6.8.5 內(nèi)聯(lián)匯編 228
6.9 C 語言的編譯 230
6.10 GAS 232
6.11 小結(jié) 234
第 7 章 ELF 與鏈接器 236
7.1 ELF 236
7.1.1 ELF 頭結(jié)構(gòu) 238
7.1.2 節(jié)的結(jié)構(gòu) 239
7.1.3 字符串表 240
7.1.4 符號表 241
7.1.5 重定位表 242
7.1.6 程序加載 245
7.1.7 程序頭結(jié)構(gòu) 246
7.1.8 程序解釋器 248
7.1.9 小結(jié) 257
7.2 動態(tài)鏈接器 257
7.2.1 Bash 執(zhí)行流程 258
7.2.2 fork()原理 260
7.2.3 execve()原理 265
7.2.4 glibc 動態(tài)鏈接原理 281
7.3 庫打樁 318
7.4 內(nèi)存分配 319
7.4.1 glibc 320
7.4.2 內(nèi)核 338
7.4.3 內(nèi)核信號機制 360
7.5 小結(jié) 368