5

主要作爲一種學習練習,我從頭開始編寫虛擬機,彙編程序和編譯器,這取決於沒有外部工具。將語法樹轉換爲程序集的資源?

我相信我對虛擬機和彙編程序的工作原理以及編譯器的某些部分有一個體面的概念性理解。

下面是我想知道的: 在編譯器中,假設我已將源代碼轉換爲語法樹。我經歷了什麼過程然後將此語法樹轉換爲程序集?

(假設一些簡單的語言結構,如if和while。我正在尋找一個最小的和簡單的解釋一下。)

我是基於現有的工具,複雜的解決方案不是特別感興趣,或者解決方案。相反,我希望按照1頁的順序進行說明,對從語法樹到組裝的背後思路進行廣泛的描述。

任何人都知道這樣的資源?

謝謝:)

+0

當然。任何編譯器書籍第1章的第2頁和第3頁。但我認爲你希望這是你所需要的,而不是一個長遠的目標。問題在於,將程序語言轉換爲*好的機器代碼(即使是虛擬機)也需要大量的機器,而這兩個頁面將會對所需內容有一個模糊的理解,因此您無法構建任何一種明智的代碼生成器都不需要讀取其他200頁的編譯器書籍。 – 2011-02-11 17:39:37

回答

6

一個編譯器問題的強制性響應讀龍書(編譯原理,技術和工具)。當你說你已經將源代碼轉換成語法樹時,你究竟是什麼意思?通常解析的第一階段是創建一個抽象語法樹(AST)。下一步通常要做歸屬地。屬性是AST中節點的屬性,並不一定與源語言有關,但對代碼生成至關重要。通常在這裏完成某種形式的類型檢查來確定內存大小要求,而在面向對象的語言中,將調用什麼函數。例如,如果你的源代碼是obj1 = obj2 + obj3,那麼在確定obj2的類型之前,你真的不知道該怎麼做加號。

所以要回答你的問題。 1)將源代碼解析到AST。 2)歸因於AST。 3)生成中間代碼(想象你稱爲彙編)。

龍書第5章和第6章詳細介紹了這一點。真正棘手的部分是弄清楚代碼生成需要哪些屬性。另外,if語句還有一些棘手的問題。例如,如果if條件失敗,你知道你需要跳過一些代碼,但至少在最初時,你不知道有多遠。回補丁是解決這個問題的方法之一。