如果想要寫一個C++或者面向對象的語言的一個簡單的編譯器,應該學習哪些領域的知識?
本人想自己學習寫寫面向對象的編譯器,除了需要學習下編譯原理,還有需要看點什麼資料?
如果你的語言想有垃圾收集器的話,那你得看很多附加的。否則,做出一個能用但是各方面指標巨爛的編譯器和虛擬機其實不是一件難事。主要是關於語義分析的時候檢查類型什麼的這一步實在是太繁瑣了,我給你兩個東西參考
1:【源碼下載】JIT腳本引擎:CMinus 0.1版開放下載 這個是當年我在學校做的一個修改過的C語言(就是去掉了井號,改了函數指針的語法而已)編譯器,編譯成x86寫內存里,可以直接調用。
2:https://gac.codeplex.com/SourceControl/latest#Libraries/Workflow/WorkflowSrc/WorkflowSrc.sln 這是一個面向對象的腳本,我用來給www.gaclib.net 做databinding和code behind的。這個腳本不以速度作為賣點,他從設計之初就是為了讓腳本可以調用支持反射的那部分C++類。裡面關於類型和符號表的處理我覺得你應該學一學
上面的語言都沒有垃圾收集器。如果你要實現垃圾收集器的話,大二的時候我剛好寫了一個javascript改良版的語言(現在看來ECMAScript也有類似的想法,只是語法根我做的不一樣),運行時是帶有虛擬機的。這裡有一個簡陋的、單線程的內存分配和垃圾收集演算法,你也可以參考一下Vczh Free Script 2.0 beta 發布 。
編譯器的前端包含了大量的知識,我推薦三本書給你:
Parsing Techniques
類型和程序設計語言
程序設計語言理論基礎
後端的知識量沒有前端大,但是做起來特別繁瑣:
Engineering a Compiler
Intel? 64 and IA-32 Architectures Software Developer』s Manual
學習llvm,如果你能熟練使用llvm,就能省下大把的精力。比如你完全可以自己只寫自己有興趣的pass,其他的用llvm自帶的。
同意 vczh 所說,但是垃圾回收涉及到的方方面面實在是太多了,不建議一上來過分關注於這個領域。如果是初學者的話,建議一步一步來,先抓核心的內容,不如從各種語義分析開始。然後把VM和GC這塊,就交給JVM把。在JVM的肩膀上做一些不同的事情,何樂而不為?
推薦閱讀:
※Clang裡面真正的前端是什麼?
※gcc編譯器為什麼不直接編譯成機器代碼?
※請問國內有哪些關於clang編譯技術的重要會議或者論壇?
※單純學習C,windows下有什麼好的編譯器?
※std::array 是被編譯器特別對待的嗎?
TAG:編譯器 |