20100307 virtualization igotti_lecture05

348 views
297 views

Published on

Published in: Technology, News & Politics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
348
On SlideShare
0
From Embeds
0
Number of Embeds
57
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

20100307 virtualization igotti_lecture05

  1. 1. Системы динамической компиляции в JVM Николай Иготти
  2. 2. Требования к компилятору • Не требуется стандартом Java • Основное поведенческое требование - прозрачность • Функционально – только для повышения производительности • Что делает компилятор? • Степень управляемости • Нежелательный источник недетерминизма 2
  3. 3. Что компилировать? • Всѐ • Классы • Методы • Базовые блоки • Ещѐ? 3
  4. 4. Когда компилировать? • Предварительно (AOT)  Больше ресурсов на оптимизацию  Предсказуемый результат, проще поиск ошибок в компиляторе  Новый стандарт на промежуточное представление (или компиляция в существующие стандарты)  Сложности деоптимизации • На лету (JIT)  Больше информации для оптимизации • Аппаратное обеспечение • Контекст компиляции • Типичное поведение  Деоптимизация по мере необходимости  Что компилировать (déjà vu)? • Комбинированные подходы  Подсказки JITу  Сохранение исходного байткода 4
  5. 5. Профилировка и динамическая оптимизация • Цикл разработки: написание – компиляция- отладка – профилировка – оптимизация • Объекты оптимизации: hotspots, common paths, дорогие операции • Чем может помочь динамический профилятор+компилятор:  Обнаружение часто исполняемого кода  Оптимизация под common path  Исключение дорогих операций  Реоптимизация при изменении нагрузки 5
  6. 6. Простой компилятор • Параметризированные шаблоны – кусочки машинного кода • Трансляция сводится к последовательной замене байткодов на шаблоны • Выигрыш:  Не нужен диспетчер переходящий к следующему байткоду  Можно хранить часто используемые значения, например TOS в машинных регистрах  Ещѐ? 6
  7. 7. Оптимизирующий комилятор • Анализ реальной семантики байткода (в IR) • Оптимизация:  Стандартные компиляторные оптимизации (какие?)  Инлайнинг  Доступы к памяти  Выделение машинных регистров  Обработка NPE  Блокировки  Барьеры коллектора  Построение кода оптимизированного под типичное исполнение и типичные данные 7
  8. 8. Деоптимизация и реоптимизация • Динамический компилятор делает оптимистичекие предположения • Tempora mutantur… • Может быть необходимо остановить исполнение скомпилированного кода и получить его состояние • ... et nos mutamur in illis • Заново породить код с учетом новых условий • Продолжить исполнение кода из заданного состояния 8
  9. 9. Компилятору необходимо взаимодействие с… • Коллектором • Интерпретатором (если есть) • Менеджером блокировок • Менеджером исключений Ява • Загрузчиком классов (зачем?) • Отладчиком Ява (зачем?) • Менеджером исключительных ситуаций ОС • Коллектор релоцирует ссылки в порождѐнном коде 9
  10. 10. Вопросы • Чем ещѐ хорош AOT? • Какой язык более “динамический” – Java или C++? Как это влияет на компиляторы с этих языков? • Какие оптимизации осмысленны на уровне Java -> байткод, а какие на уровне байткод -> машинный код? • Как reflection может влиять на дизайн компилятора (AOT?, JIT?) 10

×