Строительные блоки
Предлагаются строительные блоки
неэвристической части компиляторных технологий в исходных текстах или в виде
библиотек. Это дает потребителям возможность создавать свои собственные
компиляторы на базе наших строительных блоков с минимальными затратами на
разработку и поддержку готовых продуктов. К основным базовым блокам относятся:
инфраструктурная часть компилятора (контейнеры различных типов, математическая
библиотека и т.д.), аналитические компоненты (анализ потока данных и управления,
анализ зависимостей и т.д.), заготовки для оптимизаций высокого уровня без
эвристической части, заготовки для абстрактной интерпретации программ.
Блоки реализованы на языке C++. Документация
создается в автоматической системе документирования Doxygen. Вся документация
размечена XML тегами, что позволяет скомпилировать документацию для разных
целей в разных видах с разным уровнем детализации.
Часть документации компилируется непосредственно из кодов, часть — из описаний.
Можно, например, скомпилировать отдельно описания интерфейсов или только
высокоуровневую информацию по блокам. Документация всегда поддерживается в
свежем состоянии.
На настоящий момент блоки уже оттестированы в технологической цепочке
компиляторов GCC. Компиляция с языков C, C++, FORTRAN оттестирована в целевую
архитектуру x86. Мы сейчас можем производить тестирование в любую целевую
архитектуру, поддержанную в технологической цепочке GCC — x86, Itanium, SPARC,
MIPS, PowerPC, Cell. Все известные архитектуры поддерживаются GCC.
Замкнутые блоки оптимизаций, которые можно применять в составе любого существующего оптимизирующего компилятора, такие как оптимизатор потока данных программы, оптимизатор потока управления программы, параллелизатор на уровне инструкций (SIMD (SSA/MMX)), параллелизатор на уровне процессов (multi threading, MPI, OPM), оптимизатор высокого уровня, планировщик для архитектур статического планирования и т.д. Каждая отдельно взятая оптимизация может рассматриваться как объект продажи.
Важнейшей составляющей успеха проекта является высочайшее качество производимых компонент. Для его обеспечения используются последние достижения в области программной инженерии, такие как:
- единый стиль программирования;
- методы и практики объектоориентированного проектирования и программирования;
- методы и практики параллельного программирования, что делает продукты частью строительных блоков индустриипараллельного программирования и позволит существенно уменьшить время компиляции программ для многопроцессорных систем;
- средства автоматического обнаружения ошибок путем инструментирования кода программ с последующим исполнением;
- средства внутренней верификации и отладки;
- средства визуализации внутренних структур данных;
- средства автоматической документации программ.
Анализатор
Анализатор является мощным инструментом, выполняющим следующие анализы:
- анализ потока данных — Нумерация значений (Data Flow Analyzer — Value Numbering)
- анализ Потока Управления (Control Flow Analyzer)
- обнаружение инвариантов циклов (Loop invariants detection)
- обнаружение индуктивных переменных (Inductive variables detection)
- анализ зависимостей в гнездах циклов (Loop data dependence analysis)
- локальный анализ указателей (Local points-to analysis)
- ациклический анализ потока данных (Acyclic data dependence analysis)
- межпроцедурный анализатор потока управления (Interprocedural Control Flow Analyzer)
- межпроцедурный анализатор потока данных — Анализ, чувствительный к контексту и потоку управления — константы, выравнивания, диапазоны, указатели (Interprocedural Data Flow Analyzer Flow/Context Sensitive/Insensitive Propagator — constants, alignments, ranges, points-to)
- нумерация значений (Value Numbering)
- моделирование динамической памяти (Heap modeling)
- статическое профилирование (Static Profiler)
Автоматический распараллеливатель
Эффективный распараллеливатель для многоядерных систем, базирующийся на мощной аналитической базе, с возможностью быстрого портирования на существующие оптимизирующие технологии компиляции. Это готовое решение для современных оптимизирующих систем, которые в большинстве своём не адаптированы или крайне неэффективно адаптированы к последним достижениям в области многоядерных вычислительных систем. Может быть быстро портирован в любую существующую технологическую цепочку.
Обеспечивается и поддерживается три способа портирования функциональности на любую существующую технологическую цепочку:
-
через базу данных — файловое
представление программной семантики, языков на входе (C, C++ и т.д.),
информации (имена, типы и т.д.) и модели целевой архитектуры;
- через наш собственный развитый
промежуточный язык;
- через нашу функциональность как
надстройку над пользовательскими внутренними структурами (IL, CFG и т.д.).
Оптимизатор
Оптимизатор основан на последних достижениях технологий оптимизирующей компиляции.
Окружение компиляции параметризовано данными о входных языках, программной
семантике и целевой машинной модели, хранимой в Базе Данных программы. Это
позволяет полностью скрыть специфическую информацию об окружении от пользователя.
Мы создали метод рабочего представления контекста, который может быть
использован для связи строительных блоков с любыми существующими компиляторами.
Это делает будущие реализации оптимизирующих технологий независимыми от
специфического окружения. Строительные блоки переиспользуют все уровни
модульности, что в несколько раз снижает количество необходимого для их
реализации исходного кода по сравнению с существующими оптимизирующими
компиляторами.
|
 |
|