從開源編譯器中移植代碼的正確姿式

    轉眼間已經到了大三下學期了,立刻就要實習了,最後一個學期我會好好珍惜的。爲了讓這個學期過的有格調,我打算每一件事情都作得有逼格一點。程序員

    開學第三週咱們學校就開始陸陸續續有實驗課了,作一個詞法分析器? 好嘞,勞資要用Sourceinsight把開源的GCC裏面的詞法分析代碼所有移植出來,就問你牛不牛批!!! 腦海中已經浮現出了助教對我異樣的眼光,哈哈,很少說了,盤它!!!!!!函數

    首先,進入gcc的官網,找到它最舊的一個版本(好像88年就有gcc了),可是我在官網上只能找到98年的。整個文件也才幾百KB,打開下載好的源碼,看了下就那麼十多個.c文件,應該難度不大,這回穩了(臉上逐漸露出那啥的微笑)。找到gcc.c中的main函數,由於這是整個程序的執行入口,看了眼代碼,有不少的宏外加簡單的英文註釋,一路shift+鼠標左鍵結合註釋來查找我要移植的詞法分析器在哪裏(由於.c源文件中沒有相似lexer.c之類的文件),已經記不清這是我第幾回進入查看函數定義了,彷彿是在遞歸同樣,有意思極了,反正個人臉都黑了。我倔強的堅持了一整個上午,心中慢慢的沒底了,我是那麼輕易就會放棄的人嗎? 固然不是! 接着我又換了一個接一個版本的編譯器,重複上述操做m次,每一次都「循環迭代」查看代碼n次,最終得出了一個微弱的解!!!優化

    下面我來講說這個來之不易的解吧,看論壇上有大神說Tiny C比較簡單,我嘗試了一下,的確可以看出點端倪的,大概又花了半天的時間,看懂了他的詞法分析器實現的大概思路,不過有點煞風景就是了。書上說好的編譯器分爲預處理階段、詞法分析、語法分析、語義分析、中間代碼生成以及優化、目標代碼生成以及優化、連接(重定位),在這個開源項目中怎麼不是這樣子的呢?tcc_preprocess函數根據英文翻譯過來的意思都可以理解的出是預處理嘛,可是他裏面包括了預處理器和詞法分析器,直接將兩個功能混合在一塊兒,達到了高耦合的水平,這樣讓我怎麼移植嘛(要知道從這種開源的工業級軟件中分離兩個耦合在一塊兒的功能難度不亞於和經期的女人吵架,不信你能夠試試,額。。。我說的是去吵架),不過tcc_compile、tcc_assemble、tcc_load_archive都還封裝的比較好,儘管tcc_compile包含了多個功能,可是它裏面調用的都是高內聚的函數。翻譯

    可是爲何這種開源編譯器的實現會跟教材上面有那麼大的差異呢,到底是教材過期了仍是編譯器的開發者們只是能力欠缺啊?其實我以爲都不是,緣由在於我腦殘了,非得標新立異,結果被碰的頭破血流。理論和實際有區別這是人之常情嘛,何況更重要的是咱們須要看到開源的工業級的編譯器它的功能不只僅是生成可執行文件,他的DEBUG功能照樣很強大,甚至可以幫咱們探測到潛在的內存泄漏等,能夠查看運行時的程序變量,程序調用棧等等(固然這些也許已經不屬於咱們所學的編譯器中應該有的功能了,而應該稱之爲IDE),所以他的設計者那樣實現確定是有他們所考慮到的深層次的緣由的;另外一方面,編譯原理這門課程講的主要是編譯器如何生成可執行文件,而不太關注編譯器的報錯機制,調試機制更是隻字未提,而單獨實現這一功能的編譯器估計沒人敢用吧(只要是名程序員都確定會要那啥了)。設計

    總結一下,這種工業級的軟件真的不是咱們隨隨便便就能擺弄、駕馭的了的,尤爲是開源的,普遍使用的軟件,開發他們的人、或者組織、或者許多組織不爲錢,只爲秀一波操做,這得有多大的勇氣和自信心啊。咱們所可以作的就是時刻保持一顆敬畏的心,若是把它比做一頭憤怒的公牛,那麼你就不要沒事找事,非得學着鬥牛士去鬥牛,當心輸的褲衩都沒有。當具備了必定的能力,足以駕馭它的時候,你會發現對代碼丟失了幾分趣味。。。調試

相關文章
相關標籤/搜索