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),才造就了我們現在各種狂拽酷炫的程序。
。圖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的就寫到這里吧。下次再繼續續篇吧。
(其實上述的絕大多數內容都是來自書中的 ( ̄△ ̄;),水分很重,我就是匹划水狼,輕噴。(ㆀ˘・з・˘)。 另外,有哪兒不妥不對勁的歡迎指出。新手光環求罩求罩 ╭(′▽`)╭(′▽`)╯)