КОМПИЛЯТОР КАК СЕРВИС



                 СЕРГЕЙ ЗВЯГИН
                INGATE DEVELOPMENT
           СПЕЦИАЛЬНО ДЛЯ GetDev.NET
Эволюция


            C# 5.0 + VB 11.0
                                   Windows Runtime + async
         C# 4.0 + VB 10.0
                               Dynamic
      C# 3.0 + VB 9.0
                            LINQ
   C# 2.0 + VB 8.0
                        Generics
C# 1.0 + VB 7.0
                     Managed Code
Компилятор – черный ящик




     Исходный
                                 .NET сборка
        код
     Source code                  Source code
      Source code   Компилятор     Source code
Проблема

Лексический, синтаксический и
сематнический анализ кода выполняется
ещѐ до компиляции программы
Это позволяет подсвечивать
код, применять автоматический
рефакторинг, использовать IntelliSense
Решение

                                    Class
   Метапрограммирование                                  Read-Eval-Print Loop
                          public               Foo

       Объектная                      Field
                                                         Встраивание DSL
      модель языка
                          private                    X

                                      string




     Исходный
                                                                .NET сборка
        код
     Source code                                                 Source code
      Source code         Компилятор                              Source code
Roslyn APIs




                                                                                           Completion List




                                                                                                                                                                 Extract Method
                                                                          Object Browser




                                                                                                                                                Signature Help
                                                          Navigate To




                                                                                                             References




                                                                                                                                   Quick Info
                      Formatter




                                                                                                                                                                                  Definition
                                              Outlining




                                                                                                                                                                                  Continue
                                  Colorizer




                                                                                                                                                                                  Edit and
                                                                                                                          Rename
                                                                                                              Find All




                                                                                                                                                                                   Go To
  Language Service




    Compiler API                                                                                                     Binding and Flow
                       Syntax Tree API                           Symbol API                                                                                                       Emit API
                                                                                                                       Analysis APIs




                                                                        Symbols
  Compiler Pipeline               Parser                                                                                       Binder                                             IL Emitter
                                                                        Metadata
                                                                         Import
Roslyn API Layers

 Editor Services   Code Actions       Classification      Completion        Outlining         …




                    Code Formatting        Find All References     Name Simplification        …
  Services APIs

                                                 Workspace API




                   Syntax Tree    Symbol        Binding and Flow                         Scripting
  Compiler APIs                                                        Emit API
                       API          API           Analysis APIs                            APIs
Syntax Tree API – узлы
class C                                               CompilationUnit
{
    void M()
    {                                                 TypeDeclaration
    }
}// C
                                                     MethodDeclaration



                                               ParameterList       Block




var tree = SyntaxTree.ParseCompilationUnit("...");
Syntax Tree API – токены
class C                            CompilationUnit
{
    void M()
    {                      TypeDeclaration         EOF
    }
}// C
               class   C     {       MethodDeclaration       }



                            void      M      ParameterList           Block



                                               (         )       {           }
Syntax Tree API – вся информация о
дереве
class∙C                                     CompilationUnit
{
∙∙∙∙void∙M()
∙∙∙∙{                               TypeDeclaration           EOF
∙∙∙∙}
}// C
               class    SP      C         EOL         {         EOL        MethodDeclaration       }    // C   EOL



                 SPx4    void       SP       M        ParameterList                      Block



                                                          (         )       EOL



                                                                    SPx4      {       EOL        SPx4   }      EOL
Syntax Tree API – изменение узла
  class C                                                CompilationUnit
  {
      void M(int x)
           M()
      {                                          TypeDeclaration        EOF
      }
  }// C
                                class     C        {       MethodDeclaration        }



                                                  void      M      ParameterList            Block



                                                    (       Parameter
                                                                    (          ))       {           }
var oldList = method.ParameterList;
var newList = oldList.Update(
     openParenToken: oldList.OpenParenToken,      PredefinedType           x
     parameters: Syntax.SeparatedList(
         Syntax.Parameter(
             typeOpt: Syntax.ParseTypeName("int "),
                                                        int
             identifier: Syntax.Identifier("x"))),
     closeParenToken: oldList.CloseParenToken);

var newRoot = tree.Root.ReplaceNode(oldList, newList);
Компиляция

        Синтакси-
         ческое
         дерево     Компиляция
                     • Symbols
                     • Semantic
                       Model
                     • Flow Analysis
                     • Diagnostics
        Ссылки на    • Emit
         сборки
Workspace API
                      Host Environment

     События (нажатия клавиш)
                                           Применение результатов
                          Workspace



                           Solution           Solution2             Solutionn
                                              Редактирование

    Compilation      Project     Project


             Document     Document


             SyntaxTree
Code Actions API
      Code Action         Представление изменения кода
• Можно управлять изменением и предпросмотром того, что изменяем

      Code Issue          Отображение исходного кода
• Вызывается для любой ноды, токена или сущности
• Optional: Можно получить доступ к списку ошибок (Error Window)
• Optional: Можно получить доступ к Code Action

   Code Refactoring       Контекстно-зависимые Code Action
