2012-04-13 61 views
3

像C和C++這樣的語言依賴前向聲明來解決類型或函數聲明中的循環依賴性。在C#中,這不再是必需的,因爲聲明捕獲階段分爲兩個階段;一個捕獲符號名稱,另一個實際執行符號聲明構建。彙編中的聲明捕獲階段

是否有符號名稱捕獲階段的標準名稱?我假設聲明捕獲將留待對於涉及解決在聲明中的所有符號的傳統相

回答

1

我覺得這兩個階段被稱爲

  1. 解析
  2. 結合

解析是句法。綁定爲標識符和名稱分配含義。

C++可以做同樣的事情。它只是被定義爲不。

+0

沒有我想聲明捕捉階段發生一次的AST建成,這是解析階段完成 – lurscher 2012-04-13 16:13:01

+0

閱讀您的評論,我不知道究竟你通過聲明捕獲的意思後。 AFAIK在(1)和(2)之間沒有任何內容。這個階段會做什麼?這些聲明已經被解析器「捕獲」到AST中。 – usr 2012-04-13 16:14:20

+0

您提到的綁定階段可以細分爲子階段,符號名稱解析(不確定是否爲專有名稱),聲明捕獲以及最終綁定,將實現連接到聲明,但最後一個階段在鏈接階段繼續 – lurscher 2012-04-13 16:17:07

0

隨着.Net 5微軟將推出Roslyn,編譯器作爲服務。針對Roslyn的This overview描述了編譯器在代碼生成之前的三個步驟:詞法分析,語法分析和語義分析。 Roslyn project's overview確認了這些描述,但語言不太精確。

2

C#編譯器實際上有一個聲明階段,它構建符號表。 Roslyn C#編譯器不太清楚,因爲並非所有事情都是在大掃描階段完成的。相反,每個符號都是按需構建的。但是,仍然有一個步驟將語法中的類型和成員聲明轉換爲符號。邏輯上來說,綁定階段是在這裏引用類型和成員名稱使用聲明的符號表來解析的。

0

我發現從埃裏克利珀這個博客帖子裏面給出了最好的解釋就是我一直在尋找:

C#語言不要求聲明之前 用途,其中有兩個影響,再次出現,對用戶和編譯器 作者。對用戶的影響是,當您更改文件時,您不會重新編譯僅更改爲IL的文件;整個程序集重新編譯爲 。幸運的是C#編譯器足夠快,因此這個 很少是一個大問題。 (看看這另一種方式是,在C#中重新編譯的 「粒度」是在項目層次,而不是 文件級)。

編譯器作家的影響是,我們必須有一個「兩通過「 編譯器。在第一遍中,我們尋找聲明並忽略 機構。一旦我們從聲明 收集到了所有來自C++頭文件的信息,我們會通過代碼第二次傳遞 併爲這些實體生成IL。

...

然後我們做了「宣言」通過,我們做出的每一個程序命名空間和類型聲明的 位置說明。在 這一點,我們已經完成了第一階段的源代碼; 每一個後續通過都是在從 聲明中推導出的「符號」集合之上。

然後我們做一個通過,我們驗證所有聲明的類型在其基本類型中沒有 循環。我們首先需要做到這一點,因爲在隨後的每一次通過中,我們需要能夠在沒有 必須處理週期的情況下遍歷類型層次結構。

http://blogs.msdn.com/b/ericlippert/archive/2010/02/04/how-many-passes.aspx