編譯器粗略分為詞法分析蔑穴,語法分析忠寻,類型檢查,中間代碼生成存和,代碼優(yōu)化奕剃,目標(biāo)代碼生成衷旅,目標(biāo)代碼優(yōu)化。把中間代碼生成及之前階段劃分問編譯器的前端纵朋,那么后端與前端是獨(dú)立的柿顶。后端只需要一種中間代碼表示,可以是三地址代碼或四元式等操软,而這些都與前端生成的方式無關(guān)嘁锯。按照這個(gè)分類,自己動(dòng)手編寫編譯器聂薪,可以不必從頭開始了猪钮。
試想一下,是否可以為不同的高級語言單獨(dú)寫一個(gè)前端胆建,然后為不同的處理器架構(gòu)單獨(dú)寫一個(gè)后端呢?
GCC基本上也是這么實(shí)現(xiàn)的肘交,不過不要誤會(huì)笆载,并沒有一個(gè)統(tǒng)一的gcc執(zhí)行程序能夠處理如此多的前端和后端,每個(gè)語言的編譯器都是一個(gè)獨(dú)立的程序(如C語言的編譯器是gcc涯呻,C++的編譯器是g++)凉驻,而不同的后端也要對應(yīng)不同的可執(zhí)行程序。你可以下載單獨(dú)的一份GCC源代碼复罐,通過不同的configure來生成自己需要的編譯器涝登。而且,編譯器的實(shí)現(xiàn)也比上圖要復(fù)雜的多效诅,前端的主要功能是產(chǎn)生一個(gè)可供后端處理的語法樹胀滚,而語法樹結(jié)構(gòu)實(shí)際上很難與處理器架構(gòu)脫鉤,這些都是編譯器應(yīng)用中需要解決的問題乱投。
GCC強(qiáng)大的真正原因是什么咽笼?是因?yàn)樗С至吮姸嗟那岸撕秃蠖藛幔窟@些都不過是一個(gè)表象而已戚炫。GCC是一款真正自由的編譯器剑刑,我們可以隨時(shí)把代碼拿過來修改以實(shí)現(xiàn)自己需要的功能。如果你的硬件平臺增加了一些指令双肤,而普通的編譯器并不能產(chǎn)生這些指令怎么辦施掏?在GCC后端添加這些指令吧。如果你覺得C語言用的不太順手茅糜,想給它添加一些功能怎么辦七芭?修改GCC的前端吧。因?yàn)橛辛薌CC限匣,我們才擁有這些自由抖苦,以及迅速實(shí)現(xiàn)自己想法的能力毁菱,而這些才是GCC強(qiáng)大背后的基礎(chǔ)。
GCC編譯的前端將不同的高級編程語言經(jīng)過詞法分析锌历、語法分析轉(zhuǎn)化為與前端語言無關(guān)的統(tǒng)一的中間表示贮庞。有了與前端無關(guān)的中間表示,GCC的前端將不同的高級編程語言轉(zhuǎn)換成這種中間表示究西,這就是GCC處理器支持多種編程語言的根本原因窗慎。
參考文獻(xiàn)
1、LLVM和Clang背后的故事
2卤材、利用FLEX & BISON 快速實(shí)現(xiàn)簡單的C 語言編譯器前端
3遮斥、簡述 LLVM 與 Clang 及其關(guān)系
4、編譯器(GNU & GCC & clang & llvm)
5扇丛、gcc編譯器---前端和后端