РАЗРАБОТКА ПО

Инструментальные средства компании “АстроСофт” для создания компиляторов для встраиваемых систем

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

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

Выполнить разработку и перенос программного обеспечения помогают инструментальные средства программирования - компиляторы с языков высокого уровня. По сравнению с программированием на ассемблере разработка программного обеспечения на языке высокого уровня зачастую намного дешевле и проще.

Универсальные компиляторы Си/C++ (Ucc и Ucpp)

Среди языков высокого уровня во встраиваемых системах наиболее популярны Си и диалект языка C++ - EC++ (C++ для встраиваемых систем, Embedded C++). Существует много примеров, когда системное ПО полностью или в значительной мере реализовано на языке Си с целью обеспечения переносимости.

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

Однако разработка нового компилятора требует больших финансовых и временны/х затрат, что в условиях быстроразвивающегося рынка встраиваемых систем весьма критично. И хотя сейчас существуют готовые компоненты для создания препроцессора для языков Си и C++, создание оптимизирующего кодогенератора для новой целевой платформы по-прежнему остается весьма трудоемким процессом.

С целью преодоления описанных трудностей в компании “АстроСофт” были созданы такие компиляторы Си и С++ (Ucc и Ucpp), которые можно использовать как основу для быстрой разработки компиляторов для любых целевых платформ. Ucc и Ucpp названы универсальными, поскольку они отличаются высокой степенью переносимости, т.е. настраиваемости кодогенератора на любой целевой процессор за короткий период времени.

Разработка компиляторов велась в рамках совместного проекта шведской компании ImSys AB (www.imsys.se) и российской “АстроСофт” (www.astrosoft-development.com) “Создание интегрированной среды разработки для встраиваемых систем”. В качестве основной целевой платформы выступал микропроцессор семейства Cjip (www.javamachine.com) производства ImSys AB. Компания ImSys AB владеет правами на конкретную реализацию компиляторов Си/C++ для процессоров семейства Cjip и лицензию на компиляцию кода для этих процессоров. Универсальный компилятор - это и данный продукт, и технология построения компиляторов Си/C++ для любых целевых платформ. Компания “АстроСофт” владеет авторскими правами на универсальный компилятор Си/C++, настраиваемый на любой процессор, и на собственную технологию разработки компиляторов. Специалистами компании “АстроСофт” в целях тестирования настраиваемых компиляторов на PC была выполнена реализация компиляторов для микропроцессора i486 фирмы Intel. Кроме того, были созданы демонстрационные версии для нескольких микропроцессоров, применяемых во встроенных системах: PowerPC компании Motorola, TriCore производства Infineon Technologies, E1-32XS, выпускаемого Hyperstone, а также для платформы MIPS фирмы MIPS Technologies.

Преимущества компиляторов Ucc и Ucpp

Основными преимуществами универсальных компиляторов Си/C++, разработанных в “АстроСофте”, по сравнению со многими известными компиляторами других производителей, являются:

- соответствие стандартам ANSI/ISO входных языков Си/C++ (Ucpp соответствует стандарту ISO C++ 1998, а не ограниченному EC++, а Ucc - стандарту ANSI C 99, поддерживает расширения DSP согласно проекту соответствующего стандарта ISO и расширения GNU, использующиеся в Linux);

- высокоуровневая и низкоуровневая оптимизация генерируемого кода;

- эффективная реализация (для Ucpp) объектных моделей и модели обработки исключений;

- эффективный способ настройки кодогенератора на целевой процессор.

Использование расширений языка широко распространено во встраиваемых системах. Ucc и Ucpp предоставляют поддержку трех видов расширений, а именно: директив #pragma (главным образом для управления сегментами), директив asm и адресных пространств (обобщение механизмов доступа к различным типам памяти, синтаксически подобное спецификации связывания в C++).

Способность компиляторов Ucc и Ucpp обеспечивать высокий уровень переносимости исходного кода объясняется следующими причинами:

- высокой степенью локальной оптимизации и, как следствие, снижением потребности в использовании расширений;

- высокой степенью настраиваемости компилятора, а значит, сравнительной легкостью реализации нового компилятора для другого процессора;

- высокой степенью (для Ucpp) соответствия стандарту ISO C++, благодаря чему открывается возможность повторного использования исходного кода, написанного на стандартном языке C++, без необходимости его переписывания на EC++ или Си.

Структура компиляторов Ucc и Ucpp

Компиляторы Си и Си++ разрабатывались таким образом, чтобы у них были общие фазы и они имели следующую общую структуру:

- FrontEnd (общий лексический анализатор и препроцессор, отдельный синтаксический анализатор и отдельные фазы контроля типов и семантического анализа);

- MiddleEnd (общая фаза высокоуровневой оптимизации, выполняемая на общем машино-независимом внутреннем представлении);

- BackEnd (общий настраиваемый генератор оптимизированного кода).

Наряду с тем, что Ucc и Ucpp являются настраиваемыми на любой процессор, они всегда обрабатывают то или иное средство языка одинаковым способом и выдают одинаковые диагностические данные. Разработанные нами новые компиляторы практически идентичны и имеют лишь небольшие отличия в фазе кодогенерации для различных процессоров. Эта особенность и соответствие стандартам позволяют нам широко применять повторное использование кода.

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

Внутреннее представление, используемое в компиляторах Ucc и Ucpp

Разделение компиляторов на фазы в сочетании с введением внутреннего представления входной программы обусловило максимальную гибкость реализации Ucc и Ucpp. Как известно, разделение компилятора на FrontEnd и BackEnd с применением внутреннего представления позволяет вместо N*M реализаций для N входных языков и M целевых платформ выполнить только N+M реализаций (N реализаций FrontEnd и M реализаций BackEnd). Внутреннее представление компиляторов Ucc и Ucpp включает:

- абстрактный синтаксис в виде единиц семантики языка C/C++;

- высокоуровневое машино-независимое внутреннее представление в терминах абстрактной машины C/C++ (каноническое внутреннее представление);

- машино-зависимое внутреннее представление (целевое внутреннее представление).

Поддержка стандартного языка C++

C++ - очень объемный и сложный язык, содержащий двусмысленные конструкции. Его синтаксический анализатор имеет около тысячи состояний и порядка семисот правил. Грамматика этого языка не может быть рассмотрена как контекстно-независимая и выходит за рамки класса LALR(1)-грамматик, для которых существуют готовые генераторы синтаксических анализаторов, такие, как известная программа YACC. Специалистами “АстроСофта” на основе YACC был создан инструмент, поддерживающий возможность откатов синтаксического анализа для разрешения двусмысленностей входного языка, пригодный для разбора языка C++ в полном соответствии со стандартом ISO и дополнительно снабженный визуальным отладчиком грамматики (демонстрационную версию можно загрузить с Web-узла “АстроСофта”).

По сравнению с Си язык C++ требует более сложной поддержки времени исполнения (обработка исключений, информация о типах времени исполнения), которая может привести к значительным накладным расходам. Вместо того чтобы ограничивать входной язык согласно EC++, Ucpp предоставляет пользователю возможность при необходимости самому указать, какую часть поддержки времени исполнения нужно генерировать, сохраняя при этом неизменными все выразительные средства языка.

(Окончание следует)