Разработка сред управляемого исполнения на примере виртуальной машины Java Занятие 2 Салищев С.И.
Архитектура MRE Загрузчик IR Верификатор Планировщик Менеджер памяти GC Ядро Исполнитель Интерпретатор JIT компилятор Профилятор загрузка/cохранение Данных и кода Модель данных Внешний интерфейс Инициализация
Внешний интерфейс Вызов внешних неуправляемых функций Обратный вызов управляемого кода (callback) Передача данных между управляемым и неуправляемым кодом (marshaling) Копирование Копирование Обертывание и обратный вызов Обертывание и обратный вызов Закрепление объектов (pinning) Закрепление объектов (pinning) Указатель на неуправляемую память Указатель на неуправляемую память
Внешний интерфейс Java (JNI) Внешний модуль должен использовать JNI Копирование для примитивных типов (параметры и результат) Обертывание и обратный вызов для объектов (globalRef, localRef) Требует согласования с планировщиком Требует согласования с планировщиком Потери времени при вызове Потери времени при вызове Потери времени при доступе Потери времени при доступе Возможна изоляция управляемых данных Возможна изоляция управляемых данных Групповые операции с массивами Групповые операции с массивами Усложнение внешнего модуля Усложнение внешнего модуля Абстрактный неуправляемый массив (DirectBuffer)
Внешний интерфейс CLI Прямое управление раскладкой полей объекта Уменьшает гибкость системы Уменьшает гибкость системы Закрепление объекта в памяти и получение указателя Уменьшает гибкость менеджера памяти Уменьшает гибкость менеджера памяти Потенциальная угроза безопасности Потенциальная угроза безопасности Прямая работа с указателями из управляемого кода Потенциальная угроза безопасности Потенциальная угроза безопасности pinvoke (.NET) Связывание произвольной внешней функции Связывание произвольной внешней функции копирование объектов с изменением раскладки полей копирование объектов с изменением раскладки полей
Промежуточное представление (Intermediate Representation) Задача Компактность Компактность Стандартизация Стандартизация Простота интерпретации и компиляции Простота интерпретации и компиляции Основные виды IR Язык стековой машины Язык стековой машины Язык регистровой машины Язык регистровой машины
Сравнение (IR) Язык регистровой машины На 45% меньше операций доступа к памяти* На 45% меньше операций доступа к памяти* Возможность оптимизации на уровне IR Возможность оптимизации на уровне IR Используется в статических и оптимизирующих JIT компиляторах Используется в статических и оптимизирующих JIT компиляторах Язык стековой машины На 25% более компактен* На 25% более компактен* Сохраняет семантику исходного кода Сохраняет семантику исходного кода Проще для интерпретации и шаблонной компиляции Проще для интерпретации и шаблонной компиляции Используется в JBC и CIL Используется в JBC и CIL * VEE05, Virtual Machine Showdown: Stack Versus Registers, Yunhe Shi et al.
Типы команд Простые Стековая арифметика Стековая арифметика Доступ к локальным данным Доступ к локальным данным Ветвления ВетвленияОбъектные Создание объектов Создание объектов Доступ к полям Доступ к полям Вызов методов Вызов методов Исключения Исключения
Сравнение CIL и JBC CIL по семантике расширение JBC Добавлены целые без знака Добавлены целые без знака Поддержка рефлексии (ldtoken) Поддержка рефлексии (ldtoken) Размещение памяти на стеке (localloc) Размещение памяти на стеке (localloc) Работа с внутренними ссылками Работа с внутренними ссылками Работа с указателями Работа с указателями обертывание (box/unbox) обертывание (box/unbox)
Формат класса Java ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count]; }
Верификация 1.Проверка формата класса 2.Проверка данных класса final классы и методы не перекрыты final классы и методы не перекрыты Определен суперкласс Определен суперкласс Формат пула констант Формат пула констант 3.Проверка кода класса Размер стека, тип данных на стеке Размер стека, тип данных на стеке Правильный тип локальной переменной при доступе Правильный тип локальной переменной при доступе Число аргументов при вызове метода Число аргументов при вызове метода Необходимое количество и тип аргументов инструкций Необходимое количество и тип аргументов инструкций 4.Проверка ссылок Наличие классов, методов и полей Наличие классов, методов и полей Права доступа Права доступа
Интерпретация IR Переключение по первому байту инструкции Требует глубокой оптимизации Поддержка супер-инструкций
Компиляция IR Динамическая (JIT) Шаблонная компиляция Шаблонная компиляция Оптимизирующая компиляция Оптимизирующая компиляция Различные уровни оптимизации Различные уровни оптимизации Предварительная (AOT) Статическая Статическая Сохранение кода между сессиями Сохранение кода между сессиями
Сравнение производительности
Менеджер памяти Выделение памяти под объекты Обнаружение живых объектов Сборка мусора
Планировщик Создание и разрушение нитей Распределение нагрузки между процессорами Приостановка и возобновление нитей Для синхронизации управляемого кода Для синхронизации управляемого кода Для сборки мусора Для сборки мусора Для синхронизации неуправляемого кода и сборки мусора Для синхронизации неуправляемого кода и сборки мусора