Roslyn
.NET 編譯器平台

開源實現的 C# 和 Visual Basic 編譯器,具備完整的程式碼分析 API

5,263
編譯器檔案
20,000+
原始碼檔案
100%
開源

專案概覽

🎯

核心使命

Roslyn 打破了傳統編譯器的「黑盒子」模式,將編譯器轉變為平台。過去,原始碼進入編譯器,經過複雜處理後產生目的碼,但編譯過程中建立的深度知識隨即被遺忘。

現在,Roslyn 開放這些資訊,讓工具和開發者能夠利用編譯器對程式碼的深刻理解,實現 IntelliSense、重構、智慧重新命名、「尋找所有參考」等功能。

📊

專案規模

  • Compilers: 5,263 個檔案(3,310 C#,1,475 VB,138 DLL)
  • Workspaces: 2,646 個檔案(工作區管理和文件處理)
  • Features: 2,895 個檔案(IDE 功能實現)
  • VisualStudio: 2,123 個檔案(VS 整合)
  • LanguageServer: 1,138 個檔案(LSP 實現)
🚀

主要特色

  • 完全開源的 C# 和 VB 編譯器實現
  • 豐富的 API 用於程式碼分析和生成
  • 支援增量編譯和即時程式碼分析
  • 內建 Source Generator 支援
  • 與 Visual Studio 深度整合
  • 跨平台支援(Windows、Linux、macOS)
🔧

語言功能狀態

C# 14.0 進行中的功能:

  • field 關鍵字在屬性中
  • 一級 Span 類型支援
  • 部分事件和建構函式
  • 擴展 (Extensions)
  • Null 條件賦值
  • 字典表達式

編譯器架構

分層編譯管線

1

詞法分析 (Lexer)

將原始碼轉換為標記 (Token) 序列

2

語法分析 (Parser)

根據語言文法建立語法樹

3

宣告分析

分析宣告並形成符號表

4

綁定 (Binding)

將識別碼與符號匹配

5

語意分析

執行類型檢查和語意驗證

6

降低/重寫

將高階結構轉換為低階形式

7

發出 (Emit)

生成 IL 位元組碼

API 分層架構

Workspaces APIs
解決方案/專案模型、文件管理、主機服務
Compiler APIs
語法樹、符號、語意模型、診斷、發出 API
Core Infrastructure
語言無關的編譯器基礎設施、集合、執行緒處理

🔒 不可變性

Compilation 物件是不可變且可重用的。透過 AddSyntaxTrees()RemoveSyntaxTrees()ReplaceSyntaxTree() 進行增量變更。

⚡ 效能優化

使用 InternalSyntax 命名空間進行效能關鍵的解析,避免 LINQ 和 foreach(對於沒有 struct enumerator 的集合)。

🔄 增量編譯

支援增量語法樹更新和符號重新計算,提供快速的 IDE 體驗。

主要組件詳解

Compilers 組件

src/Compilers/

檔案統計

  • 總檔案數:5,263
  • C# 檔案:3,310
  • VB 檔案:1,475
  • DLL 檔案:138

核心目錄

  • Core/Portable/ - 語言無關的編譯器基礎設施
  • CSharp/Portable/ - C# 編譯器實現
  • VisualBasic/Portable/ - VB 編譯器實現
  • Test/ - 編譯器測試套件

主要功能

  • 語法分析和語法樹建立
  • 語意分析和符號表建立
  • 類型檢查和綁定
  • IL 程式碼生成
  • 診斷和錯誤報告
  • 元資料讀取和寫入

範例:建立編譯

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;

// 建立語法樹
var tree = CSharpSyntaxTree.ParseText(@"
    public class MyClass {
        public void MyMethod() {
            System.Console.WriteLine(""Hello"");
        }
    }
");

// 建立編譯
var compilation = CSharpCompilation.Create("MyAssembly")
    .AddReferences(MetadataReference.CreateFromFile(
        typeof(object).Assembly.Location))
    .AddSyntaxTrees(tree);

// 執行語意分析
var diagnostics = compilation.GetDiagnostics();

Workspaces 組件

src/Workspaces/

檔案統計

  • 總檔案數:2,646
  • C# 檔案:2,039
  • VB 檔案:256
  • XLF 檔案:169

核心概念

  • Workspace - 解決方案的抽象表示
  • Solution - 專案的集合
  • Project - 文件和參考的集合
  • Document - 單一原始碼檔案

主要功能

  • 解決方案和專案模型管理
  • 文件追蹤和版本控制
  • 主機服務整合
  • 持久性儲存
  • 程式碼重構支援

範例:工作區操作

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.MSBuild;

// 開啟工作區
var workspace = MSBuildWorkspace.Create();
var solution = await workspace.OpenSolutionAsync("MySolution.sln");

// 取得專案
var project = solution.Projects.First();

// 取得文件
var document = project.Documents.First();

// 取得語法樹
var tree = await document.GetSyntaxTreeAsync();

// 修改文件
var newDocument = document.WithText(newText);

Features 組件

src/Features/

檔案統計

  • 總檔案數:2,895
  • C# 檔案:2,207
  • VB 檔案:574

語言無關功能

  • 程式碼完成 (IntelliSense)
  • 程式碼重構
  • 程式碼修復
  • 尋找參考
  • 重新命名
  • 導航功能

分析器功能

  • 診斷分析器
  • 程式碼修復提供者
  • 重構提供者
  • 語意模型查詢

EditorFeatures 組件

src/EditorFeatures/

檔案統計

  • 總檔案數:2,285
  • C# 檔案:1,496
  • VB 檔案:665

編輯器整合

  • 文字緩衝區管理
  • 語法著色
  • 錯誤波浪線顯示
  • 即時程式碼分析
  • 程式碼摺疊
  • 括號匹配

互動式功能

  • 智慧縮排
  • 自動完成
  • 程式碼片段
  • 快速資訊
  • 簽名說明

VisualStudio 組件

src/VisualStudio/

檔案統計

  • 總檔案數:2,123
  • C# 檔案:1,504
  • VB 檔案:314
  • XLF 檔案:169

VS 整合

  • 語言服務實現
  • 專案系統整合
  • 工具視窗
  • 選項頁面
  • 命令處理

UI 組件

  • 物件瀏覽器
  • 類別檢視
  • 錯誤清單
  • 尋找符號結果
  • 重構預覽

LanguageServer 組件

src/LanguageServer/

檔案統計

  • 總檔案數:1,138
  • C# 檔案:1,074
  • XLF 檔案:26

LSP 實現

  • 語言伺服器協定支援
  • 跨編輯器相容性
  • VS Code 整合
  • 其他編輯器支援

支援的功能

  • 文件同步
  • 自動完成
  • 轉到定義
  • 尋找參考
  • 懸停資訊
  • 診斷

關鍵功能特色

🌳

語法樹 API

完整的語法樹表示,包含所有原始碼資訊(包括空白和註解)。支援不可變操作和高效的增量更新。

  • SyntaxNode(語法節點)
  • SyntaxToken(語法標記)
  • SyntaxTrivia(語法瑣碎資訊)
  • 完整保真度樹
🔍

語意分析

豐富的語意資訊 API,包括符號解析、類型資訊、資料流分析和控制流分析。

  • 符號表 (Symbol Table)
  • 語意模型 (Semantic Model)
  • 類型推斷
  • 資料流和控制流分析
⚙️

Source Generators

在編譯時生成程式碼的強大機制,支援增量生成器以獲得最佳效能。

  • ISourceGenerator 介面
  • IIncrementalGenerator
  • 編譯時程式碼生成
  • 增量計算
🔧

診斷分析器

可擴展的診斷系統,允許自訂分析器和程式碼修復。與 MSBuild 和 IDE 深度整合。

  • DiagnosticAnalyzer
  • CodeFixProvider
  • 自訂警告和錯誤
  • 批次修復支援
📝

程式碼重構

完整的重構基礎設施,支援安全的程式碼轉換和重新命名操作。

  • 重新命名符號
  • 提取方法/介面
  • 內聯變數
  • 移動類型到檔案
🚀

效能最佳化

專為大型程式碼庫設計,採用增量編譯、物件池和結構化列舉器等技術。

  • 增量編譯
  • 物件池 (Object Pools)
  • 避免配置
  • 結構化列舉器
🎨

語法著色

精確的語法分類和語意著色,提供豐富的編輯器體驗。

  • 分類器 (Classifiers)
  • 語意標記
  • 括號匹配
  • 區域摺疊
💡

IntelliSense

強大的程式碼完成和建議系統,提供上下文感知的智慧提示。

  • 完成提供者
  • 簽名說明
  • 快速資訊
  • 參數提示

開發工作流程

🔨 建置專案

PowerShell / Bash
# Windows
.\Build.cmd

# Linux / macOS
./build.sh

# 只建置編譯器
dotnet build Compilers.slnf

# 只建置 IDE 功能
dotnet build Ide.slnf

🧪 執行測試

測試命令
# 執行所有測試
.\Test.cmd
./test.sh

# 執行特定測試專案
dotnet test src/Compilers/CSharp/Test/Syntax/

# 執行特定測試
dotnet test --filter "FullyQualifiedName~MyTestClass"

📝 程式碼格式化

格式化命令
# 格式化空白
dotnet format whitespace --folder . --include path/to/file.cs

# 驗證程式碼格式
.\eng\validate-code-formatting.ps1

# 更新本地化檔案 (.xlf)
dotnet msbuild path/to/project.csproj /t:UpdateXlf

🔍 除錯編譯器

除錯設定
# 使用 Visual Studio
1. 開啟 Roslyn.sln
2. 設定 csc 或 vbc 專案為啟動專案
3. 設定命令列參數
4. F5 開始除錯

# 使用 VS Code
1. 開啟 .vscode/launch.json
2. 選擇設定
3. F5 開始除錯

最佳實踐

🎯 記憶體管理

  • 在熱路徑中避免使用 LINQ
  • 避免在沒有 struct enumerator 的集合上使用 foreach
  • 廣泛使用物件池(參考 PooledObjects
  • 使用 Debug.Assert() 進行內部驗證

📋 測試慣例

  • 繼承自 CSharpTestBaseVisualBasicTestBase
  • 使用 [Fact][Theory] 屬性
  • 使用 [UseExportProvider] 進行 MEF 測試
  • 遵循 Arrange-Act-Assert 模式

🏗️ API 設計

  • 使用不可變模式
  • 提供流暢的 API 介面
  • 遵循 .NET 命名慣例
  • 充分的 XML 文件註解

🔄 提交 PR

  • 尋找標有 "help wanted" 的議題
  • 先發布設計說明取得反饋
  • 確保所有測試通過
  • 遵循 .editorconfig 設定

社群與貢獻

GitHub Repository

在 GitHub 上探索原始碼、提出議題或貢獻程式碼。

訪問 Repository →
💬

GitHub Discussions

參與討論、提問問題、分享想法與其他開發者交流。

加入討論 →
🎮

Discord

加入 C# 社群 Discord 的 Roslyn 頻道進行即時對話。

加入 Discord →
📚

文件

閱讀完整的 API 文件和架構概述。

查看文件 →
🐛

回報問題

發現錯誤?在 GitHub Issues 上回報問題。

回報問題 →

功能建議

對 C# 或 VB 有新功能想法?到相應的 repo 提出建議。

如何貢獻

1

尋找議題

尋找標有「help wanted」或「good first issue」的議題

2

討論方案

在開始編碼前,先在議題中討論你的方案

3

Fork 並複製

Fork repository 並複製到本地

4

開發和測試

實現功能或修復,並添加測試

5

提交 PR

提交 Pull Request 並等待審核

專案統計

20,000+
原始碼檔案
100+
貢獻者
多個
Azure 管線
持續
CI/CD