русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

JIT-компиляция


Дата добавления: 2015-01-16; просмотров: 1852; Нарушение авторских прав


Ключевой особенностью выполнения программ в среде .NET является JIT-компиляция. Аббревиатура JIT расшифровывается как Just-In-Time, и термин JIT-компиляция можно перевести как «точно во время», или «на лету». JIT-компиляция заключается в том, что CIL-код, находящийся в запускаемой сборке, тут же компилируется в машинный код, на который затем передается управление.

Рассмотрим порядок исполнения на примере простого управляемого EXE файла с кодом на языке C# с одним модулем Main, который предусматривает вывод в консоль последовательно двух фраз.

При исполнении кода в ИСР:

Компилятор C# транслирует код в CIL. Результат в файле не сохраняется, а помещается в оперативную память по определенному адресу.

Среда CLR получает этот адрес и анализирует содержащийся там CIL код. В нем CLR находит все типы, на которые ссылается код Main. Модуль Main() ссылается на единственный тип - Console, и CLR выделяет память под него. Эта структура содержит записи для каждого метода, определенного в типе Console. Каждая запись содержит адрес, по которому можно найти реализацию метода. При инициализации этой структуры CLR заносит в каждую запись адрес внутренней, недокументированной функции, содержащейся в самой CLR – JITCompiler (JIT-компилятор).

Далее последовательно компилируются методы в модуле.

Когда Main первый раз обращается к WriteLine, вызывается функция JITCompiler. Функции JITCompiler известен вызываемый метод и тип, в котором он определен. JITCompiler ищет в метаданных соответствующей сборки IL-код вызываемого метода.

Затем JITCompiler проверяет и компилирует CIL-код в собственные машинные команды, которые сохраняются в динамически выделенном блоке памяти.

После этого JITCompiler возвращается к внутренней структуре данных типа и заменяет адрес вызываемого метода адресом блока памяти, содержащего готовые машинные команды.



В завершение JITCompiler передает управление коду в этом блоке памяти. Этот код — реализация метода WriteLine (той его версии, что принимает параметр String). Из этого метода управление возвращается в Main, который продолжает выполнение в обычном порядке.

Затем Main обращается к WriteLine вторично. К этому моменту код WriteLine уже проверен и скомпилирован, так что обращение к блоку памяти производится, минуя вызов JITCompiler. Отработав обращение, метод WriteLine возвращает управление Main. Рисунок показывает, как выглядит ситуация при повторном обращении к WriteLine.

Снижение производительности наблюдается только при первом вызове метода. Все последующие обращения выполняются «на полной скорости»: повторная верификация и компиляция не производятся. JITCompiler хранит машинные команды в динамической памяти. Это значит, что скомпилированный код уничтожается по завершении работы приложения. Так что, если потом снова вызвать приложение или если одновременно запустить второй его экземпляр (в другом процессе ОС), JIT-компилятор заново будет компилировать CIL-код в машинные команды.

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

Программы на CIL переводятся в исполняемый бинарный код реального процессора лишь непосредственно перед исполнением метода. Используется динамическая компиляция «на лету». При этом выполняется довольно сложный типовой анализ программы и проверки условий корректности кода. Полученный код метода сохраняется в оперативной памяти и исполняется. Операция повторяется для каждого вызываемого метода. После завершения получается бинарный файл, сохраняемый на диске, который может затем исполняться без повторной компиляции.

Внимание. Бинарный файл имеет формат управляемый PE, может исполняться только на машине с Net.Framerwotk.

Таким образом, осуществляется интерпретация кода с компилированием последовательно вызываемых методов. Лучше употреблять вместо компиляции термин - трансляция.

Трансляция осуществляется автоматически. Программист может ничего не знать о командах CIL и JIT-компиляторе.

 



<== предыдущая лекция | следующая лекция ==>
Понятие сборки (assembly) | Просмотр метаданных


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 2.943 сек.