C和C ++等语言依赖于前向声明来解析类型或函数声明中的循环依赖。在C#中,这不再是必需的,因为声明捕获阶段分为两个阶段;一个捕获符号名称,另一个实际执行符号声明构造。
符号名称捕获阶段是否有标准名称?我会假设声明捕获将留给传统阶段,涉及解决声明中的所有符号
答案 0 :(得分:2)
C#编译器实际上有一个声明阶段,它构建符号表。 Roslyn C#编译器并不是那么清晰,因为并非所有内容都是在大型扫描阶段完成的。相反,每个符号都是按需单独构建的。但是,仍然存在语法中的类型和成员声明转换为符号的步骤。绑定阶段在逻辑上之后,使用声明的符号表解析对类型和成员名称的引用。
答案 1 :(得分:1)
我认为这两个阶段被称为
解析是句法的。绑定是为标识符和名称赋值。
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