none
Преобразование синтаксиса C# в .Net Core

    Вопрос

  • Доброе утро!

    Как в открытых исходных кодах найти, во что и как преобразуется та или иная конструкция языка, например, ключевое слово for?

    Заранее благодарен за помощь.

Ответы

  • Найти что-либо в исходном коде компилятора не так то просто. Классы кодогенерации расположены в каталоге roslyn/src/Compilers/CSharp/Portable/CodeGen/. Поиском по github можно найти то, что вам нужно.

    Однако, выражение for несколько особое - для него нет определенной процедуры кодогенерации, вместо этого компилятор предварительно заменяет его на эквивалентную последовательность выражений с использованием goto, условных переходов и инкрементов - это преобразование реализовано здесь: https://github.com/dotnet/roslyn/blob/master/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_ForStatement.cs

                // for (initializer; condition; increment)
                //   body;
                //
                // becomes the following (with block added for locals)
                //
                // {
                //   initializer;
                //   goto end;
                // start:
                //   body;
                // continue:
                //   increment;
                // end:
                //   GotoIfTrue condition start;
                // break:
                // }
    Эта последовательность уже подается на вход кодогенерации и соответственно генерируются IL-инструкции для этих операции (например для goto EmitGotoStatement генерирует инструкцию Br)

    Намного проще изучать генерируемый компилятором код практически - скомпилировав его и открыв бинарник утилитой IL Disassembler.

     
    • Изменено VadimTagil 17 мая 2019 г. 10:24
    • Помечено в качестве ответа Энтомолог 17 мая 2019 г. 19:40
  • Проще всего также, практически - изучением генерируемого JIT ассемблерного кода в отладчике: https://docs.microsoft.com/ru-ru/visualstudio/debugger/how-to-use-the-disassembly-window?view=vs-2019 CoreCLR в части кодогенерации написана на С++, поэтому, если вы не знаете этот язык хотя бы на уровне чтения, вы не сможете извлечь эту информацию из исходников.

    "Я вижу, что разработчикам есть, куда стремиться для взаимопонимания с пользователями"

    Разработчикам чего? C#/.NET Core? Вроде и так открыты на полную, все в open source - и компилятор, и платформа, и документация по ним. Статьи в блогах по новым возможностям постоянно публикуются. Каналы для обратной связи тоже есть - как github issues, так и средство отправки отзывов из самой студии. Хотя материалов на русском языке действительно немного, если вы об этом.

    • Помечено в качестве ответа Энтомолог 2 июня 2019 г. 7:39

Все ответы

  • Найти что-либо в исходном коде компилятора не так то просто. Классы кодогенерации расположены в каталоге roslyn/src/Compilers/CSharp/Portable/CodeGen/. Поиском по github можно найти то, что вам нужно.

    Однако, выражение for несколько особое - для него нет определенной процедуры кодогенерации, вместо этого компилятор предварительно заменяет его на эквивалентную последовательность выражений с использованием goto, условных переходов и инкрементов - это преобразование реализовано здесь: https://github.com/dotnet/roslyn/blob/master/src/Compilers/CSharp/Portable/Lowering/LocalRewriter/LocalRewriter_ForStatement.cs

                // for (initializer; condition; increment)
                //   body;
                //
                // becomes the following (with block added for locals)
                //
                // {
                //   initializer;
                //   goto end;
                // start:
                //   body;
                // continue:
                //   increment;
                // end:
                //   GotoIfTrue condition start;
                // break:
                // }
    Эта последовательность уже подается на вход кодогенерации и соответственно генерируются IL-инструкции для этих операции (например для goto EmitGotoStatement генерирует инструкцию Br)

    Намного проще изучать генерируемый компилятором код практически - скомпилировав его и открыв бинарник утилитой IL Disassembler.

     
    • Изменено VadimTagil 17 мая 2019 г. 10:24
    • Помечено в качестве ответа Энтомолог 17 мая 2019 г. 19:40
  • Так, а как понять работу шифровки IL, когда она тоже в платформенный код преобразуется? Я вижу, что разработчикам есть, куда стремиться для взаимопонимания с пользователями.
  • Проще всего также, практически - изучением генерируемого JIT ассемблерного кода в отладчике: https://docs.microsoft.com/ru-ru/visualstudio/debugger/how-to-use-the-disassembly-window?view=vs-2019 CoreCLR в части кодогенерации написана на С++, поэтому, если вы не знаете этот язык хотя бы на уровне чтения, вы не сможете извлечь эту информацию из исходников.

    "Я вижу, что разработчикам есть, куда стремиться для взаимопонимания с пользователями"

    Разработчикам чего? C#/.NET Core? Вроде и так открыты на полную, все в open source - и компилятор, и платформа, и документация по ним. Статьи в блогах по новым возможностям постоянно публикуются. Каналы для обратной связи тоже есть - как github issues, так и средство отправки отзывов из самой студии. Хотя материалов на русском языке действительно немного, если вы об этом.

    • Помечено в качестве ответа Энтомолог 2 июня 2019 г. 7:39