Anders Hejlsberg講解現代編譯器結構

2021-09-16 18:23:15 字數 1406 閱讀 9416

《編譯原理》又名龍書,是編譯器結構的主要參考書,首次出版於2023年。 anders hejlsberg,以從事turbo pascal,delphi,c#和typescript的開發而聞名,在channel 9的採訪中講解當前的編譯器結構和30年前的不同。

\u0026#xd;\n\u0026#xd;\n

經典編譯器的主要特徵是順序處理輸入,各個階段都可以看作是管道的元件。

\u0026#xd;\n\u0026#xd;\n

\u0026#xd;\n詞法分析 -\u0026gt; 語法分析 -\u0026gt; 型別檢查 -\u0026gt; **生成 -\u0026gt; emitter\u0026#xd;\n
\u0026#xd;\n\u0026#xd;\n

在過去的十年裡,需要ide和工具來提供諸如自動完成,重構,**導航和靜態分析等等功能的需求逐漸增強。微軟的使用者研究表明這些特性必須低於100ms的延遲,否則的話就會被認為太慢。這和編譯乙個中型解決方案的專案時間可能會花費超過1分鐘不一樣。

\u0026#xd;\n\u0026#xd;\n

為了在ide裡提供快速的反饋,編譯器必須盡可能的限制實時處理的量。這意味著在每次鍵入的時候編譯整個程式是不可行的。相反,編輯器僅僅構建足夠給使用者提供答案的資訊量。

\u0026#xd;\n\u0026#xd;\n

快速響應不僅僅是通過限制處理內容,還通過盡可能的重用老的資料結構。每當使用者鍵入乙個新的字元,記憶體中的所有資料結構可以認為是抹去的。然後,為了提高響應時間,所有沒有修改的東西都可以重用。諸如抽象語法樹(ast),如果其所代表的原始檔沒有被修改就可以被重用。

\u0026#xd;\n\u0026#xd;\n

即使資料結構被修改了,重用也是可以的。持久化的資料結構是不可變的,通過建立和返回新的例項來實現修改,從而保持底層的部分不被修改。以抽象語法樹為例,意味著修改當前的節點和該節點對應的父節點直到根節點為止。樹的其他部分,保持原狀並在建立新的例項的時候被重用。

\u0026#xd;\n\u0026#xd;\n

回到幾年前,ide中的實時特性需求導致c#編譯器和ide特性實現中的**重複。這也是建立roslyn背後的主要原因之一。roslyn的設計出發點就是能在ide和命令列中同樣使用。

\u0026#xd;\n\u0026#xd;\n

roslyn和seth在最後討論了學習現代編譯器結構的資源,roslyn和typescript專案是很好的例項,且都在github上開源。

\u0026#xd;\n\u0026#xd;\n

檢視英文原文:anders hejlsberg explains modern compiler construction

\u0026#xd;\n\u0026#xd;\n

感謝張龍對本文的審校。

\u0026#xd;\n\u0026#xd;\n

編譯方舟編譯器

環境 mac os parallels desktop 安裝ubuntu 16.04 安裝基礎包 sudo apt get y install openjdk 8 jdk git core gnupg flex bison gperf build essential zip curl zlib1g ...

方舟編譯器編譯

目錄環境變數 安裝 ninja 和 gn 編譯成功 總結2019.9.1 編譯華為方舟編譯器原始碼 這篇文章僅僅是關於如何搭建環境並進行編譯。本機環境 ubuntu 16 server.一定要好好看參考文件!建議使用root賬戶操作 先 clone 原始碼華為開源平台 對應的參考文件openarkc...

初識編譯器

編譯器 閱讀以某一種語言 源語言 編寫的程式,並把該程式翻譯成為乙個等價的 用另一種語言 目標語言 編寫的程式。直譯器 並不通過翻譯的方式生成目標程式,直接利用使用者提供的輸入執行源程式中指定的操作。編譯器直譯器 執行速度更快 錯誤診斷效果更好 建立可執行的目標執行還需要的其他程式,比如 預處理器 ...