• Применяются к выделенному блоку кода в окне редактора
• Можно получить доступ к Code Action
ВОПРОСЫ?
СПАСИБО ЗА ВНИМАНИЕ!


         Сергей Звягин
      Ingate Development




        BingoRUS

Roslyn - компилятор как сервис

  • 1.
    КОМПИЛЯТОР КАК СЕРВИС СЕРГЕЙ ЗВЯГИН INGATE DEVELOPMENT СПЕЦИАЛЬНО ДЛЯ GetDev.NET
  • 2.
    Эволюция C# 5.0 + VB 11.0 Windows Runtime + async C# 4.0 + VB 10.0 Dynamic C# 3.0 + VB 9.0 LINQ C# 2.0 + VB 8.0 Generics C# 1.0 + VB 7.0 Managed Code
  • 3.
    Компилятор – черныйящик Исходный .NET сборка код Source code Source code Source code Компилятор Source code
  • 4.
    Проблема Лексический, синтаксический и сематническийанализ кода выполняется ещѐ до компиляции программы Это позволяет подсвечивать код, применять автоматический рефакторинг, использовать IntelliSense
  • 5.
    Решение Class Метапрограммирование Read-Eval-Print Loop public Foo Объектная Field Встраивание DSL модель языка private X string Исходный .NET сборка код Source code Source code Source code Компилятор Source code
  • 6.
    Roslyn APIs Completion List Extract Method Object Browser Signature Help Navigate To References Quick Info Formatter Definition Outlining Continue Colorizer Edit and Rename Find All Go To Language Service Compiler API Binding and Flow Syntax Tree API Symbol API Emit API Analysis APIs Symbols Compiler Pipeline Parser Binder IL Emitter Metadata Import
  • 7.
    Roslyn API Layers Editor Services Code Actions Classification Completion Outlining … Code Formatting Find All References Name Simplification … Services APIs Workspace API Syntax Tree Symbol Binding and Flow Scripting Compiler APIs Emit API API API Analysis APIs APIs
  • 8.
    Syntax Tree API– узлы class C CompilationUnit { void M() { TypeDeclaration } }// C MethodDeclaration ParameterList Block var tree = SyntaxTree.ParseCompilationUnit("...");
  • 9.
    Syntax Tree API– токены class C CompilationUnit { void M() { TypeDeclaration EOF } }// C class C { MethodDeclaration } void M ParameterList Block ( ) { }
  • 10.
    Syntax Tree API– вся информация о дереве class∙C CompilationUnit { ∙∙∙∙void∙M() ∙∙∙∙{ TypeDeclaration EOF ∙∙∙∙} }// C class SP C EOL { EOL MethodDeclaration } // C EOL SPx4 void SP M ParameterList Block ( ) EOL SPx4 { EOL SPx4 } EOL
  • 11.
    Syntax Tree API– изменение узла class C CompilationUnit { void M(int x) M() { TypeDeclaration EOF } }// C class C { MethodDeclaration } void M ParameterList Block ( Parameter ( )) { } var oldList = method.ParameterList; var newList = oldList.Update( openParenToken: oldList.OpenParenToken, PredefinedType x parameters: Syntax.SeparatedList( Syntax.Parameter( typeOpt: Syntax.ParseTypeName("int "), int identifier: Syntax.Identifier("x"))), closeParenToken: oldList.CloseParenToken); var newRoot = tree.Root.ReplaceNode(oldList, newList);
  • 12.
    Компиляция Синтакси- ческое дерево Компиляция • Symbols • Semantic Model • Flow Analysis • Diagnostics Ссылки на • Emit сборки
  • 13.
    Workspace API Host Environment События (нажатия клавиш) Применение результатов Workspace Solution Solution2 Solutionn Редактирование Compilation Project Project Document Document SyntaxTree
  • 14.
    Code Actions API Code Action Представление изменения кода • Можно управлять изменением и предпросмотром того, что изменяем Code Issue Отображение исходного кода • Вызывается для любой ноды, токена или сущности • Optional: Можно получить доступ к списку ошибок (Error Window) • Optional: Можно получить доступ к Code Action Code Refactoring Контекстно-зависимые Code Action • Применяются к выделенному блоку кода в окне редактора • Можно получить доступ к Code Action
  • 15.
  • 16.
    СПАСИБО ЗА ВНИМАНИЕ! Сергей Звягин Ingate Development BingoRUS

Editor's Notes

  • #5 Visual Studio – не только компилятор. Лексический, синтаксический и семантический анализ кода также выполняется на лету для подсветки синтаксиса, IntelliSense, автоматического рефакторинга и т.д.
  • #6 REPL - интерактивная среда программирование (скриптовые языки)embedded (or internal) domain-specific languages, implemented as libraries which exploit the syntax of their host general purpose language or a subset thereof, while adding domain-specific language elements (data types, routines, methods, macros etc.).