神書,包郵送!不用臥槽



《深入理解計算機系統》(簡稱CS:APP)的主要讀者是計算機科學家、計算機工程師,以及那些想通過學習計算機系統的內在運作而能夠寫出更好程序的人。

 

如果你研究和領會了這本書裏的概念,你將開始成爲極少數的“牛人”,這些“牛人”知道事情是如何運作的,也知道當事情出現故障時如何修復。你寫的程序將能夠更好地利用操作系統和系統軟件提供的功能,對各種操作條件和運行時參數都能正確操作,運行起來更快,並能避免出現使程序容易受到網絡攻擊的缺陷。同時,你也要做好更深入探究的準備,研究像編譯器、計算機體系結構、操作系統、嵌入式系統、網絡互聯和網絡安全這樣的高級題目。




0 1
讀者應具備的背景知識




本書的重點是執行x86-64機器代碼的系統。對英特爾及其競爭對手而言,x86-64是他們自1978年起,以8086微處理器爲代表,不斷進化的最新成果。按照英特爾微處理器產品線的命名規則,這類微處理器俗稱爲“x86”。隨着半導體技術的演進,單芯片上集成了更多的晶體管,這些處理器的計算能力和內存容量有了很大的增長。在這個過程中,它們從處理16位字,發展到引入IA32處理器處理32位字,再到最近的x86-64處理64位字。

 

我們考慮的是這些機器如何在Linux操作系統上運行C語言程序。Linux是衆多繼承自最初由貝爾實驗室開發的Unix的操作系統中的一種。這類操作系統的其他成員包括SolarisFreeBSDMacOS X。近年來,由於Posix和標準Unix規範的標準化努力,這些操作系統保持了高度兼容性。因此,本書內容幾乎直接適用於這些“類Unix”操作系統。

 

文中包含大量已在Linux系統上編譯和運行過的程序示例。我們假設你能訪問一臺這樣的機器,並且能夠登錄,做一些諸如切換目錄之類的簡單操作。如果你的計算機運行的是Microsoft Windows系統,我們建議你選擇安裝一個虛擬機環境(例如VirtualBox或者VMWare),以便爲一種操作系統(客戶OS)編寫的程序能在另一種系統(宿主OS)上運行。

 

我們還假設你對C和C++有一定的瞭解。如果你以前只有Java經驗,那麼你需要付出更多的努力來完成這種轉換,不過我們也會幫助你。JavaC有相似的語法和控制語句。不過,有一些C語言的特性(特別是指針、顯式的動態內存分配和格式化I/O)在Java中都是沒有的。所幸的是,C是一個較小的語言,在Brian KernighanDennis Ritchie經典的“K&R”文獻中得到了清晰優美的描述。無論你的編程背景如何,都應該考慮將K&R作爲個人系統藏書的一部分。如果你只有使用解釋性語言的經驗,如PythonRubyPerl,那麼在使用本書之前,需要花費一些時間來學習C


本書的前幾章揭示了C語言程序和它們相對應的機器語言程序之間的交互作用。機器語言示例都是用運行在x86-64處理器上的GNU GCC編譯器生成的。我們不需要你以前有任何硬件、機器語言或是彙編語言編程的經驗。


建議


給C語言初學者 關於C編程語言的建議


爲了幫助C語言編程背景薄弱(或全無背景)的讀者,我們在書中加入了這樣一些專門的註釋來突出C中一些特別重要的特性。我們假設你熟悉C++或Java。


 

0 2
如何閱讀此書




從程序員的角度學習計算機系統是如何工作的會非常有趣,主要是因爲你可以主動地做這件事情。無論何時你學到一些新的東西,都可以馬上試驗並且直接看到運行結果。事實上,我們相信學習系統的唯一方法就是做(do)系統,即在真正的系統上解決具體的問題,或是編寫和運行程序。

 

這個主題觀念貫穿全書。當引入一個新概念時,將會有一個或多個練習題緊隨其後,你應該馬上做一做來檢驗你的理解。這些練習題的解答在每章的末尾。當你閱讀時,嘗試自己來解答每個問題,然後再查閱答案,看自己的答案是否正確。除第1章外,每章後面都有難度不同的家庭作業。對每個家庭作業題,我們標註了難度級別:


只需要幾分鐘。幾乎或完全不需要編程。
可能需要將近20分鐘。通常包括編寫和測試一些代碼。(許多都源自我們在考試中出的題目。)
需要很大的努力,也許是1~2個小時。一般包括編寫和測試大量的代碼。
一個實驗作業,需要將近10個小時。


文中每段代碼示例都是由經過GCC編譯的C程序直接生成並在Linux系統上進行了測試,沒有任何人爲的改動。當然,你的系統上GCC的版本可能不同,或者根本就是另外一種編譯器,那麼可能生成不一樣的機器代碼,但是整體行爲表現應該是一樣的。所有的源程序代碼都可以從csapp.cs.cmu.edu上的CS:APP主頁上獲取。在本書中,源程序的文件名列在兩條水平線的右邊,水平線之間是格式化的代碼。比如,圖1中的程序能在code/intro/目錄下的hello.c文件中找到。當遇到這些示例程序時,我們鼓勵你在自己的系統上試着運行它們。

 

03
旁註



爲了避免本書體積過大、內容過多,我們添加了許多網絡旁註(Web aside),包括一些對本書主要內容的補充資料。本書中用CHAP:TOP這樣的標記形式來引用這些旁註,這裏CHAP是該章主題的縮寫編碼,而TOP是涉及的話題的縮寫編碼。例如,網絡旁註DATA:BOOL包含對第2章中數據表示裏面有關布爾代數內容的補充資料;而網絡旁註ARCH:VLOG包含的是用Verilog硬件描述語言進行處理器設計的資料,是對第4章中處理器設計部分的補充。所有的網絡旁註都可以從CS:APP的主頁上獲取。



旁註


什麼是旁註?


在整本書中,你將會遇到很多以這種形式出現的旁註。旁註是附加說明,能使你對當前討論的主題多一些瞭解。旁註可以有很多用處。一些是小的歷史故事。例如,C語言、Linux和Internet是從何而來的?有些旁註則是用來澄清學生們經常感到疑惑的問題。例如,高速緩存的行、組和塊有什麼區別?還有些旁註給出了一些現實世界的例子。例如,一個浮點錯誤怎麼毀掉了法國的一枚火箭,或是給出市面上出售的一個磁盤驅動器的幾何和運行參數。最後,還有一些旁註僅僅就是一些有趣的內容,例如,什麼是“hoinky”?


作者[美蘭德爾 E.布萊恩特(Randal E. Bryant

大衛 R. 奧哈拉倫(David R. O'Hallaron) 

譯者龔奕利、賀蓮



公衆號回覆『315參與抽獎活動!

3月15日10點開獎,祝您好運!


本文分享自微信公衆號 - Creator星球遊戲開發社區(creator-star)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章