Опубликован: 13.10.2008 | Уровень: специалист | Доступ: платный
Лекция 3:

Phoenix

< Лекция 2 || Лекция 3: 12 || Лекция 4 >

Компоненты Phoenix

Компоненты преобразования кода

Phoenix принимает на вход код на C/C++, бинарные файлы и код на нескольких промежуточных языках. При этом Phoenix преобразует код в код для различных архитектур аппаратного обеспечения. Таким образом, компоненты преобразования кода являются одной из основных частей Phoenix.

Благодаря компонентам преобразования кода происходит отделение машинно-зависимых задач компилятора, типа работы с регистрами. Компоненты преобразования кода используются для преобразования кода в LIR (low-level intermediate representation) и генерации кода. То есть компоненты делают машинно-зависимую функциональность компиляторов повторно используемой.

Для преобразований между различными архитектурами аппаратного обеспечения или различными промежуточными представлениями кода используется специальный язык. Язык носит название Grand Unified Retargeting Language (GURL) и предназначен для решения следующих задач:

  • генерация ассемблера и дизассемблирования;
  • задачи фаз кодирования и раскодирования;
  • задачи фазы выбора кода машинных команд;
  • задачи фазы обработки инструкций;
  • задачи, определяемые разработчиком средства на основе Phoenix.

Компоненты обработки входных и выходных данных

Эти компоненты обрабатывают промежуточный язык компилятора (Compiler Intermediate Language - CIL), PE-файлы (Microsoft Portable Executable), COFF-файлы (Microsoft Common Object File Format), файлы с кодом на промежуточном языке MSIL (Microsoft Intermediate Language), сборки и т. д.

Средства управления

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

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

Инфраструктура потоков данных

Phoenix предоставляет инфраструктуру для анализа потоков данных и выполнения преобразований. Инфраструктура поддерживает прямой и обратный проходы для итеративного и неитеративного анализа.

Сборщик мусора (Garbage Collector - GC)

Инфраструктура Phoenix предоставляет общую среду для поддержки сбора мусора во время исполнения. Инфраструктура поддерживает:

  • генерацию кода для GC;
  • отслеживание и журналирование жизненного цикла локальных объектов.

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

Графы

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

Коллекции

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

Все структуры данных из пространства Collections поддерживают операции New(), Delete(), Insert(), Remove(), Iterate(), Count(), Push\Pop. Операция New создает коллекцию. Операция Delete удаляет коллекцию. Операция Insert добавляет элемент в коллекцию. Операция Remove удаляет элемент из коллекции. Операция Iterate позволяет переходить от одного элемента коллекции к следующему. Операция Count подсчитывает число элементов в коллекции. Операция Push добавляет элемент в начало или конец коллекции, а операция Pop выбирает элемент. При этом операция Push запрашивает новую память под коллекцию большего размера, копирует все элементы старой коллекции в новую область памяти и дописывает к ним новый элемент. Аналогично Pop удаляет элемент.

Использование псевдонимов (Aliasing)

Пакет использования псевдонимов отслеживает, как переменные ссылаются на области памяти и как эти связи меняются в результате выполнения инструкций программы. Технологии анализа и преобразования программ используют псевдонимы для определения влияния инструкции на переменные программы. Инструкции влияют на переменные, либо напрямую ссылаясь на имя переменной, либо создавая ссылки, называемые также псевдонимами. Само понятие "псевдоним" означает ситуацию, когда две и более переменных ссылаются на одну область памяти.

Lifetime (время жизни)

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

Обработка исключений

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

Расширения (plug-in)

Под plug-in в Phoenix понимается программный модуль, написанный пользователем инструментального средства. К примеру, на основе Phoenix было разработано инструментальное средство для компиляции, после чего пользователь этого средства решил расширить его функциональность и создал plug-in. Plug-in исполняется компилятором на основе Phoenix.

При этом расширяющий модуль имеет полный доступ к внутренним структурам данных компилятора.

Модуль может добавлять новые фазы компиляции, давать команду пропустить или заменить обработчики существующих. Plug-in может добавлять дополнительный код в каждую компилируемую функцию (например для профилирования). Кроме того, он может сохранять промежуточное представление для компилируемой функции, например с целью последующего изучения ее модификаций при оптимизации. Таким образом, plug-in может журналировать деятельность компилятора и влиять на нее самым разным образом.

Итоги

Phoenix представляет собой инфраструктуру разработки различных средств анализа, оптимизации и тестирования программного кода. Phoenix предоставляет множество строительных блоков, реализованных на основе промежуточного представления - Common Intermediate Representation (CIR). Phoenix может быть использован в задачах генерации кода для различных архитектур процессоров.

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

< Лекция 2 || Лекция 3: 12 || Лекция 4 >
Ринат Гатауллин
Ринат Гатауллин

Здравствуйте. Интересует возможность получения диплома( https://intuit.ru/sites/default/files/diploma/examples/P/955/Nekommerch-2-1-PRF-example.jpg ). Курс пройден. Сертификат не подходит. В сертификате ошибка, указано по датам время прохождения около 14 дней, хотя написано 576 часов.

Вячеслав Кузнецов
Вячеслав Кузнецов

Здравствуйте.

Как оплатить курс?

Дмитрий Черкасов
Дмитрий Черкасов
Россия, Москва
Иван Герасимов
Иван Герасимов
Россия, калининград, Балтийский институт экономики и финансов, 2013