Microsoft Roslyn против CodeDom

Из пресс-релиз вчера о InfoWorld относительно нового Microsoft Roslyn:

Наиболее очевидным преимуществом такого "деконструированного" компилятора является что он позволяет задействовать весь процесс компиляции-выполнения из в приложениях .Net. Хейлсберг продемонстрировал программу на С#, которая передал несколько фрагментов кода компилятору С# в виде строк; компилятор вернул полученный код сборки IL в качестве объекта, который был тогда (CLR) для выполнения. Вуаля! С Roslyn, С# получает динамическую языковую способность генерировать и ссылаться кода во время выполнения.

Я смог сделать это с момента выпуска .NET 4 с CSharpCodeProvider.CompileAssemblyFromSource, который я фактически использую в ASP. Чистый проект, написанный некоторое время назад, который делает именно это - позволяет пользователю вводить код в текстовое поле, выбирать сборки/пространства имен для ссылки, а затем выполнять и отображать выходные данные этого кода "на лету" для тестирования кода живой среды в Windows Azure.

Является ли CodeDom частью/предшественника Roslyn? Какое особое преимущество Рослина над CodeDom?

Ответ 1

Отказ от ответственности. Я работаю в Microsoft в команде Roslyn.

CodeDom является предшественником Roslyn, но лишь незначительно связан. По сути, CodeDom - это простой и (несколько) языковой агностический способ генерации кода, который был добавлен в .NET 1.0 для поддержки дизайнеров (a la WinForms). Поскольку CodeDom был попыткой предоставить единую модель, которая может генерировать код на С#, VB и других языках, ему не хватает высокой точности с любым из поддерживаемых им языков (почему вы не можете создать оператор switch с CodeDom). CSharpCodeProvider.CompileAssemblyFromSource - это просто оболочка для выполнения csc.exe.

Рослин - совершенно другое животное. Это переписывание компиляторов С# и VB с нуля, используя управляемый код - С# в С# и VB в VB (версии csc.exe и vbc.exe, которые сегодня отправляются, записаны в собственном коде). Преимущество построения их в управляемом коде состоит в том, что пользователи могут ссылаться на реальных компиляторов как на библиотеки из приложений .NET(без необходимости обертки).

При построении каждого компонента конвейера компилятора мы открыли публичные API сверху:

  • Parser → API дерева синтаксиса
  • Символьная таблица/Импорт метаданных → API-интерфейс символа
  • Binder → API для привязки и анализа потока.
  • IL Emitter → Emit API

Roslyn может использоваться как сложный генератор исходного кода С# и VB, но тот, где заканчивается сходство с CodeDom. API-интерфейсы Roslyn Compiler можно использовать для анализа кода, выполнения семантического анализа, компиляции и оценки кода динамически и т.д.

В дополнение к компиляторам команда Roslyn также перестраивает функции Visual Studio С# и VB IDE поверх общих API-интерфейсов компилятора. Таким образом, API-интерфейсы компилятора достаточно богаты, чтобы создавать инструменты времени разработки Visual Studio, такие как IntelliSense и рефакторинг метода извлечения. Кроме того, на уровнях выше компилятора Roslyn предлагает услуги для анализа более высокого уровня или преобразования данных. Например, существуют службы для форматирования кода с использованием правил форматирования С# и VB или нахождения всех ссылок на конкретный символ в пределах решения.

Действительно, есть не только одно особое преимущество Roslyn над CodeDom. Когда CodeDom заполняет очень специфическую потребность в генерации кода, Roslyn решает все пространство для языкового инструментария, предоставляя фреймворк, позволяющий вам создавать практически любой инструмент языка С# или VB, о котором вы можете думать.

Ответ 2

CodeDom позволяет вам скомпилировать - но это не дает вам возможности действительно получать информацию о самом коде (кроме ошибок компилятора). В принципе, это черный ящик, в котором вы говорите "скомпилируйте это", и он говорит "Я преуспел" или "Я потерпел неудачу, вот некоторые ошибки".

Roslyn позволяет вам полностью проверить и построить код на лету. Это включает в себя такие вещи, как возможность просмотра/проверки комментариев внутри фрагмента исходного кода, подробной информации о полной структуре и т.д. Вы можете пройти и получить все дерево синтаксиса источника, который вы передаете в Roslyn, и провести подробный анализ или преобразования на нем.

Учитывая полную, богатую синтаксическую информацию, у вас есть огромное количество дополнительного контроля и гибкости. Так, например, пример работает, который копирует блок кода С# и вставляет его как код VB.NET. С Roslyn вы можете делать больше, чем просто компилировать - вы также можете легко манипулировать кодом. Это должно сделать гораздо более сложную задачу, поскольку такие вещи, как рефакторинг, можно сделать очень просто, поскольку инструмент понимает полный синтаксис, включая метаинформацию (например, комментарии), и может просто работать с ней напрямую.

Ответ 3

Одна большая разница, которую я вижу: с CodeDom, каждый раз, когда вы компилируете некоторые С# или VB.NET, это происходит из процесса. CSC.exe или VBC.exe являются настоящими работниками за сценой.

Если вы хотите создать сервис с точки зрения архитектуры, масштабируемости, изоляции и т.д. (вы упомянете Azure), это не очень хорошо.

С Roslyn это в процессе.

Я предполагаю, что это одна из причин, по которой они называют это "Компилятор как услуга".

Кроме того, CodeDom является относительно бедным API, пропустил множество функций и не совсем обновлен, поскольку он был разработан в основном для поддержки автоматического создания кода Visual Studio UI. Я думаю, что Roslyn будет делать гораздо лучше, как написано парнями, которые пишут компиляторы. Надеюсь, что это будет иметь значение.

PS: Заметное отличие от CSC.exe и VBC.exe: Roslyn кажется чистым .NET(и использует CCI).

Ответ 4

Roslyn позволяет намного более точно контролировать весь процесс - например, вы можете анализировать строку и даже генерировать дополнительный код ( "на лету" в процессе компиляции на основе анализа) и т.д.

CodeDom "просто использует компилятор", в то время как Roslyn - это "компилятор" как служба с полным доступом к (под) частям "... с Roslyn вы" внутри компилятора "и можете видеть, как выглядит код из перспектива компилятора, позволяющая вам менять вещи способами, которые в настоящее время невозможны.

Например, вы можете использовать Roslyn для расширения С# - что-то очень удобное и намного лучше, чем текущее состояние реализации АОП.

Для обзора текущего состояния Roslyn и различных уровней доступа и контроля, которые он предоставляет, см. http://msdn.microsoft.com/en-us/hh500769

UPDATE

Microsoft только что выпустила новый CTP с дополнительными функциями и множеством изменений/дополнений API. Подробнее см. здесь.