• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья [CLR C#] №1

dvlpr

floppy-диск
Пользователь
Регистрация
05.05.2020
Сообщения
6
Реакции
4
CLR - Common Language Runtime или общеязыковая среда выполнения.
CLR занимается управлением памятью, загрузкой сборок, безопасностью, обработкой исключений, синхронизацией. CLR все равно, на каком языке ты написал свой код, главное, чтобы твой компилятор поддерживал CLR. Данный фокус достигается тем, что компиляторы под CLR генерируют твой код в IL (управляемый / manage) код, чтобы в дальнейшем сгенерировать машинные команды. Важно знать, что IL является стековым языком, все инструкции заносят операнды в исполнительный стек и извлекают результаты из стека. Большим плюсом IL кода является его верификация - проверка кода IL и всех его операций, это гарант того, что код не будет обращаться к чужому участку памяти.
Каждый компилятор помимо IL кода, также создает полные метаданные(metadata) для каждого управляемого модуля. Проще говоря, метаданные — это набор таблиц данных, описывающих то, что определено в модуле, например типы и их члены.
Что касается управляемого кода, то только С++ позволяет разработчику создавать неуправляемый и управляемый код, встраивая их в единый модуль.

Модель выполнения кода в среде CLR:
1589485663536.png


Если говорить прямо, то CLR работает не с модулями, а со сборками (assembly). Сборка - абстрактное понятие группировки одного/нескольких управляемых модулей или файлов. Если в проекте есть зависимости, тогда сборка содержит в себе сведения о других сборках, таким образом, сборка становится самоописываемой (self-describing). Каждая сборка представляет собой исполняемое приложение или библиотеку DLL, содержащую набор типов для использования в исполняемом приложении.

Объединение управляемых модулей в сборку:
1589486292108.png


Для выполнения какого либо метода, IL-код должен быть преобразован в машинную команду. Такой работой занимается JIT-компилятор (Just-In-Time) среды CLR.
Как работает JIT?
Когда программа в ходе выполнения обращается к методу, тогда вызывается функция JITCompiler. JITCompiler известен вызываемый метод и его тип, он находит в метаданных IL-код вызываемого метода, проверяет его и компилирует в машинные команды, которые сохраняются в выделенном блоке памяти, адрес на данный блок памяти JITCompiler подставляет вместо адреса вызываемого метода во внутренних данных самого типа и передает управление коду в текущем блоке памяти. Важно понимать, что первый вызов метода является самым медленным, потому что повторной верификации и компиляции кода не производится. JIT-компилятор хранит машинные команды в динамической памяти, а это значит, что скомпилированный код уничтожается при завершении работы приложения!

Структура работы при вызове метода:

1589486941186.png



"CLR via C#" Джеффри Рихтер - электронную версию книги можно получить у меня.
Спасибо за внимание.
 
Последнее редактирование:
Рихтер это, обычно, вторая и обязательная книга, которую читает любой человек, изучающий Шарп. Зачем сюда просто из нее копипастить?
Копипаст - это статья в 30 стр, а это выжимка, сделана для того, чтобы объяснить первые главы, потому что у Рихтера эти главы для новичков не самые простые для понимания.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх