淺談從原始碼檔案到二進位制可執行檔案的過程

小弟季義欽發表於2012-11-09

=== .c ===

預處理 -》.c (原始檔)

編譯-》.s/asm (彙編程式)

彙編-》.o/obj 目標程式(二進位制檔案)

連結-》.exe可執行程式 (二進位制檔案)

(1) 為什麼要生成彙編,而不是直接從原始檔編譯成機器指令(二進位制程式碼)?

首先,組合語言作為機器指令的助記符,除錯以及優化起來都會比較方便;

其次,彙編到機器指令的過程是由硬體完成的,是一個自動過程,讓硬體來完成效率較高;

最後,如果要將原始檔直接轉換成機器指令,那麼編譯器編寫者就必須要非常數量機器碼,這是一個比較困難且低效的過程。

(2) 詳細解釋從原始檔經過編譯成為組合語言的過程?

詞法分析(Token),語法分析(syntax tree),語義分析,優化,程式碼生成。

=== .java ===

java編譯器將原始檔編譯成.class檔案(平臺無關)

JVM的Class Loader負責將class檔案載入到JVM中

利用Windows/Linux下的位元組碼解釋程式,將class檔案解釋成機器指令(機器指令是CPU能直接識別並執行的指令,它的表現形式是二進位制編碼。機器指令通常由操作碼運算元兩部分組成)。沒有轉換成組合語言的過程

(1) 為什麼引入class檔案?

class檔案徑打破了C或者C++等語言所遵循的傳統,使用這些傳統語言寫的程式通常首先被編譯,然後被連結成單獨的、專門支援特定硬體平臺和作業系統的二進位制檔案。通常情況下,一個平臺上的二進位制可執行檔案不能在其他平臺上工作。而Java class檔案是可以執行在任何支援java虛擬機器的硬體平臺和作業系統上的二進位制檔案。

相關文章