Ответы с форумов MSDN

C# - Какой код генерируется компилятором для цикла for?

Date: 17.05.2019 10:23:40

Найти что-либо в исходном коде компилятора не так то просто. Классы кодогенерации расположены в каталоге 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.

 

Message 247

Date: 18.05.2019 7:36:11

Проще всего также, практически - изучением генерируемого 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, так и средство отправки отзывов из самой студии. Хотя материалов на русском языке действительно немного, если вы об этом.


Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub