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

252
24 ноября 2017, 04:10

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

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

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

Answer 1

На каком этапе и какой из компиляторов определяет для разрядности какого процессора нужно преобразование?

Компилятор C# → IL не обращает внимания на разрядность вообще. Он компилирует для формальной стековой машины, а не для физического процессора.

JIT-компилятор запускается в рантайме, при запуске приложения на целевой машине. Соответственно он совершенно точно знает целевой процессор и целевую платформу, и генерирует код для неё. Этот код существует лишь в памяти (а это значит, что при повторном запуске программы JIT-компиляция будет произведена повторно).

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

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

Как программно узнать версию exe?

В свойствах файла есть поле "Версия файла"Как программно получить версию?

213
Изменить Background у выбранного TabItem программно

Изменить Background у выбранного TabItem программно

У меня есть TabControl и у него 4 объекта TabItemФон у каждого я менял, но у выбранного Item'a меняется фон на свой

209