Введение в Microsoft “Roslyn” CTP

http://blogs.msdn.com/b/visualstudio/archive/2011/10/19/introducing-the-microsoft-roslyn-ctp.aspx
  • Перевод

Почему Roslyn?


В прошлом наши компиляторы работали как черные ящики — вы подаёте на вход исходный текст программы, а на выходе получаете сборку. Все знания и информация, которую формирует компилятор выбрасывается и недоступны для чьего-либо использования.

Как пишет Soma в своём блоге, часть Visual Studio language team работает на проектом, который называется Roslyn. Его главная цель — переписать компиляторы C# и VB и создать языкове сервисы в управляемом коде. С чистым, современным и управляемым кодом наша команда сможет быть более продуктивной, внедрять инновации быстрее и выдавать больше возможностей скорее и с лучшим качеством.

Более того, мы открываем компиляторы C# и VB со всей их внутренней информацией, делая доступным для вас анализ кода. Мы предоставляем публичное API и обеспечиваем точки расширения в языковых сервисах C# и VB.

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

Скачивание October 2011 CTP


CTP и вспомогательные материалы можно скачать по адресу: http://msdn.com/roslyn.

Главная цель ранней предварительной сборки — сбор отзывов о конструкции API и введение интерактивного C#-окна (так же известного, как REPL, Read-Eval-Print-Loop).

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

CTP устанавливается на Visual Studio 2010 SP1. Так же необходимо Visual Studio 2010 SP1 SDK.

Первые шаги


После успешной установки лучшее место начать работу — это открытие Start Menu -> Microsoft Codename Roslyn CTP -> Getting Started.

Для начала работы документ “Roslyn Project Overview” позволит обзорно взглянуть на предоставляемое API — как работать с синтаксисом и семантикой в вашей программе. Прилагается несколько руководств, которые обеспечат глубокое погружение в различные аспекты Roslyn API.

CTP поставляется с некоторым количеством примеров для Visual Studio Extensions, компиляторами API, инструментами рефакторинга и т.д. Большинство примеров предназначено для C# и Visual Basic. Вы можете открыть исходный код примеров с Getting Started page.

Мы также добавили несколько новых шаблонов проектов, доступных в диалогом окне New Project:


Эти шаблоны помогут вам начать создавать новые расширения для Visual Studio, используя Roslyn.

Reference Assemblies



Сборки Roslyn также инсталлируются в GAC. Переключение к Full Profile (вместо Client Profile) делает возможным так же ссылки на Servies assemblies (которые содержат поддержку IDE).

C# Interactive window



Вы можете вызвать C# Interactive window с помощью View -> Other Windows -> C# Interactive Window. Интерактивное окно работает на новых языковых сервисах C#. Архитектура Roslyn является достаточно гибкой, чтобы обеспечить одинаковую работу таких функций IDE, как IntelliSense и рефакторинг в обычном редакторе и в интерактивном окне.

В настоящее время интерактивное окно доступно только для C#. Мы прилагаем усилия к созданию интерактивного окна для VB в ближайшем будущем.

Поддержка C# Script File (.csx)


В CTP вводится концепт скриптовых C#-файлов. Вы можете создать .csx-файл через File -> New File (или в любом текстовом редакторе, например, блокноте):


Вы можете запускать скрипты, используя новый rcsi.exe, который инсталлируется в %ProgramFiles(x86)%\Microsoft Codename Roslyn CTP\Binaries\rcsi.exe. Вы можете добавлять rcsi.exe к пути и печатать rcsi scriptfilename>.csx.

Вы можете также копировать куски кода из скриптового файла и отправлять их в интерактивное окно (используя контекстное меню или горячие клавиши).

Редактор скриптовых файлов также сделан на новых языковых сервисах. Поэтому важно иметь ввиду, что .csx скрипты поддерживают только ту часть языка, которая уже реализована в Roslyn-компиляторе. Для более подробной информации можно посмотреть раздел «Introduction to Scripting» пошагового руководства.

Быстрые примеры использования Roslyn API


Это пример компилирования и выполнения маленькой программы, использующей Roslyn API:
using Roslyn.Compilers;
using Roslyn.Compilers.CSharp;
 

 
var text = @"class Calc { public static object Eval() { return 42; } }";
 
