我想了解編譯器,操作系統和計算機系統是如何在內部工作的。這是我目前的計劃:什麼是瞭解編譯器的最佳方式?
- 編寫一個簡單的虛擬機C,可以接受寫在它的機器語言輸入
- 編寫該虛擬機的一個彙編(我的規格定製的語言)。
- 爲機器編寫基本類似語言的非常基本的編譯器。
- 由包括屏幕(我想我將使用SDL),和經由視頻存儲器到該屏幕的界面擴展虛擬機的交互性。我還可以添加鼠標/鍵盤功能。
任何提示或建議將是很好的。先謝謝你!
我想了解編譯器,操作系統和計算機系統是如何在內部工作的。這是我目前的計劃:什麼是瞭解編譯器的最佳方式?
任何提示或建議將是很好的。先謝謝你!
我的第一個建議是讀一本關於這個主題的高水平書。也就是說,我假設你還沒有這樣做,並正在計劃與一些在線教程或其他東西一起工作。至少對我來說,我傾向於想要先把這個東西放在頭上,但是我很快就感覺到了,然後就放棄了這個項目。確保我在開始之前對項目有一個很好的高層次理解,這對我有很大的幫助。
我可能會推薦的一個系列是Write Great Code書。由於我沒有閱讀全部內容,所以我不能保證整個系列,但是我的辦公室讓他們在工作中,並且在我進入某個領域之前,我已經多次使用它們,以便很好地掌握這個主題。例如,一個可能與您的計劃直接相關的示例,我需要了解GCC編譯器如何組織它生成的ELF二進制文件,每個部分是什麼以及存儲的內容。 (這是一個嵌入式系統,我們正在擴大我們的內存,所以我不得不重新組織一些東西...)
你說「沒有太難」......在我看來,我認爲你的步驟已經很難特別是如果您的最終目標是瞭解編譯器和操作系統。至少現在,我會跳過整個虛擬機。事實上,處理器非常簡單,基於你已經知道它只是處理'機器語言'的事實,你可能已經有了一個很好的開始。
我會從第3步開始,只編寫自己的編譯器。我在大學裏參加了一個編譯器課程,到本學期結束時,我使用LEX and YACC從頭開始構建了一個可用的Pascal編譯器。這非常有啓發性。您可能還會看到Bison與yacc一起用於此類事情。我從來沒有用過它。另外,在空閒時間簡單地做一些小練習,比如弄清楚如何操作GCC編譯hello world進入小於X的字節數,將會教會你比你想象的東西更有效。 (順便說一句,網上有很多這樣的例子)
玩得開心!
你已經知道了多少編程?
編寫Forth解釋是一個很好的鍛鍊。它比較簡單,語言和語義已經很好定義,所以你不需要從頭開始設計自己的系統。 FORTH通常也有一個編譯器(儘管它不像C編譯器),並且可能內置了彙編器,所以你也可以調查這些。它將爲您提供管理內存,處理指針,解析引用等的心理工具。
綜觀現有的簡單編譯器將是有益也。一旦你已經內化了編譯器所做的事情 - 將一組符號翻譯成另一個符號 - 那麼你可能想開始查看解析語法和相關主題。這裏有很多可用的信息,一次只用一點,否則你會很容易被淹沒。
這是一個很好的目標列表。有些人上了大學4年才得知這一點。 我不知道你的背景,但我可能會認爲你已經完成了一些基本的編程(BASIC編程?)和彙編語言。如果你還沒有,那是一個開始的地方。 學習一些有關語法和正則表達式的知識,然後用它開發一個簡單語言部分語言的解析器和解釋器,例如Pascal,這將是一種學習前端的方法。然後繼續並添加生成程序集的代碼...後端。
謝謝。我已經完成了lexing/parsing ..我現在面臨的挑戰是構建AST並執行代碼生成(我並不是真的想學習x86彙編,所以我決定嘗試用我自己的習慣編寫自己的虛擬機我會很熟悉的說明)。 – ouiliame
你比我當時意識到的要遠!是的,我記得代碼生成是最困難的,因爲明顯的原因比我知道的x86彙編很少,但幸運的是,你只需要知道一部分指令。 – Lncn