僅參考 C99 Standard 可以實現一個完整的 C99 編譯器嗎?

看 C99 Standard 的時候感覺標準文檔給的信息不算很詳細,那麼僅僅參考 C99 Standard 實現她的編譯器可行嗎?


題主的原問題:

僅參考 C99 Standard 可以實現一個完整的 C99 編譯器嗎?

看 C99 Standard 的時候感覺標準文檔給的信息不算很詳細,那麼僅僅參考 C99 Standard 實現她的編譯器可行嗎?

硬憋的話也能憋出點什麼來吧…實用不實用是另一回事。

一個C99編譯器,輸入是C99源代碼,輸出是目標代碼,編譯器是這輸入與輸出之間的橋樑。

C語言的設計初衷就是作為一種比較底層、接近目標機器的功能的,但比彙編要稍微多一點抽象的這麼一種語言。很自然的,要實現一個「C99編譯器」,不但要確切了解C99語言規範所規定的語法和語義,還得知道目標平台有什麼功能(例如ISA)與規範(例如ABI),而C99與目標平台的功能之間要如何映射。

如果說以x86為目標平台,就得知道x86的機器碼或彙編的特性;以ARM、PowerPC、SPARC、MIPS之類為目標平台也是同理。

而不同編譯器/操作系統在不同硬體上用的ABI也不盡相同,這也是很重要的需要了解的地方。

C99規範中特意寫得模糊的地方,例如implementation-defined的地方,編譯器作者可以根據目標平台的特徵而自行選擇實現方式;而對undefined-behavior更加可以隨便搞…當然隨便搞也還是遵循基本法比較好。

那麼只看C99語言規範,不去看任何實際硬體的ISA描述,還能寫出「C99編譯器」么?還是有救的——自己定義一個目標平台就好了。

很多時候這就意味著自己設計並實現一個虛擬機,把C99源碼編譯到這個虛擬機上,然後虛擬機如何實現是後話。

把C語言(或其子集)編譯到一個虛擬的目標平台上,可以參考C4和《Compiler Design in C》這兩個例子。

  • 關於C4:有哪些關於c4 - C in four function 編譯器的文章? - RednaxelaFX 的回答

    • C4用C語言實現了C語言的一個非常小的子集的編譯器,目標平台是自定義的一個簡單的「累加器機器」(accumulator machine),也可以看作一個帶棧頂緩存的棧機
    • 這個虛擬的目標機器有解釋器實現,也有JIT編譯到x86機器碼的實現。其中解釋器實現不需要知道任何真實硬體+操作系統的ISA / ABI細節。
  • 關於《Compiler Design in C》:Compiler Design in C - Allen Holub

    • 這是一本老書,而作者慷慨的把它全文以及配套代碼免費放在了自己的網站上供大家閱讀。
    • 它用C語言實現,把ANSI C的一個子集編譯到一個自定義的目標平台上,其目標代碼叫做「C-code」,是用一組C語言的宏構成的虛擬寄存器機。實現虛擬機的那套C的宏並不需要知道多少真實硬體+操作系統的細節,而是藉助C的語義來實現功能。
    • 生成的C-code可以進一步用別的C編譯器編譯到真實硬體上的目標代碼。


推薦閱讀:

如何產生正態分布的隨機數?
NOP指令會打斷CPU流水線嗎?
為什麼感覺好多計算機大神都很喜歡日漫甚至有好多女裝大佬?
CPU的瞬時功耗是由什麼決定的?
學校開設關於編程的課程明顯不足,我需要補充哪些課程或者自學哪些姿勢技能來提高自己的編程水平?

TAG:編程 | C編程語言 | 計算機科學 | 編譯器 | 計算機語言 |