1. 程式人生 > >《深入理解計算機系統》——讀書筆記(一)

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

img 可執行 即將 簡單的 world std 加載 完整 .exe

  這本書從一個簡單的C語言的HelloWorld程序講起...

技術分享圖片

  這是這個小程序的生命周期的一個部分:

技術分享圖片

  HellOWorld程序,從被創建(文本格式),到被執行(在屏幕上打印出來)。

  其間,有個翻譯過程,即將高級程序語言(如這裏的HelloWorld程序),翻譯成計算機能理解的二進制語言。

  這個翻譯過程,分為四個階段。

  • 預處理階段:預處理器根據以字符“#”開頭的命令,修改原始的C程序(修改後,仍然是C程序)。比如上面HelloWorld程序中的第一行中的#include<stdio.h>,這行語句告訴預處理器,讓它讀取 stdio.h 這個文件(實際上,這個文件即庫函數,它提供了你所需要的函數和一些變量的聲明),並把它插到HelloWorld程序的文本中。最後,得到一個在原有語句的基礎上,增加了一些語句的C程序(hello.i)。

  • 編譯階段:將高級程序語言翻譯成匯編語言。一般說來,不同的高級程序語言(如C和Java),在經過編譯後,得到的是一樣的一樣的匯編語言文件(hello.s)。

  • 匯編階段:將匯編語言翻譯成機器語言(即只有0和1的二進制語言),此時,得到的是二進制文件(hello.o)
    Plus:Java的字節碼文件不是二進制文件。

  • 鏈接階段:可以看到,HelloWorld程序調用了printf()函數,該函數的函數原型(類似於函數頭聲明)在 stdio.h 文件中。這個函數的完整體存在於一個名為 printf.o 的文件中,而這個文件必須以某種方式合並到我們的hello.o 程序中。鏈接器的任務就是負責處理這種合並。結果得到 hello.exe文件,它是一個可執行目標文件(它可以被加載到計算機內存中,由系統執行)

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