Roslyn Project — compiler as a service

    Не так давно в рамках конференции Build был доклад «Future directions for C# and Visual Basic» от Anders Hejlsberg, в котором анонсировался Roslyn Project. Сейчас об этой разработке известно не так много, но я постараюсь осветить наиболее интересные моменты, имеющиеся на данный момент.

    В настоящее время компиляторы C# и Visual Basic представляют из себя чёрный ящик — они берут исходный высокоуровневый код и выдают нам готовый IL-код. Roslyn Project представляет из себя compiler as a service, т.е. компилятор, предоставляющий разработчику API, позволяющее добираться до его внутренних данных. Теперь можно анализировать код и принимать участие в компиляции — проводить модификацию исходного кода, создавать дополнительную функциональность для C# и VB.


    Среди прочего Roslyn Project предоставляет 4 вида API, на основе которых будут построены Language serivces (они указаны в скобках):
    • SyntaxTree (Formatter, Colorizer, Outlining)
    • Emit API (Edit And Continue)
    • Symbol API (Object Browser, Navigate To)
    • Binding & Flow Analysis API (Go To Definition, Extract Method, Signature Help, Quick Info, Rename, Find All References, Completion List)


    Во время доклада была показана ещё одна интересная функциональность проекта — это Copy Paste C#-кода в VB.NET и обратно.

    На текущий момент Roslyn Project ещё не выпущен, но CTP (Community Technology Preview) можно будет посмотреть недели через две, а полноценно он выйдет в свет вместе с C# vNext (версия C#, которая будет после C# 5.0) и войдёт в Visual Studio.

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

      0
      А что это на практике дает помимо кросс-языкового копипаста?
        +3
        Например возможность использовать АОП «из коробки».
          0
          Да хотя-бы то, что ASPX и сборки XMLSerializer-а можно будет компилировать без создания временных файлов.
            +2
            Возможностей очень много: анализ кода (рефакторинг, подсчёт метрик и т.п.), трансляция кода, модификация исходной функциональности языков.
              +1
              метапрограммирование
            0
            Наконец-то можно будет манипулировать синтаксическим деревом, а не байткодом. Для ряда задач это существенно упростит работу, которую через разнообразные Cecil-ы было делать очень непросто. Собственно даже сам компилятор от MS часть работы делает на уровне дерева, а не байткода — например, переписывает IEnumerator+yield функции в классы…
              0
              Mono.CSharp чем не устраивает? На нём всякие REPL делать неимоверно удобно, API богатое, всё это счастье выполнено в виде библиотеки открытыми исходниками.
                +3
                Можно было кратко описать примеры, которые были на видео по ссылке:
                1. Компиляция строк в код в рантайме, например, можно строку «int sum(int x, int y) {return x+y;}» преобразовать в делегат парой строк кода.
                2. Изменение кода через контекстное меню visualstudio (я так понимаю, что-то вроде расширений для visualstudio), например, все авто-свойства класса преобразовать в свойства для интерфейса INotifyPropertyChanged. (Но тут речь именно о модификации исходного кода, а не влияния на процесс компиляции)
                3. Преобразование кода из одного языка в другой при копировании, о чём написано выше.
                4. Интерактивный режим, как в F#, когда можно вводить код и он будет исполняться по мере ввода.

                Честно говоря, я так и не увидел того, чего так хотелось — метапрограммирования, хотя многие надеялись увидеть его уже в C# 5.0

                Надеюсь оно всё таки будет, т.к лично моё мнение — показанные возможности не будут иметь столь широкого применения.

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

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