讀書筆記——《深入理解計算機系統》


HelloWorld其實並不簡單

這周開始拜讀這本在豆瓣被賜予9.8分的聖書,‘CMU’的計算機導論教材。好的文章內容都會讓人眼前一新,豁然開朗的感覺。這書給我的就是這種感覺。剛剛看完第一章節,就從書中所引出的”Hello World“講起吧

 

說起Hello World,對於任何一個programmer來說簡直太熟悉不過了好吧,甚至在我求學期間還有一個朋友跟我吹噓,學語言(指的是'計算機語言'),會寫”Hello World”就基本上搞懂了這語言(((╯‵□′)╯︵┻━┻ 那還要程序員干個球啊)。當然這只是個玩笑話而已。不過,Hello World其實也不是那么簡單的喲 = ̄ω ̄=

#include <stdio.h>
int main(){ printf(“Hello Wrold”); return 0; }

 

HelloWorld的出生:

計算機的運行其實就是所謂的0, 1操作,只是人們定義了0,1組合排列,給定其指定的意義(如圖1),才造就了我們現在各種狂拽酷炫的程序。

ASCII表圖1.ASCII表

HelloWorld也是一個程序,由程序員通過編輯器一個個的碼上去的,其中就是由0,1組成的,然后就生成 了這樣一個存儲這些0,1文件的源程序(源文件),HelloWorld.c 文件。

生成好文件后,我們就需要運行它,這里的話是要將這個.c文件編譯起來。那么問題來了,編譯是什么呢?

 

HelloWorld的編譯

編譯,說簡單點,就是把人類語言轉成機器語言,讓電腦能讀懂,再執行你想要的操作(這里用的翻譯官,就是編譯器是gcc)。這里以.C文件的編譯來走一下流程:

 圖2. 編譯流程

預處理階段:在C語言的語法中,就是將#include所指向的一些文件,包那些寫入到程序文本中。(我感覺有點像是c++的inline function),然后形成一個.i為后綴的文件;

編譯階段:這就是講.i后綴的所有內容翻譯成匯編語言,是一種低級語言,如圖3所示。這是一個復雜度為O(n^2)的玩意,記得以前學計算機組成原理的時候是用MIPS來講匯編,也是看的一愣一愣的。早也忘得七七八八了。

匯編語言圖3.匯編語言

匯編階段:接下來就是匯編器嶄露頭角的時候了,他會把.s匯編碼轉成機器指令,就是我們的cpu,計算機的大腦能看懂的東西。將結果以.o后綴文件名保存下來。

鏈接階段:由於這個HelloWorld引用了標准C庫 “stdio.h”,並調用了其中的方法, "printf"。這個類庫一定編譯好了這個 "printf"的方法並生成了.o文件了(就是經過了前三個階段),然后我們需要調用它,就以鏈接的形式,將2者連接起來。從而這個程序就可以直接執行了。這個生成的文件就叫做可執行文件。可執行文件其實可以理解成你要打開一個應用的入口點。

 

 HelloWorld的執行:

到這一步的話可執行文件都出來,那么接下里的就是交由硬件去處理啦。這里主要想說的一點就是各個硬件之間的溝通(如圖4)。

那條長長的Bus(es)就是連同硬件的玩意(總線),所有設備所產生的信號(0,1)都會通過總線到達目的地。

就比如我們現在HelloWorld。可能現在等待着輸入端(常見的是鼠標或鍵盤)啟動這個程序,然后發送信號,通過總線找到CPU,然后CPU再去硬盤(或者內存)找,找到后並處理,最后交由給顯示屏顯示出來。

圖4

 


Ending:

關於HelloWorld的就寫到這里吧。下次再繼續續篇吧。

(其實上述的絕大多數內容都是來自書中的 ( ̄△ ̄;),水分很重,我就是匹划水狼,輕噴。(ㆀ˘・з・˘)。 另外,有哪兒不妥不對勁的歡迎指出。新手光環求罩求罩 ╭(′▽`)╭(′▽`)╯)

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM