Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Процесс преобразования C# кода в машинный код

#c_sharp #компиляция


Доброго времени суток. Сейчас изучаю технический аспект прохождения высокоуровневого
языка к командам процессора на его выполнения на примере C#. Возникли некоторые не
ясности, в связи с чем и обращаюсь за помощью. Составил маленькую диаграмму по прохождению
кода с IDE к процессору и возникли вопросы:


На каком этапе и какой из компиляторов определяет для разрядности какого процессора
нужно преобразование?
Как преобразуются метаданные из манифеста в компиляции к машинному языку?
Правильно ли понял данную тему? Если нет, то прошу поправить.
Заранее спасибо.


P.S. Прикрепляю маленький скриншот, как я представляю себе этот процесс.

    


Ответы

Ответ 1



На каком этапе и какой из компиляторов определяет для разрядности какого процессора нужно преобразование? Компилятор C# → IL не обращает внимания на разрядность вообще. Он компилирует для формальной стековой машины, а не для физического процессора. JIT-компилятор запускается в рантайме, при запуске приложения на целевой машине. Соответственно он совершенно точно знает целевой процессор и целевую платформу, и генерирует код для неё. Этот код существует лишь в памяти (а это значит, что при повторном запуске программы JIT-компиляция будет произведена повторно). Кроме того, возможны различные варианты AOT-компиляции (например, ngen или .NET Native) вместо JIT, при которой нативный для процессора образ создаётся из IL-кода заранее, до запуска приложения. При этом либо нужно заранее указывать целевую платформу (для .NET Native), либо компиляция сама проходит на целевой платформе (ngen).

Ответ 2



Только на этапе компиляции IL в машинный код генерируются специфические для разрядности команды. Если компилировать .NET сборку для x86/x64/Any Cpu, то IL код различаться не будет, будет различие только в 1 байте в метаданных сборки. В самом IL нет специфических команд, все они общие для всех разрядностей. Метаданные просто превращаются в некоторые структуры в памяти процесса. Когда .NET код использует рефлексию, то происходит поиск по этим таблицам в памяти. Такой поиск неоптимизирован, использует сравнение строк, поэтому, как известно, рефлексия выполняется медленнее обычного кода.

Комментариев нет:

Отправить комментарий