iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0

一個程式碼在變成執行檔之前大致上會經過預處理、編譯、組譯、鏈結。

預處理會將巨集展開,通常是行首使用到 # 的指令,例如 # include ,將所要使用到的函數從標頭檔中擷取過來並放到引入的位置,又或是使用自定義巨集將程式碼進行取代。

編譯時將有許多動作,在前段處理有字彙分析、語法分析、語意分析。詞彙分析先將程式碼中的字詞一個一個切割出來,語法分析將剛剛分割出來的字詞依照語法規則組成語法樹,若有錯誤便會噴出錯誤,語意分析是也是依照語言規則進行分析,但會去參考前後文關係,抓出語意上的錯誤使用。

中段處理會將前段處理的東西轉成中間語言後進行最佳化,選擇使用中間語言而不是直接從程式碼到執行檔的原因是只要換了一個語言或平台便沒辦法通用,因為不同架構的處理器會有不同的指令集架構,每條指令所對應到的機械碼也不一定相同。在來是最佳化,因為我們寫的程式碼往往容易去使用非常冗餘的程式碼片段,尤其是像我這樣的資工學生,常常選擇有達到作業要求就好,因此在一些迴圈或判斷可以進行不同程度的優化,例如使用臨時的變數去取代掉部分的運算,使得運算簡化成如 c = a+b 的形式,以提高執行效率。

最後的後端處理便是將中間語言轉成機械碼,然後再針對平台的特性再優化一次,一個執行檔便完成了。

若是不想要編譯器優化我們的程式碼的話可以在 gcc 編譯時添加 -O 參數,要求編譯器不要優化或優化太多。

中間語言也使用在 Google 翻譯,目前的 Google 翻譯使用神經網路將輸入語言轉成中間語言,在經由中間語言轉成所要的目標語言,例如中文轉英文,便會先將中文轉成中間語言,在將中間語言轉成英文,若我想中文轉法文,只需要將中間語言的輸出換成法文就好,而不需要同時維護中文轉英文的神經網路與中文轉法文的神經網路,尤其全球語言非常多,不可能將每個語言都做出一對一的神經網路,因此使用中間語言來做為媒介。

參考連結
程式編譯過程
你所不知道的 C 語言-編譯器與最佳化原理 by 宅色夫 jserv
How A Compiler Works : GNU Toolchain
知乎-谷歌翻译原理是什么,从语言A到B,中间是否要翻译成中介语言C(如英语)?


上一篇
Day11 虛擬記憶體
系列文
絕對花心的30天組合語言13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言