在讀《深入理解計(jì)算機(jī)系統(tǒng)》時纽什,自己模糊或者不清楚的點(diǎn),內(nèi)容全部來自書中倍宾,理解有誤歡迎指出旅急。
#include <stdio.h>
int main()
{
printf("hello,world\n");
return 0;
}
以上是我們一個最簡單的 hello.c , 然而為了在系統(tǒng)上運(yùn)行 hello.c 程序,每條 C 語句都必須被其他程序轉(zhuǎn)化為一系列的低級機(jī)器語言指令扰柠。然后這些指令按照一種稱為可執(zhí)行目標(biāo)程序的格式打好包粉铐,并以二進(jìn)制磁盤文件的形式存放起來。目標(biāo)也稱為可執(zhí)行目標(biāo)文件卤档。
這個翻譯過程可以分為四個階段蝙泼,預(yù)處理,編譯劝枣,匯編汤踏,鏈接 四個階段,也就構(gòu)成了編譯系統(tǒng)舔腾。
預(yù)處理階段: 預(yù)處理器(cpp)根據(jù)字符 # 開頭的命令溪胶,修改原始的 C 程序,得到另一個 C 程序稳诚,通常是 .i 為文件擴(kuò)展名哗脖。
編譯階段:編譯器將 .i 文件翻譯成 .s 的文本文件。可以理解為翻譯成低級機(jī)器語言才避,讓其成各種高級語言可以通用的輸出語言橱夭。
匯編階段:匯編器將 .s 翻譯成機(jī)器語言指令,把這些指令打包成一種叫可重定位目標(biāo)程序的格式桑逝,并將結(jié)果保存在目標(biāo)文件 .o 中棘劣。
鏈接階段:鏈接器將各種預(yù)編譯的好的目標(biāo)文件合并起來(例如上述執(zhí)行 printf 函數(shù)就存在于一個名為 printf.o 的單獨(dú)預(yù)編譯好的目標(biāo)文件中),得到一個可執(zhí)行目標(biāo)文件肢娘,可以被加載到內(nèi)存中呈础,由系統(tǒng)執(zhí)行。
單單想預(yù)處理階段(當(dāng)然其他三個階段理解還不夠咯橱健,哈哈)而钞,對于我們 iOS 平常開發(fā)來說,此處一下子就可以到聯(lián)想之前我們 iOS 中 的 pch 文件拘荡,以及預(yù)處理語言對源文件進(jìn)行轉(zhuǎn)換時的處理臼节。
- 頭文件引用
#import <>
- 條件編譯
#if
#endif
- 宏
#define ...
- pragma
#pragma mark -
此處也可以再次回顧,為什么要少用宏的原因啦珊皿!
總之网缝,了解編譯系統(tǒng)是如何工作是大有益處的,慢慢挖掘吧蟋定!