报告中的声明捕获阶段

时间:2012-04-13 16:06:08

标签: c# compilation declaration forward-declaration

C和C ++等语言依赖于前向声明来解析类型或函数声明中的循环依赖。在C#中,这不再是必需的,因为声明捕获阶段分为两个阶段;一个捕获符号名称,另一个实际执行符号声明构造。

符号名称捕获阶段是否有标准名称?我会假设声明捕获将留给传统阶段,涉及解决声明中的所有符号

4 个答案:

答案 0 :(得分:2)

C#编译器实际上有一个声明阶段,它构建符号表。 Roslyn C#编译器并不是那么清晰,因为并非所有内容都是在大型扫描阶段完成的。相反,每个符号都是按需单独构建的。但是,仍然存在语法中的类型和成员声明转换为符号的步骤。绑定阶段在逻辑上之后,使用声明的符号表解析对类型和成员名称的引用。

答案 1 :(得分:1)

我认为这两个阶段被称为

  1. 解析
  2. 结合
  3. 解析是句法的。绑定是为标识符和名称赋值。

    C ++也可以这样做。它只是定义为不。

答案 2 :(得分:0)

借助.Net 5,微软将推出Roslyn,即编译器即服务。 Roslyn的This overview描述了编译器在代码生成之前的三个步骤:词法分析,句法分析和语义分析。 Roslyn project's overview确认了这些描述,但语言不太准确。

答案 3 :(得分:0)

我从Eric Lippert发现了这篇博文,它给出了我正在寻找的内容的最佳解释:

  

C#语言不要求之前发生声明   用法,再次对用户和编译器产生两种影响   作家。对用户的影响是您无法重新编译   更改文件时更改的IL;整个集会是   重新编译。幸运的是,C#编译器足够快   很少是一个大问题。 (另一种看待这种情况的方法是   C#中重新编译的“粒度”是项目级别,而不是   文件级别。)

     

对编译器编写器的影响是我们必须有“两遍”   编译器。在第一遍中,我们寻找声明并忽略   身体。一旦我们收集了声明中的所有信息   我们可以从C ++的头文件中获得,我们接受第二遍   在代码上生成身体的IL。

...

  

然后我们做了一个“声明”传递,我们在那里做了关于   程序中每个命名空间和类型声明的位置。在   这一点我们已经看完了第一阶段的源代码;   每一个后续的传递都是从中推导出的“符号”集合   声明。

     

然后我们做了一个传递,我们验证声明的所有类型都没有   它们的基类型循环。我们需要首先这样做,因为每一个   后续传递我们需要能够在没有的情况下走向类型层次结构   必须处理周期。

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