微軟將編譯器作為服務公諸於眾

2021-09-16 18:08:50 字數 2346 閱讀 1979

早先的報道認為roslyn專案只是更好的執行時能夠訪問的編譯器以及repl樣式的直譯器,但是現在看來它的目的遠不止如此。微軟公開了整個編譯器產品線,期望開發者能夠在各個層次上建立出更多型別的工具。

\u0026#xd;\n

在roslyn專案中有四個「api層」。微軟將其總結如下:

\u0026#xd;\n

\u0026#xd;\n

編譯器apis

\u0026#xd;\n

編譯器層中包含了一些物件模型,這些模型與編譯器管道的各個階段暴露出來的資訊——包括句法和語義上的資訊——相關。編譯器層還包含了對編譯器單獨呼叫的展現,其中包括整合的引用、編譯器選項以及源**檔案。針對c#和visual basic語言有兩種不同的api,但大小差不多。

\u0026#xd;\n

指令碼apis

\u0026#xd;\n

指令碼層代表的是c#或者visual basic**片段的執行時執行上下文(runtime execution context)。它包含了一種指令碼引擎,這讓我們可以把宣告和對表示式的求值作為程式中的頂級結構。

\u0026#xd;\n

工作空間api

\u0026#xd;\n

工作空間層是對整個解決方案執行**分析和重構的起點。它會幫助你把解決方案中所有關於專案的資訊組織到乙個物件模型中,這讓你可以直接訪問編譯器層的物件模型,而不需要對檔案進行解析、配置選項或者管理專案之間的依賴關係。

\u0026#xd;\n

服務apis

\u0026#xd;\n

服務層中包含了所有visual studio ide特性,像智慧型感知、重構以及**格式化等。它還包含了各種服務api,這讓使用者可以輕鬆地擴充套件visual studio。

\u0026#xd;\n

\u0026#xd;\n

在四種層中,只有服務api對visual studio元件有很強的依賴關係。其它層都可以在任何一種應用程式中使用,但是工作空間api在visual studio中會更有效地工作。

\u0026#xd;\n

大多數與**打交道的開發者——或者是分析**,或者是重新編寫**——都需要從工作空間層開始。工作空間或者是由宿主(host)提供(像一種ide),或者是通重載入解決方案檔案手動建立。如果是由宿主提供,那麼當解決方案中的專案發生變化時,就會觸發事件並通知開發者。

\u0026#xd;\n

從isolution開始,所有工作空間層下的內容都會表現為一種不變的快照。這讓我們可以用執行緒安全的方式來訪問所有包含在解決方案中的專案、文件、語法和符號樹。想要做出改變,我們需要複製語法樹,並替換需要變更的部分。因為它們都是不可變的,所以我們還可以安全地重用那些沒有做出改變的分支。

\u0026#xd;\n

如果樹表現為文字形式,那麼在最底層就是源**本身。編譯器的首個編譯過程會將其編譯成語法樹。我們可以從完整的檔案建立語法樹,也可以從鬆散的宣告或者表示式生成它。在roslyn中,語法樹有一種有趣的特性,它完全忠實於最初的源**,包括所有的注釋和空格。這意味著所有語法樹都能夠轉換回源**,這對於**生成器和重構工具都是非常重要的功能。

\u0026#xd;\n

語法樹是由語法節點、令牌和一些瑣碎的內容(trivia)組成的。語法節點總會是包含其它節點、令牌和瑣碎內容的組合。namespacedeclarationsyntax、forstatementsyntax和binaryexpressionsyntax都是這樣的例證。令牌是單獨的關鍵字、符號和識別符號。瑣碎內容包括空格和注釋,這些都是編譯器不需要的資訊,但是對於重新建立出最初的源**展現是非常重要的。

\u0026#xd;\n

變更是針對語法樹做出的,變更時會使用了構造器和replacenode方法的組合。這個方法讓我們不需要手動複製語法樹中沒有變更的部分。

\u0026#xd;\n

語法樹只能夠表現出源**的詞法和句法結構。想要看到它的語義內容,我們需要建立編譯集(compilation)。編譯集是基於乙個或多個語法樹、一組引用的集合以及所有編譯器標識建立的。編譯集的主要功能就是要儲存符號列表,像命名空間、型別、方法、字段、事件、區域性變數以及標籤等等。

\u0026#xd;\n

開發者通常會使用語義模型。他們可以通過把語法樹回饋給編譯集來建立語義模型,從而用符號資料對其進行註解。然後我們可以對語義模型進行查詢,以獲得以下資訊:

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

在語義模型之上是「控制和資料流分析api」。這讓我們可以迅速獲得資訊,像在區域中為哪個變數賦值、引用了哪個變數以及該變數是否包含在某個跳轉和返回的宣告中。

\u0026#xd;\n

檢視英文原文:microsoft unveils its compiler as a service

微軟C C 編譯器選項

微軟c c 編譯器選項 優化 o1 最小化空間 op 改善浮點數一致性 o2 最大化速度 os 優選 空間 oa 假設沒有別名 ot 優選 速度 ob內聯展開 預設 n 0 ow 假設交叉函式別名 od 禁用優化 預設值 ox 最大化選項。ogityb2 gs og 啟用全域性優化 oy 啟用框架指...

微軟開源C 編譯器

作者 jeff martin 譯者 陳晴陽 發布於 2014年4月8日 1 討論 豆瓣網twitter facebook linkedin 郵件分享更多0 稍後閱讀 我的閱讀清單 4 月3日,微軟向公眾發布了roslyn編譯器專案,該專案採用了apache開源許可協議。c 的創始人 anders h...

微軟cl編譯器的簡單使用

cl的位置 開始 所有程式 microsoft visual studio visual studio tools developer command prompt 編譯器產生通用物件檔案格式 coff 物件 obj 檔案。鏈結器產生可執行檔案 exe 或動態鏈結庫檔案 dll 注意,所有編譯器選項...