Открыть сервис

Roslyn

Roslyn — это кодовое название компилятора платформы .NET (C# и Visual Basic .NET) с открытым исходным кодом, разработанного компанией Microsoft. В отличие от предшествовавших ему компиляторов, которые работали как «чёрный ящик» (принимая исходный код на вход и выдавая сборку на выходе), Roslyn предоставляет API для анализа кода, его синтаксического и семантического моделирования, а также для создания и преобразования кода. Это позволяет использовать компилятор не только для сборки приложений, но и для создания инструментов разработки, таких как рефакторинги, анализаторы кода, автодополнение и навигация в интегрированных средах разработки (IDE).

История

Предпосылки создания

До появления Roslyn компиляторы C# и VB.NET были закрытыми, написанными на C++ и не предоставляли публичного доступа к своим внутренним компонентам. Разработчики инструментов (например, для Visual Studio) были вынуждены использовать обходные пути — парсить исходный код сторонними парсерами или использовать отражение (reflection) для анализа скомпилированных сборок. Это было неэффективно, неточно и не позволяло создавать глубокие инструменты анализа.

Анонс и разработка

Проект Roslyn был анонсирован Microsoft в 2011 году на конференции Build. Первоначально он был представлен как исследовательский проект (Community Technology Preview, CTP). В 2014 году, на конференции Build, Microsoft объявила об открытии исходного кода Roslyn под лицензией Apache 2.0. Это стало частью более широкой стратегии по открытию .NET-платформы.

Основные версии

  • Visual Studio 2013 (Roslyn CTP): Первая публичная версия, использовавшаяся в Visual Studio 2013 для поддержки редактора кода.
  • Visual Studio 2015 (Roslyn 1.0): Первая стабильная версия, которая стала полноценным компилятором для C# 6.0 и VB.NET 14. Roslyn полностью заменил старый компилятор (csc.exe) в Visual Studio.
  • .NET Compiler Platform SDK (Roslyn 2.0+): Выход в составе .NET Core SDK. Roslyn стал основой для всех последующих версий C# (7.0, 8.0, 9.0, 10.0, 11.0, 12.0 и т.д.) и Visual Basic.
  • Текущее состояние: Roslyn активно развивается как часть репозитория dotnet/roslyn на GitHub. Новые версии выпускаются синхронно с новыми версиями .NET.

Архитектура

Roslyn построен как набор слоёв, каждый из которых предоставляет API для определённого этапа компиляции. Ключевая особенность — компилятор не является монолитным; он состоит из отдельных компонентов, доступных через публичные интерфейсы.

Основные компоненты

  1. Синтаксический анализатор (Parser):
  • Преобразует исходный код (текст) в синтаксическое дерево (Syntax Tree).
  • Дерево состоит из узлов (Nodes), токенов (Tokens) и тривий (Trivia — пробелы, комментарии, директивы препроцессора).
  • Синтаксическое дерево является неизменяемым (immutable). Любое изменение кода создаёт новое дерево, но с максимальным переиспользованием узлов (persistent data structure).
  • API позволяет обходить дерево, искать узлы по типу, получать родительские и дочерние элементы.
  1. Семантический анализатор (Semantic Model):
  • Использует синтаксическое дерево и информацию о сборках (метаданные) для создания семантической модели.
  • Предоставляет информацию о типах, членах, символах, связях между ними.
  • Позволяет ответить на вопросы: «Что означает этот идентификатор?», «К какому типу относится это выражение?», «Какие методы перегружены?».
  • API включает Compilation, SemanticModel, ISymbol, ITypeSymbol и другие.
  1. Компилятор (Compiler):
  • Собирает синтаксическое дерево, семантическую модель и метаданные для генерации сборки (DLL или EXE).
  • Включает этапы: связывание (binding), вывод типов, разрешение перегрузок, генерация IL-кода (Intermediate Language).
  • Результат — объект Compilation, который может быть эмитирован в файл или поток.
  1. Рабочее пространство (Workspace):
  • Слой, предназначенный для работы с целыми решениями (Solution) и проектами (Project).
  • Предоставляет API для открытия, изменения, сохранения файлов, а также для управления ссылками между проектами.
  • Используется в Visual Studio, но может быть применён и в консольных приложениях.

Ключевые API

  • SyntaxTree: Представляет синтаксическое дерево одного файла.
  • SyntaxNode: Узел дерева (например, ClassDeclarationSyntax, MethodDeclarationSyntax, IfStatementSyntax).
  • SyntaxToken: Токен (ключевое слово, идентификатор, литерал, знак пунктуации).
  • SyntaxTrivia: Тривия (пробелы, комментарии, директивы #if, #region).
  • Compilation: Представляет компиляцию одного или нескольких файлов с учётом ссылок на другие сборки.
  • SemanticModel: Результат семантического анализа для конкретного синтаксического дерева.
  • ISymbol: Абстрактный интерфейс для всех символов (типы, методы, свойства, поля, события).
  • Solution: Модель всего решения (набор проектов, файлов, ссылок).
  • Project: Модель одного проекта.
  • Document: Модель одного файла.

Применение

Roslyn используется в нескольких ключевых областях разработки на .NET.

Компиляция

Основное назначение — компиляция C# и VB.NET кода. Roslyn является стандартным компилятором для всех проектов .NET (Core, 5, 6, 7, 8, 9 и т.д.), а также для .NET Framework (начиная с Visual Studio 2015). Он поддерживает все версии языка, включая последние нововведения (например, primary constructors, record types, pattern matching).

Инструменты разработки (IDE)

Roslyn лежит в основе редактора кода Visual Studio, Visual Studio Code (через C# Dev Kit) и Rider (через ReSharper). Он обеспечивает:

  • IntelliSense: Автодополнение, подсказки параметров, быстрые подсказки.
  • Навигация: Переход к определению, поиск всех ссылок, просмотр иерархии вызовов.
  • Рефакторинг: Переименование, извлечение метода, изменение сигнатуры.
  • Диагностика: Подсветка синтаксических и семантических ошибок, предупреждений.

Анализаторы кода и исправления (Code Fixes)

Roslyn позволяет создавать пользовательские анализаторы (analyzers) и исправления (code fixes). Они распространяются в виде NuGet-пакетов или расширений Visual Studio. Анализаторы проверяют код на соответствие правилам (например, стиль кода, потенциальные ошибки, нарушение архитектурных принципов). Исправления предлагают автоматические изменения для устранения найденных проблем.

Примеры известных анализаторов:

  • Microsoft.CodeAnalysis.NetAnalyzers: Встроенный набор правил для .NET.
  • SonarAnalyzer.CSharp: Анализатор от SonarSource для поиска ошибок и уязвимостей.
  • StyleCop.Analyzers: Анализатор для проверки стиля кода.
  • Roslynator: Набор рефакторингов и анализаторов.

Генерация исходного кода (Source Generators)

Начиная с .NET 5, Roslyn поддерживает генераторы исходного кода (source generators). Это компоненты, которые анализируют код проекта во время компиляции и генерируют дополнительный исходный код, который компилируется вместе с основным. Это позволяет автоматизировать создание boilerplate-кода (например, для сериализации, внедрения зависимостей, обработки атрибутов) без использования рефлексии во время выполнения.

Образовательные и исследовательские проекты

Благодаря открытому API, Roslyn используется для создания учебных инструментов, анализаторов кода для научных исследований, а также для экспериментов с новыми возможностями языков.

Критика и ограничения

Несмотря на широкое распространение, Roslyn имеет некоторые ограничения:

  • Производительность: Анализ больших решений (сотни проектов, миллионы строк кода) может быть ресурсоёмким. Хотя Roslyn использует кэширование и ленивые вычисления, полный семантический анализ может занимать значительное время.
  • Сложность API: API Roslyn является мощным, но довольно сложным для изучения. Разработчикам, создающим анализаторы или генераторы, необходимо хорошо понимать внутреннее устройство компилятора.
  • Версионность: API Roslyn меняется между версиями .NET, что может приводить к несовместимости анализаторов, написанных для одной версии, с другой.
  • Зависимость от платформы: Хотя Roslyn является кроссплатформенным (работает на Windows, Linux, macOS), некоторые функции (например, работа с Workspace) могут зависеть от наличия .NET SDK.

Интересные факты

  • Название «Roslyn» происходит от названия горы Рослин (Mount Roslyn) в штате Вашингтон, США, недалеко от офиса Microsoft в Редмонде.
  • Roslyn является одним из самых больших проектов с открытым исходным кодом от Microsoft. В его репозитории на GitHub содержится более 2 миллионов строк кода.
  • Благодаря Roslyn, компилятор C# теперь написан на самом C# (ранее он был написан на C++). Это явление называется «самодостаточность» (self-hosting).
  • Roslyn используется не только в Visual Studio, но и в таких инструментах, как ReSharper (JetBrains), OmniSharp (кроссплатформенный сервер для редакторов), а также в некоторых онлайн-компиляторах (например, .NET Fiddle).

Источники

  • Документация Microsoft по .NET Compiler Platform SDK (Roslyn)
  • Репозиторий dotnet/roslyn на GitHub
  • Книга «C# 10 in a Nutshell» (Joseph Albahari)
  • Статья «The Roslyn Project: Exposing the .NET Compiler as a Service» (Microsoft Research, 2011)
  • Официальный блог .NET (devblogs.microsoft.com/dotnet)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →