深入理解計算機筆記1

2021-06-08 01:21:24 字數 1575 閱讀 9784

第一章

本書可以使你成為鳳毛麟角的權威程式設計師。

1系統中的所有資訊都是由一串二進位制表示的,區分不同資料物件的唯一方法是我們讀到這些資料物件時的上下文。比如10000110,可以是乙個無符號數,也可以是乙個有符號數,還可以是乙個ascii碼,還可能是一條指令。

2編譯系統包括了預處理器、編譯器、彙編器和鏈結器。

3編譯器的工作階段:

詞法分析:識別出乙個個的單詞,符號。即檢查單詞是否都是合法的

語法分析:由單詞構成的語句本身是否合法。如a=b+c;合法

a*+-=b+-c; 不合法

語義分析:分析語句到底是什麼意思,如檢查變數是否定義,型別是否正確等等。

中間**生成:

執行時儲存空間組織;

以上是編譯前端

優化:目標**生成:將經優化後的中間**變換為特定機器上的低階語言

現代多數實用的編譯程式產生的目標**都是一種可重定位的指令**。

4乙個關於先有編譯器還是先有os的看似不可能解決的問題,的答案

開始階段先有乙個完全用彙編寫的簡單os,(thompsonunics)

後來有人(ritchie)發明了c,他用組合語言寫了乙個簡易的編譯器,該簡易編譯器能將c編譯為彙編

然後他用c語言實現編譯器的功能,用那個簡易編譯器進行編譯,這樣就形成了具有強大功能的編譯器。

os本身與普通**並沒有區別,它的很多功能也開始用c寫,寫完以後被裝著簡單os的並且有編譯器的機器 編譯為實用的os(unix)。

第二章核心是數字的隱式型別轉換 如:double i = 0.4;  int j =1; j+=i;  

結果為j =1,並不會報錯。  

出了這種問題,假如你沒意識到隱式型別轉換,能讓你想一頭撞死。

1機器存在大小端問題,並且支援的指令系統也可能不同,指令的編碼也可能不同,所以二進位制**很少能在不同的機器和os之間移植。(這裡的不同機器指不同型別的,而不是hp和lenovo的區別)。

2溢位問題

inti = 2147483647;

intj = 6;

intk = i+j;

intm = k-i;

system.out

.println(i);

system.out

.println(k);

system.out

.println(m);

2147483647

-2147483643 6

雖然發生了溢位,但結果

m是正確的。 3

轉換時發生的問題

4無符號數和補碼的運算都滿足整數運算的許多其他屬性,包括結合律、交換律和分配律。這就允許編譯器做出許多優化。如用(x<<3)-x 代替 7*x。

但浮點數一般不遵循這些屬性。

深入理解計算機系統 筆記1

主頁上的內容非常豐富,超乎你的想象,等你去探索。好吧,我 了,你始終對書上的內容持懷疑態度來閱讀,對於知識的吸收的本身來說非常有意。2010新版新增內容 本書的第一版於2003年出版。考慮到計算機技術發展如此迅速,這本書的內容還算是保持得令人吃驚的好。事實證明intel x86的機器上執行類unix...

深入理解計算機系統1

hello.c include int main 源程式 原始檔 實際上就是乙個由0和1組成的位 又成位元bit 序列,8個位被組組成一組,稱為位元組。每個位元組表示程式中的某些文字字元 大部分的現代計算機系統都使用ascii標準來表示文字字元 hello.c 預處理器 cpp hello.i 修改...

計算機深入理解 一

1.1 匯流排 匯流排是用來在計算機各個部件中傳遞資料的快遞員,這個快遞員攜帶的資料是有限制的通常是4個位元組32位,8個位元組64位。1.2 io 裝置 io 裝置是計算機與外界資料交換的快遞員。包括四個功能不一的快遞員 1 作為使用者輸入的鍵盤和滑鼠 2 作為使用者輸出的顯示器 3 用來長期儲存...