var tree = SyntaxTree.ParseCompilationUnit(text);
var compilation = Compilation.Create(
    "calc.dll",
    options: new CompilationOptions(assemblyKind: AssemblyKind.DynamicallyLinkedLibrary),
    syntaxTrees: new[] { tree },
    references: new[] { new AssemblyFileReference(typeof(object).Assembly.Location) });
 
Assembly compiledAssembly;
using (var stream = new MemoryStream())
{
    EmitResult compileResult = compilation.Emit(stream);
    compiledAssembly = Assembly.Load(stream.GetBuffer());
}
 
Type calc = compiledAssembly.GetType("Calc");
MethodInfo eval = calc.GetMethod("Eval");
string answer = eval.Invoke(nullnull).ToString();
 
Assert.AreEqual("42", answer);


Примечание: на данном этапе только часть возможностей языка была реализована в текущем CTP. Мы движемся вперёд в быстром темпе, но такие функции, как LINQ-запросы, атрибуты, события, dynamic, async ещё не реализованы. Для просмотра полного списка не реализованных вещей вы можете посетить Roslyn forums.

Хотя не все возможности языка поддерживаются, форма публичного API в большей степени заполнена. Поэтому мы советуем вам писать расширения и утилиты, использующих Syntax, Symbols, and Flow and Region Analysis APIs.

Мы очень рады предложить вам ранний предварительный просмотр этой технологии и будем рады отзывам, идеям и предложениям. Используйте форумы, чтобы задать вопросы и обеспечить обратную связь, Microsoft Connect для регистрации ошибок и предложений. Вы так же можете использовать хештег #RoslynCTP на твиттере.
Поделиться публикацией

Похожие публикации

Комментарии 13

    +3
    Очень радует появление C# Script File. Быстрее бы уже релиз :)
    Интересно, кто-нибудь сравнивал Roslyn с C# Compiler as a Service от Mono?
      +1
      Увы, релиз ещё не скоро. Если верить Microsoft, то в следующую версию студии Roslyn не войдёт, а войдёт только в через следующую (то, что иногда называют Studio vNext).
      Я активно слежу за Roslyn-ом и всей информацией, которая появляется о нём в интернете, но сравнительных обзоров с Mono пока не видел. Думаю, рано ещё сравнивать — в Roslyn-е ещё очень много чего не реализовали. И пока не очень понятно, каким предстанет перед нами финальный билд сего продукта.
      0
      Да, это действительно круто. Жаль, до релиза еще очень далеко.
        0
        Интересно, начнёт ли решарпер работать быстрее с использованием этого API нежели своего парсера :)
          0
          Мне думается, что возможности API должны превосходить по скорости возможности стандартных парсеров. Но нам придётся подождать пару версий студии, пока окончательно выдет Рослин, а затем, наверное, ещё пару версий, пока решарпер перепишут под его использование (а это ещё совсем не факт).
          0
          это все, конечно, круто, но юзание Emit() не ново с пор .NET 2.0, а сейчас еще и System.Linq.Expressions. насколько мне понятно, вся сложность остается в распарсивании кода сишарпа.

          Может быть, мною многое было упущено при чтении о Roslyn, но, опять таки же насколько мне понятно, происходит компиляция в сборку, а не интерпретация. поэтому назревает очевидный вопрос: сгенеренная сборка когда выгружается из памяти? придумали ли что-то принципиально новое разработчики Roslyn?
            +2
            Может быть упустили, что «В прошлом наши компиляторы работали как черные ящики»? =)
              0
              ну то есть да, компилятор C# теперь написан на C#, ура! просто по ходу этого дела была выделена библиотека, которая и умеет компилировать «на лету».
              ага, и компилятор как сервис, и интерактивное окно, но только все-таки какова судьба сгенеренных сборок?
                0
                Будут такие же сборки, как и раньше. Просто теперь можно вторгаться в процесс компилирования.
            0
            Не знаю как вам, лично мне хочется из всего этого одного — аналога D'шного mixin в C#. Это, как мне кажется, наиболее полезная из всех возможных вещей, которые можно сделать для языка. Конечно, иметь объектную модель языка и манипулировать ей на этапе компиляции это безусловно хорошо, но большинству людей просто хочется вклинивать текст в существующие программы.
              0
              Насколько я понимаю, как раз mixin для C# и можно будет реализовать непосредственно в студии средствами Roslyn API.
              0
              Roslyn совсем недавно обновился. Вышел June 2012 CTP. Эх, ускорить бы их, чтобы побыстрее закончили :)
                0
                Увы, работы им ещё хватает, долго придётся ждать.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое