#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 код использует рефлексию, то происходит поиск по этим таблицам в памяти. Такой поиск неоптимизирован, использует сравнение строк, поэтому, как известно, рефлексия выполняется медленнее обычного кода.
Комментариев нет:
Отправить комментарий