Продолжается подписка на наши издания! Вы не забыли подписаться?

Phoenix как инструмент исследований и обучения

Автор: John Lefor
Опубликовано: 28.02.2006

Проект Phoenix – это совместный проект Developer Division и Microsoft Research, который должен лечь в основу всех компиляторов от Microsoft (традиционных, JIT и pre-JIT) на следующие десять-пятнадцать лет. Исходной целью было создание бэкенд-компилятора, который легко было бы перенацелить на работу с разнообразными аппаратными архитектурами, который использовал бы один и тот же исходный код для обычной компиляции, а также JIT и pre-JIT сценариев, и который упростил бы внедрение новых средств оптимизации, что немаловажно для развития платформы .NET. По мере развития проекта стало ясно, что имеется возможность создания фреймворка, нацеленного на оптимизацию и анализ кода, отвечающего поставленным задачам и способного стать основой для инструментов, разрабатываемых Microsoft Research.

В дизайн намеренно была заложена расширяемость как ключевое требование для создания качественного backend-а. Возможности расширения Phoenix позволяют создавать средства анализа качества, не обращая внимания на все детали, как правило, связанные с этими средствами, поскольку фреймворк уже умеет работать с ними.

В сущности, Phoenix позволяет разработчикам и исследователям, работающим над проблемами post-frontend дизайна, анализа и кодогенерации, сосредоточиться на своей области исследований, не пренебрегая качеством продукта.

Обзор Phoenix

Общий поток управления в Phoenix определяется приложением, использующим Phoenix API (доступный как в управляемом, так и в неуправляемом режиме). API позволяет вызывающей стороне создать серию фаз обработки, в течение которых производится создание, изменение и анализ IR, и, во многих случаях, заключительной фазой будет запись IR в формат, пригодный для исполнения (PE). Рассмотрим для примера, как Phoenix используется при создании средства, внедряющего инструментирующий код в исполняемый файл. В Phoenix RDK есть пример программы, делающей именно это.

Сперва инструментируемую программу нужно преобразовать в Phoenix IR. Чтобы создать IR, вызывается одна из программ считывания (пользователи могут добавлять собственные считыватели для форматов, не поддерживаемых Microsoft). Если преобразуемая программа – бинарный native-код, будет использоваться считыватель PE, в случае MSIL - считыватель MSIL. Сейчас у нас есть также ранняя версия считывателя AST. В данное время она работает с AST на C++ и C#, разрабатываемыми Microsoft. В любом случае IR строится по исходной программе. В идеальном мире можно было бы построить одинаковый IR независимо от подаваемого на вход формата. Реальность же такова, что доступная информация зависит от природы подаваемого на вход файла, вследствие чего в IR будет содержаться разная информация, и "уровень" IR будет зависеть от исходного формата. Использующее Phoenix приложение должно либо поддерживать какой-то один формат, либо вести себя по-разному в зависимости от подаваемых на вход данных.

После создания IR средство инструментирования анализирует IR и определяет, куда вставить инструментирующий код. Phoenix предоставляет ряд стандартных средств анализа IR (потока управления, потока данных, SSA и т.д.), и, разумеется, ничто не мешает написать собственные. Если цель инструментирования – вставить код во входную точку каждой функции, то все что нужно - перебрать инструкции, определенные во входном файле, используя итератор предоставляемый Phoenix, и вставить дополнительные инструкции в IR. При инструментировании может потребоваться создать некие данные, помогающие привязать инструментирующий код к исходному коду. Предполагая, что вставляемый код вызывает DLL, нужно вставить в IR соответствующую директиву импорта.

Кроме возможностей создавать новые "фазы", считыватели (reader) и кодогенераторы (writer), есть механизм расширения IR аннотациями, встраиваемыми на фазе анализа. Поскольку IR трансформируется на пути от IR высокого уровня (High level IR, HIR) до конечного IR уровня инструкций/адресов, нужно быть уверенным, что любые аннотации корректно обрабатываются на каждой фазе; за это отвечает добавляемая функциональность, но Phoenix предоставляет API, обеспечивающие это.

Наконец, измененный IR конвертируется в исполняемый файл. В случае native-компиляции для создания исполняемого файла используется PE-линкер/генератор (также входящий в состав Phoenix).

Phoenix как backend-компилятор

Одно из назначений Phoenix – backend компилятора. Phoenix проектировался и разрабатывался как очень гибкий и качественный backend компилятора. В сущности, backend – это просто приложение, написанное поверх фреймворка Phoenix, использующее функциональность Phoenix для считывания некоторых входных форм (AST, MSIL, CIL, бинарных файлов, …) и выдачи некоторых форм наружу (бинарных файлов, pre-JIT, JIT).

Дизайн и реализация Phoenix – это что-то вроде фреймворка для программистов. Этот фреймворк обеспечивает преобразование многих типов представлений кода в "стандартную" промежуточную форму, служащую для анализа и трансформации (что и должен делать оптимизирующий backend).

С таким фреймворком и поддержкой профилирования, а также другими средствами анализа, не слишком типичными для backend-ов, Phoenix дает возможность сосредоточиться на конкретных проблемах программирования вместо создания вспомогательных средств.

Если бы фреймворк Phoenix позволял использовать только стандартный анализ, он был бы полезным, но недостаточно гибким. Phoenix можно расширять несколькими способами. Он поддерживает добавление новых форм анализа, модификации IR, а также добавление считывателей и кодогенераторов. В RDK входят примеры исходного кода программ, показывающие, как создаются наиболее интересные средства анализа, считывания и генерации кода. Одна из важных целей академической программы Phoenix – выявить другие примеры и уровни расширяемости, которые сделают Phoenix еще более полезным средством для исследователей. Благодаря откликам от небольшой группы исследователей, использующих Phoenix, мы уже внесли существенные изменения в примеры кода, документацию и дизайн, и мы рассчитываем поступать так же и дальше.

Microsoft Research Tools

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

Phoenix Plug-Ins

Инструменты, использующие технологию Phoenix, например, экспериментальный backend-компилятор C++, поддерживают плагины (plug-ins): возможность для пользователей создавать библиотечные модули (.DLL), которые подгружаются во время работы инструмента. Это дает плагинам полный доступ к внутренним структурам данных и методам инструмента – и возможность модифицировать, расширять или полностью заменять своим кодом код, используемый по умолчанию. Например, исследователь, заинтересованный в конкретной оптимизации кода, может с помощью Phoenix создать “plug-in” для существующего Phoenix-компилятора. Этот “plug-in” реализует его идеи – но использует все остальные фазы, предоставляемые компилятором. Такая расширяемость позволяет исследовательским проектам использовать возможности Phoenix, устраняя необходимость в создании большой инфраструктуры инструментов, но позволяя проводить эксперименты над программным обеспечением.

Запланированные продукты, основанные на Phoenix Based Products


Рисунок 2.

Phoenix в образовании

Phoenix может пригодиться во многих интересных образовательных программах.

Поскольку Phoenix - это компилятор, а компоненты анализа и генерации кода можно изменять, он хорошо подходит для курсов дизайна языков, кодогенерации и оптимизации.

Благодаря тому, что Phoenix легко перенацеливается на новые аппаратные архитектуры, он может принести пользу в курсах разработки аппаратного обеспечения.

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

Лицензирование Phoenix

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


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

Copyright © 1994-2016 ООО "К-Пресс"