Поделиться через


Общие сведения о модели пакета SDK платформы компилятора .NET

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

Функциональные области конвейера компилятора

Пакет SDK платформы компилятора .NET предоставляет вам доступ к анализу кода компиляторов C# и Visual Basic путем предоставления слоя API, который имитирует традиционный поток компилятора.

шаги конвейера компилятора, обрабатывающего исходный код в объектный код

Каждый этап этого конвейера является отдельным компонентом. Во-первых, на этапе анализа исходный текст разбивается на токены и синтаксис, который соответствует грамматике языка. Во-вторых, этап объявления анализирует исходные и импортированные метаданные для формирования именованных символов. Затем этап привязки сопоставляет идентификаторы в коде с символами. Наконец, этап выдачи выдает сборку со всеми сведениями, созданными компилятором.

API конвейера компилятора предоставляет доступ к каждому шагу, который является частью конвейера компилятора.

В соответствии с каждым из этих этапов пакет SDK платформы компилятора .NET предоставляет объектную модель, которая позволяет получить доступ к данным на этом этапе. Этап синтаксического анализа предоставляет дерево синтаксиса, этап объявления предоставляет иерархическую таблицу символов, этап привязки предоставляет результат семантического анализа компилятора, а этап выдачи — ЭТО API, который создает коды байтов IL.

языковые службы, доступные из API компилятора на каждом шаге конвейера компилятора

Каждый компилятор объединяет эти компоненты как единое комплексное целое.

Эти API являются теми же, которые используются Visual Studio. Например, функции структурирования кода и форматирования используют синтаксические деревья, браузер объектов и функции навигации, использующие таблицу символов, рефакторинг и переход к определению , используют семантику модели, а также "Изменить и продолжить " используют все эти элементы, включая API отправки.

Уровни API

Пакет SDK компилятора .NET состоит из нескольких уровней API: API компилятора, диагностические API, API скриптов и API рабочих областей.

API компилятора

Слой компилятора содержит объектные модели, соответствующие сведениям, предоставляемым на каждом этапе конвейера компилятора, как синтаксическим, так и семантичным. Слой компилятора также содержит неизменяемый моментальный снимок одного вызова компилятора, включая ссылки на сборки, параметры компилятора и файлы исходного кода. Существует два разных API, представляющих язык C# и язык Visual Basic. Два API похожи в форме, но адаптированы для высокой точности для каждого отдельного языка. Этот слой не имеет зависимостей от компонентов Visual Studio.

API диагностики

В рамках анализа компилятор может создать набор диагностики, охватывающий все от синтаксиса, семантики и определенных ошибок назначения до различных предупреждений и информационной диагностики. Уровень API компилятора предоставляет диагностику через расширяемый API, который позволяет пользовательским анализаторам подключаться к процессу компиляции. Он позволяет создавать пользовательские диагностические данные, создаваемые такими инструментами, как StyleCop, наряду с диагностикой, определяемой компилятором. Создание диагностики таким образом имеет преимущество естественной интеграции с такими инструментами, как MSBuild и Visual Studio, которые зависят от диагностики для возможностей, таких как остановка сборки на основе политики, отображение живых ошибок в редакторе и предложение исправлений кода.

API-интерфейсы сценариев

API хостинга и скриптинга создаются на базе слоя компилятора. Сценарные API можно использовать для выполнения фрагментов кода и накопления контекста выполнения. Интерактивный rePL C# (цикл чтенияEvaluate-Print) использует эти API. REPL позволяет использовать C# в качестве языка сценариев, выполняя код в интерактивном режиме при написании.

API рабочих областей

Уровень рабочих областей содержит API рабочей области, который является отправной точкой для анализа кода и рефакторинга во всех решениях. Он помогает упорядочить все сведения о проектах в решении в одной объектной модели, предоставляя прямой доступ к объектным моделям уровня компилятора, не требуя анализа файлов, настройки параметров или управления зависимостями проекта в проект.

Кроме того, слой рабочих областей предоставляет набор API, используемых при реализации инструментов анализа и рефакторинга кода, которые функционируют в хост-окружении, например, в интегрированной среде разработки (IDE) Visual Studio. Примерами являются API поиска всех ссылок, форматирования и создания кода.

Этот слой не имеет зависимостей от компонентов Visual Studio.