Microsoft Рослин против CodeDom - PullRequest
       35

Microsoft Рослин против CodeDom

106 голосов
/ 21 октября 2011

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

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

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

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

Ответы [ 4 ]

230 голосов
/ 22 октября 2011

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

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

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

При создании каждого компонента конвейера компилятора мы выставили открытые API наtop:

  • Parser -> API синтаксического дерева
  • Импорт таблицы символов / метаданных -> API символов
  • Binder -> API связывания и анализа потока
  • IL Emitter -> Emit API

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

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

Действительно, не существует только one specialПреимущество Roslyn перед CodeDom.В тех случаях, когда CodeDom удовлетворял очень специфическую потребность в генерации кода, Roslyn занимается всем пространством инструментальных средств для языка, предоставляя платформу, позволяющую создавать практически любой язык C # или VB, о котором вы только можете подумать.

41 голосов
/ 21 октября 2011

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

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

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

10 голосов
/ 21 октября 2011

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

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

С Roslyn он находится в процессе.

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

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

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

7 голосов
/ 21 октября 2011

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

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

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

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

ОБНОВЛЕНИЕ

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

...