Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП ЛР №5.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
325.12 Кб
Скачать

Промежуточный Язык и jit компилятор

Когда файлы с исходными текстами готовы, вы запускаете компилятор и получаете EXE или DLL. Эти EXE или DLL файлы очень похожи на PE (Portable Executable – портируемые выполняемые) файлы, по сути дела они и есть PE файлы с некоторыми отличиями.

Первое отличие заключается в том, что код в управляемых PE файлах не является командами процессора x86 или другим машинным кодом. Вместо этого компилятор создает код на Промежуточном Языке Microsoft (Microsoft intermediate language - MSIL). PE файл, содержащий MSIL может выполняться на платформе любого процессора, если операционная система, предоставляет .NET CLR.

Второе отличие заключается в том, что этот файл содержит метаданные, которые используются CLR для обнаружения и загрузки типов из файла, разположения объектов в памяти, вызова методов, управления ссылками, перевода MSIL в машинные коды, контроля за безопасностью и множества других задач.

Еще одно отличие – то что полученные компоненты не просто EXE или DLL файлы. Единица использования и размещения в .NET – это assembly. В зависимости от опций компилятора можно получить однофайловый assembly или модуль с управляемым кодом, распространяемый как часть многофайлового assembly. С точки зрения клиента, assembly – это именованная коллеция экспортируемых типов и ресурсов. С точки же зрения разработчика assembly, – это коллекция PE файлов, файлов ресурсов, HTML страниц, картинок и т.п.

MSIL – это процессоронезависимый промежуточный язык, созданный Microsoft. MSIL - язык более высокого уровня, чем большинство машинных языков. Он понимает типы объектов и имеет инструкции для создания и инициализации объектов, вызова виртуальных методы и непосредственной манипуляции элементами массива. Он даже имеет инструкции, которые оперируют исключениями. Как и любой другой машинный язык, MSIL может быть написан на ассемблере. Microsoft предоставляет ассемблер и дизассемблер для MSIL.

Когда вы собираете управляемую программу, модуль импортирует функцию _CorExeMain из .NET CLR (MSCorEE.dll). Когда пользователь запускает программу, загрузчик операционной системы переходит к точке входа внутри выполняемого блока. Код в выполняемом блоке просто передает управление функции _CorExeMain, содержащейся внутри MSCorEE.dll. CLR находит точку входа управляемого модуля и з атем начинает выполнять управляемый код MSIL выполняемого блока.

Перед тем, как выполнять управляемый код CLR должен сначала скомпилировать управляемые MSIL инструкции в инструкции процессора. Здесь возникает типичная проблема: когда пользователь запускает программу, он не намерен ждать пока вся программа скомпилируется, тем более, что большинство функций программы не будут вызваны. Поэтому CLR, компилирует MSIL код в инструкции процессора, когда функции непосредственно вызваны. Всякий раз, когда такая функция вызывается в будущем, сразу выполняется машинный код (а компилятор уже не вовлекается в процесс). Поскольку MSIL компилируется только в нужный момент (just-in-time - JIT), этот компонент CLR часто упоминается как JIT компилятор (JIT compiler) или JITter.

П еревод: исходный код-> компилятор -> exe/dll (IL и метаданные) –> загрузчик класса -> JIT компилятор с необязательной проверкой -> машинные коды -> выполнение -> проверки безопасности; runtime engine; Библиотеки класов (IL и метаданные); безопасный прекомпилированный код; вызов некомпилированного метода)

Программисты на низкоуровневых языках типа C или Cи++ возможно думают об эффективности выполнения описанной схемы. Ведь неуправляемый код компилируется сразу в инструкции процессора и при вызове просто выполняется. А в управляемом окружении чтобы выполнить код, MSIL должен компилироваться в инструкции процессора в реальном времени, потребляя большое количество памяти и мощности процессора.

Действительно, управляемый код выполняется медленнее и имеет больше накладных расходов, чем неуправляемый код. Но Microsoft предлагает инструмент, позволяющий выполнять полную компиляцию assembly в машинные коды и сохранять результат на диске. Когда assembly загрузится в следующий раз, будет использована эта сохраненная версия и приложение стартует быстрее.

Отметим особо, что в приложении можно совмещать фрагменты управляемого и неуправляемого кода. Неуправляемый код следует использовать для критичных к времени выполнения функций.