如何向面試官講清楚程式編譯過程

2021-10-07 00:05:44 字數 1054 閱讀 8852

原始檔到產生效果是個很複雜的過程

大體步驟分為編譯和鏈結

你如果只是背,這四點千萬不要忽略

預處理(也稱預編譯,preprocessing)、編譯(compilation)、彙編(assembly)和鏈結(linking)。

首先是個大的過程,編譯。

編譯分為預編譯和編譯加彙編

預處理過程中,對源**檔案中的檔案包含(include)、預編譯語句(如巨集定義define等)進行分析。接著呼叫cc1進行編譯,這個階段根據輸入檔案生成以.i為字尾的目標檔案。彙編過程是針對組合語言的步驟,呼叫as進行工作,一般來講,.s為字尾的組合語言源**檔案和彙編、.s為字尾的組合語言檔案經過預編譯和彙編之後都生成以.o為字尾的目標檔案

為了更清晰可見,我們再gcc編譯下更清晰認識到

首先是預編譯

我們假設有這樣乙個檔案

getopt_exp.c

在進行預編譯後

我們將結果放在res.i檔案中

gcc -e getopt_exp.c -o res.i

我們來檢視行數發現

可見預編譯後是個龐大的**量

接下來就是編譯了

在編譯過程中會進行語法分析 詞義分析 語義分析 符號彙總

編譯階段將c語言轉換成組合語言 生成 .s檔案

我們可以看到這時候**量急劇減少,接下來就是我們所謂的彙編階段

彙編就是將彙編指令翻譯成二進位制指令形成符號表。 生成.o檔案

這個階段,生成目標**。

此過程生成elf格式的目標**

接下來就是鏈結過程,生成可執行**。鏈結分為兩種,一種是靜態鏈結,另外一種是動態鏈結。使用靜態鏈結的好處是,依賴的動態鏈結庫較少,對動態鏈結庫的版本不會很敏感,具有較好的相容性;缺點是生成的程式比較大。使用動態鏈結的好處是,生成的程式比較小,占用較少的記憶體。鏈結主要有個過程

1:合併段表,將對應段合併在一起

2:符號表的合併和無符號表的重定位。

完成鏈結後就能得到我們想要的結果啦。

HashMap怎麼和面試官講清楚?

集合中我們經常使用的就是hashmap,我們知道它的底層實現是hash桶外加鍊錶的方式來進行儲存資料的,但是底層又是如何進行具體實現的,我們可能真的說不清除。現在我們從原始碼層次上進行講解hashmap的原理 get方法的底層實現 先看下原始碼 我們傳入key的引數,底層呼叫的是getnode的方式...

程式設計師如何講清楚技術方案

最近在評審技術方案,和 review的時候,遇到剛入行的同學們,很多都講不清楚技術方案。具體表現是 上來不說需求,直接說演算法實現。台下一頭霧水,根本不知道設計方案是否合理。描述完需求後,又直接看 看表結構,沒有交代流程。比較簡單的演算法,描述的特別繞,讓人聽不懂。被別人指出後,覺得這東西這麼簡單,...

程式設計師如何講清楚技術方案

最近在評審技術方案,和 review的時候,遇到剛入行的同學們,很多都講不清楚技術方案。具體表現是 上來不說需求,直接說演算法實現。台下一頭霧水,根本不知道設計方案是否合理。描述完需求後,又直接看 看表結構,沒有交代流程。比較簡單的演算法,描述的特別繞,讓人聽不懂。被別人指出後,覺得這東西這麼簡單,...