Anders Hejlsberg講解現代編譯器結構
《編譯原理》又名龍書,是編譯器結構的主要參考書,首次出版于1986年。 Anders Hejlsberg,以從事Turbo Pascal,Delphi,C#和TypeScript的開發而聞名,在 Channel 9的采訪中 講解當前的編譯器結構和30年前的不同。
經典編譯器的主要特征是順序處理輸入,各個階段都可以看作是管道的組件。
詞法分析 -> 語法分析 -> 類型檢查 -> 代碼生成 -> Emitter
在過去的十年里,需要IDE和工具來提供諸如自動完成,重構,代碼導航和靜態分析等等功能的需求逐漸增強。微軟的用戶研究表明這些特性必須低于100ms的延遲,否則的話就會被認為太慢。這和編譯一個中型解決方案的項目時間可能會花費超過1分鐘不一樣。
為了在IDE里提供快速的反饋,編譯器必須盡可能的限制實時處理的量。這意味著在每次鍵入的時候編譯整個程序是不可行的。相反,編輯器僅僅構建足夠給用戶提供答案的信息量。
快速響應不僅僅是通過限制處理內容,還通過盡可能的重用老的數據結構。每當用戶鍵入一個新的字符,內存中的所有數據結構可以認為是抹去的。然后,為了提高響應時間,所有沒有修改的東西都可以重用。諸如 抽象語法樹(AST) ,如果其所代表的源文件沒有被修改就可以被重用。
即使數據結構被修改了,重用也是可以的。持久化的數據結構是不可變的,通過創建和返回新的實例來實現修改,從而保持底層的部分不被修改。以抽象語法樹為例,意味著修改當前的節點和該節點對應的父節點直到根節點為止。樹的其他部分,保持原狀并在創建新的實例的時候被重用。
回到幾年前,IDE中的實時特性需求導致C#編譯器和IDE特性實現中的代碼重復。這也是創建Roslyn背后的主要原因之一。Roslyn的設計出發點就是能在IDE和命令行中同樣使用。
Roslyn和Seth在最后討論了學習現代編譯器結構的資源, Roslyn 和 TypeScript 項目是很好的實例,且都在Github上開源。
查看英文原文: Anders Hejlsberg Explains Modern Compiler Construction
來自: http://www.infoq.com/cn/news/2016/06/anders-hejlsberg-compiler