你非常誤會編譯器的兩個主要任務是「編寫解析器」和「將輸出寫入彙編器」。最有趣的事情發生在中間,驗證過程(類型檢查),分析傳遞(各種信息收集以進一步優化)和轉換過程(從高級語言到低級語言,直到某個階段完成某些事情之後看起來像大會)。
即使您設計了一個簡單的編譯器(您不需要首次與GCC競爭),解析器也不應該成爲「主要任務」。實際上,解析器現在被認爲是一個相當常見的問題,至少如果你的語法比較傳統(我不是在談論瘋狂的語法擴展性問題);有解析器生成器工作得相當好,你也可以使用手工解析器來獲得更大的靈活性,但總而言之,它絕對不應該成爲問題。
編寫一個輸出C或任何其他語言的編譯器是非常明智的。許多不同的編譯器(例如Haskell和各種Scheme)都使用C作爲其目標語言。但通常(對於有趣的語言)有很多預先工作,將編程語言的抽象編譯成更低級別的可以轉換爲C的東西。
現在還有其他方法從低級彙編部分抽象出你自己:你可以定位一個虛擬機(JVM,CLR,Erlang的虛擬機,Parrot ...)或者生成LLVM字節碼等。
你在你的問題中提到了ML。使用代數數據類型(即SML,OCaml,Haskell等)的靜態類型函數語言是編寫代碼的非常好的語言;最合適的,我會聲稱。您可能對本書Modern Compiler Implementation in ML感興趣(有C和Java的變體,但ML書是最好的)。它在某些地方有點專業,但對編譯技術有一個很好的總體看法是一個不錯的選擇。當然,如果你想成爲編譯大師,你還應該使用其他參考資料,例如Dragon Book,以及可能的參考資料來編譯類似於你的語言(我的意思是編譯一個純粹的函數式語言可能與編譯一個命令式的過程式語言非常不同)。
單獨的解析位是一項艱鉅的任務。然後,解析器的結果通常通過各種高級算法發送。並且代碼生成也可能非常複雜(取決於您從之前的傳遞中獲得的內容 - 即使它已經死了 - 簡單的SSA,您仍然有寄存器分配)。編譯器是您定期使用的一些最複雜的應用程序。 – delnan 2011-04-22 13:42:11
我不明白爲什麼這是「不是真正的問題」?這不是一個非常有趣的問題,並且正在接近成爲一個「無知」的問題,但是,那又如何呢? – 2011-04-26 20:12:44
謝謝你支持我的問題,雖然它有點愚蠢! – Nishant 2011-04-27 06:29:48