1:编译器管道
2:语法分析
3:语义分析
4:代码转换
5:代码重构
c#6开始用一个新的编译器--Roslyn。最初,c#编译器是用c++编写的。现在,它的主要部分是用c#和.Net创建的。编译器平台是开源的。
开源地址:https://github.com/dotnet/roslyn
新的编译平台优点:使用c#实现新功能要容易得多,新代码易于维护。
重写c#编译器的一个更大优势是:现在可以利用编译器管道,在编译器管道的每一步添加功能,并分析和转换源代码。
一:编译器管道
编译器管道包括以下阶段:
解析器--阅读和标记化源代码,然后将其解析为一个语法树。语法树API用于在源代码编辑器中格式化、着色、列出大纲。
声明--分析源代码中的声明和导入元数据,以创建符号。为这一阶段提供了符号API.在编辑器和对象浏览器中的Navigation To特性使用这个API.
绑定--标识符匹配符号。为这一阶段提供了绑定和流分析API。Find All References、 Rename、Quick Info和Extract Method等特性都使用这个API。
发布--创建IL代码,发布一个程序集。发布API可用于创建程序集。编辑器中的Edit and Continue特性需要一个新的编译,来利用发布阶段。
根据编译器管道,提供了编译器API,例如 语法(Syntax)API、符号(Symbol)API、绑定和流分析(Binding and Analysis)API以及发布(Emit)API.
.Net编译器平台还提供了一个API层,来利用另一个API:工作区Workspace API。工作区API 允许使用工作区、解决方案、项目和文档。
VS中,一个解决方案可以包含多个项目,一个项目可以包含多个文档。一个工作区可以包含多个解决方案。
所有用于.Net编译器平台的树是不可变的,不能更改。每次改变都会创建一个新树。这就是为什么需要工作区这个概念--一个工作区可以包含多个解决方案。
二:语法分析