能寫出工業水準的作業系統和編譯器,絕對是大牛。而寫出來的作業系統和編譯器能被工業界普遍接受,則需要命運和機遇的垂青。大部分的程式設計師注定是成為高階或低階的「碼農」,成為軟體生產流水線上的一顆螺絲釘。在生活和工作的壓力面前,我們往往習慣於不做那麼深入的思考,只要**能完成需求就可以,至於「為什麼」的問題往往有意或無意地,甚至被迫去忽略。就如兒時的夢想,只有在夜深人靜時,想著年華已去,看著歲月無情,捧著那泛黃的舊**時,才發現一直以來自己內心不常去的角落中始終留著那個夢想。
如果我們要分析的是開源的相對完整的c編譯器源**,而不是乙個教學用的toy,並且希望源**的行數在一萬行左右,那google給我們的答案中就有這麼兩個,乙個是lcc編譯器,乙個是ucc編譯器。如果我們還希望**結構清晰,且函式名等能望文生義,能直接與c語言的文法吻合,不必去猜測這個函式名是哪幾個單詞的縮寫,那ucc會更勝一籌。當然,ucc的原作者或多或少地受到lcc編譯器的影響,但很遺憾,ucc的原作者沒有去寫本關於ucc的書,他其實是最合適的人選。於是,ucc就如一顆被遺落在角落的珍珠,漸漸地蒙上了塵埃。一萬行左右的**量,ucc就能實現乙個基本完整的c編譯器,雖然後端只面向32位的x86平台。ucc沒有如lcc那樣地可變目標,既可生成mips,也可生成sparc和x86**。雖然偶有bug,縱然碧玉有瑕,即便不夠知名,但只要把ucc這只麻雀解剖清楚,我們已能搞清c編譯器是如何工作的,我們已能站在編譯器實現的角度來品味那經40餘年而愈久愈香的c語言。c和c++語言的相關書籍中,最最經典的如《the c programminglanguage》、《c++ primer》和《the c++ programming language》,之所以經典,很大原因是這些作者本身就是c和c++編譯器的最早期的實現者。
斗膽越俎代庖去寫本關於ucc編譯器的書,希望這本書能幫有興趣讀它的人基本搞明白c編譯器,更好地用好c語言這個簡潔有力的利器。當然,正如一位在編譯一線戰鬥的朋友所言,「ucc和lcc還停留在編譯前端和後端的初級階段」,編譯器的優化是現在工業界更加關注的焦點,ucc和lcc在後端優化上都做得不夠。不過,站在廣大c程式設計師的角度來看,c編譯器的前端才是c編譯器與程式設計師的介面,理解了c編譯器前端的實現,就能更深刻地理解c的語法和語義;而c編譯器後端,其實是c編譯器與cpu的介面,後端的優化為的是在保持語義的前提下,生成速度更快的機器**。我不是什麼牛人,只希望這本書能幫有心人開啟一扇看得見、夠得著的編譯大門,能讓c程式設計師能站在編譯器實現的角度來看看自己朝夕相伴的c。全國每年有十萬以上的計算機相關專業學生畢業,《編譯原理》在大多數畢業生中留下的印象就是很難,很理論化。本書的目的是想把《編譯原理》具體化,所謂「傷其十指,不如斷其一指」。如果你熟悉c語言,並且有基本的資料結構的知識,那就讓我們一起開啟c編譯器剖析這趟旅程,編譯原理和組合語言相關的知識我們邊走邊聊,期盼這趟行程結束後,不論你的下一站去何方,你都能說不虛此行。
C編譯器剖析 2 2 詞法分析
2.2 詞法分析 目錄ucc ucl下,與詞法分析相關的c檔案主要有input.c和lex.c,input.c用於從外存讀入預處理後的檔案,其主要的函式如圖2.2.1所示。在ucc驅動的 中,已經預定義了巨集 ucc,所以第39行的條件成立,函式readsourcefile 會使用c標準庫的io函式...
c 編譯器編譯過程
編譯過程 編譯過程分為四步 預處理 編譯 彙編 連線 1.預處理 預處理主要處理原始檔中的 include define 等預處理等命令 預處理主要完成的工作有 參考 程式設計師的自我修養 1 刪除 define,展開巨集 2 處理條件編譯指令。預處理程式先判斷條件,再根據條件修改源 3 刪除注釋 ...
C 編譯器大全
dev c 優點 功能簡潔 noip官方編譯器 缺點 功能並不完善 不適合商業開發 面向人群 c 初學者 dev c 現在已經更名為smart c 但noip不使用該編譯器 visual c 或visual mingw 優點 1.與windows緊密結合 2.強大的類庫支援和類改造能力 3.擁有高效...