Майкрософт Рослин и модели
С пресс-релиз вчера на InfoWorld относительно нового Microsoft Roslyn:
наиболее очевидным преимуществом такого рода" деконструированного " компилятора является что он позволяет вызывать весь процесс компиляции-выполнения из в рамках .Net-приложений. Хейлсберг продемонстрировал программу на C#, которая передал несколько фрагментов кода компилятору C# в виде строк; компилятор возвращает полученный код сборки IL в виде объекта, который тогда перешла к общеязыковой среды выполнения (CLR) для исполнения. Вуаля! С Roslyn, C# получает способность динамического языка генерировать и вызывать код во время выполнения.
Я был в состоянии сделать это с момента выпуска .NET 4 с CSharpCodeProvider.CompileAssemblyFromSource
который я фактически использую в ASP.Net проект, написанный некоторое время назад, который делает именно это-позволяет пользователю вводить код в текстовое поле, выбирать сборки / пространства имен для ссылки, а затем выполнять и отображать выходные данные из этого кода на лету для тестирования кода живой среды в Windows Azure.
- Это CodeDom
часть / предшественника Рослина? В чем особая выгода Рослин над CodeDom
?
4 ответа:
отказ от ответственности: Я работаю в Microsoft в команде Roslyn.
CodeDom является предшественником Roslyn, но только незначительно связан. По сути, CodeDom-это простой и (несколько) языковой агностический способ создания кода, который был добавлен в .NET 1.0 для поддержки дизайнеров (a la WinForms). Поскольку CodeDom был попыткой предоставить унифицированную модель, которая может генерировать код на C#, VB и других языках, ему не хватает высокой точности с любым из поддерживаемых языков (вот почему вы не можете создать оператор switch с CodeDom). CSharpCodeProvider.CompileAssemblyFromSource-это просто оболочка для выполнения csc.исполняемый.
Рослин-совершенно другое животное. Это переписывание компиляторов C# и VB с нуля с использованием управляемого кода -- C# в C# и VB в VB (версии csc.exe и vbc.exe, что корабль сегодня написаны в машинном коде). Преимущество их построения в управляемом коде заключается в том, что пользователи могут ссылаться на реальные компиляторы как библиотеки из приложений .NET (не требуется обертки).
при построении каждого компонента конвейера компилятора мы представили общедоступные API сверху:
- парсер - > синтаксическое дерево API
- таблица символов/импорт метаданных - > API символов
- Binder - > Binding and Flow Analysis APIs
- IL эмиттер - > Emit API
Roslyn может использоваться как сложный генератор исходного кода C# и VB, но именно там сходство с CodeDom заканчивается. API компилятора Roslyn можно использовать для анализа кода, выполнения семантического анализа, динамической компиляции и оценки кода и т. д.
в дополнение к компиляторам команда Roslyn также перестраивает функции Visual Studio C# и VB IDE сверху публичных API компилятора. Таким образом, API компилятора достаточно богаты, чтобы создавать инструменты времени разработки Visual Studio, такие как IntelliSense и рефакторинг метода Extract. Кроме того, на слоях выше компилятор Roslyn предлагает услуги для более высокого уровня анализа или преобразования данных. Например, существуют службы для форматирования кода с использованием правил форматирования C# и VB или поиска всех ссылок на определенный символ в решении.
действительно, это не просто один особое преимущество Рослин над CodeDom. Там, где CodeDom заполняет очень конкретную потребность в генерации кода, Roslyn решает все пространство инструментов языка, предоставляя структуру, позволяющую вам создайте практически любой инструмент языка C# или VB, который вы можете придумать.
модели позволяет компилировать - но это не дает вам возможность реально получать информацию о самом коде (кроме ошибок компилятора). В принципе, это черный ящик, где вы говорите: "скомпилируйте это", и он говорит: "я преуспел" или "я потерпел неудачу, вот некоторые ошибки".
Roslyn позволяет полностью проверить и построить код на лету. Это включает в себя такие вещи, как возможность видеть/проверять комментарии в части исходного кода, подробную информацию о полная структура, etc. Вы можете пройти и получить все синтаксическое дерево источника, который вы передаете в Roslyn, и сделать подробный анализ или преобразования на нем.
учитывая полную, богатую синтаксическую информацию, у вас есть огромное количество дополнительного контроля и гибкости. Вот как, например, работает пример, который копирует блок кода C# и вставляет его как VB.NET код. С Roslyn вы можете сделать больше, чем просто скомпилировать - вы также можете управлять самим кодом чисто. Это должно сделать много инструментов гораздо проще генерировать, так как такие вещи, как рефакторинг, могут быть сделаны очень просто, поскольку инструмент понимает полный синтаксис, включая метаинформацию (например, комментарии), и может просто работать с ней напрямую.
одна большая разница я вижу: с CodeDom, каждый раз, когда вы компилируете некоторые C# или VB.NET это происходит вне процесса. КДВ.exe или VBC.exe-это настоящие рабочие за сценой.
Если вы хотите построить сервис, с точки зрения архитектуры, масштабируемости, изоляции и т. д. (вы упомянули Azure), это не очень хорошо.
с Рослин это в процессе.
Я полагаю, что это одна из причин, по которой они называют его "компилятор как сервис".
кроме того, CodeDom-это относительно плохой API, пропускает много функций и не очень актуален, так как он был разработан в основном для поддержки автоматической генерации кода Visual Studio UI designers. Я думаю, что Roslyn будет намного лучше, так как это написано парнями, которые пишут компиляторы. Я надеюсь, что это будет иметь значение.
PS: одно заметное отличие от CSC.exe и VBC.ехе: Рослин, кажется, чисто .Чистая (и использует CCI).
Roslyn позволяет гораздо лучше контролировать весь процесс - например, вы можете анализировать строку и даже генерировать дополнительный код (на лету в процессе компиляции на основе анализа) и т. д.
CodeDom-это "просто использование компилятора", а Roslyn -"компилятор как служба с полным доступом к (суб) частям"... с Roslyn вы находитесь "внутри компилятора" и можете видеть, как выглядит код с точки зрения компилятора, что позволяет вам изменять вещи в настоящее время это невозможно.
например, вы можете использовать Roslyn для расширения C# - что-то очень удобное и намного лучше, чем текущее состояние реализации AOP.
обзор текущего состояния Roslyn и различных уровней доступа и контроля, которые он предоставляет, см. В разделе http://msdn.microsoft.com/en-us/hh500769
обновление
Microsoft только что сделала новый CTP доступным с дополнительными функциями и большим количеством API изменения/дополнения. Подробнее см. здесь.