+7 (812) 670-9095
Обратная связьEnglish
Главная → Продукты → Системное ПО → Компиляторы C/C++ для встроенных систем
Павел Локтев, Руководитель группы продаж
Заказать звонок Задать вопрос
Версия для печати

Компиляторы C/C++ для встроенных систем

Современная техника от радаров и видеокамер до спутников и подводных лодок оснащена микропроцессорами. В свою очередь, работа микропроцессоров невозможна без специального программного обеспечения (ПО), для создания которого требуются уникальные инструменты: средства разработки.


Заказать презентацию

Основные сведения Основные сведения

Компания АстроСофт разрабатывает свой компилятор языков программирования C/C++ с 1999 года. К проекту привлекаются исключительно российские специалисты, на разработку потрачено в общей сложности более 170 человеколет. За это время созданы несколько пакетов средств разработки на базе компилятора UCC, которые используются в производственных процессах крупных промышленных компаний.

За счет архитектуры адаптация компилятора к новой платформе занимает около 2 месяцев в зависимости от сложности процессора и методов низкоуровневой оптимизации. Адаптация включает в себя настройку правил кодогенерации, в то время как основной исходный код компилятора остается неизменным.

Сферы применения:

  • оборонно-промышленный комплекс
  • системы безопасности и связи
  • авионика
  • приборо- и станкостроение
  • компьютерная периферия



Принципы работы
Принципы работы

Первая фаза компиляции – Frontend позволяет произвести первичное преобразование программы в ее высокоуровневое древовидное представление. Одним из основных предназначений данного этапа компиляции является лексический и синтаксический разбор исходного кода и его абстрагирование от конкретного языка программирования. Компилятор поддерживает два Frontend: C и C++.

На следующем этапе проводится первичная оптимизация промежуточного представления.

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

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

В финале список ассемблерных инструкций преобразуется в ассемблерный файл, который передается на трансляцию целевому ассемблеру.



Архитектура
Архитектура

Основная идея компилятора UCC — вынос платформо-специфичных настроек и алгоритмов в отдельный модуль. Этот модуль может быть гибко настроен при помощи описания правил кодогенерации на специализированном языке.

Для этого в компилятор введено понятие промежуточного высокоуровневого представления программы, состоящего из узлов: команд и атрибутов «псевдопроцессора». Этот процессор содержит универсальный набор команд, бесконечное количество регистров и памяти.


Архитектура компилятора



Процесс разработки
Процесс разработки
Процесс разработки компилятора



История разработки компилятора АстроСофт
История разработки компилятора АстроСофт


История разработки компилятора АстроСофт
1999 - 2000
Разработка первой версии мультиплатформенного компилятора C.
История разработки компилятора АстроСофт
2006-2010

Разработка и оптимизация модели процессора южнокорейской компании, предназначенного для медиаприложений.

Разработка новых специализированных методов высокоуровневой и низкоуровневой оптимизации.

2000-2001

Разработка C++ Frontend для мультиплатформенного компилятора.

2008-2010
Разработка и оптимизация модели процессора южнокорейской компании, предназначенного для смарт-карт.
2001-2002
Разработка модели для 32-битного стекового процессора шведской компании.
2011-2014
Поддержка и постоянные улучшения кодогенерационных моделей вышеуказанных процессоров.
2002-2003
Полный рефакторинг компилятора –
обновление платформы и алгоритмов.
Разработка и поддержка.
2012-2013
Разработка кодогенерационной модели для узкоспециализированного 32-битного RISC-процессора для контроллеров SSD-дисков крупнейшего в мире производителя чипов.
2004-2005
кодогенерационной модели для узкоспециализированного многоядерного процессора PRIME (задачи печати) для южнокорейской компании.
Настоящее время
Поддержка обновлённых стандартов языка и реализация новых оптимизаций кода.
Основные сведения Основные сведения

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

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

В отличие от компилятора GCC, LLVM не требует раскрытия исходных кодов создаваемых на его основе продуктов, что стимулирует его использование в коммерческих проектах.

АстроСофт обладает соответствующими компетенциями, имея опыт разработки специфических LLVM оптимизаций, а в 2017 году ведет несколько проектов по разработке полных LLVM-компиляторов.



Принципы работы
Принципы работы

LLVM не является компилятором сам по себе, а скорее предоставляет инфраструктуру для его создания. Используя эту инфраструктуру, был создан компилятор Clang, на данный момент неотрывно связанный с LLVM и развивающийся параллельно. Сегодня, когда мы говорим LLVM, подразумеваем Clang, и наоборот. А разработка нового компилятора на базе LLVM обычно означает портирование на новую платформу компилятора Clang.

Clang создавался с целью замены GCC, который изначально рассматривался в качестве единственного фронт-энда для LLVM. Однако GCC по разным причинам оказался неудобен для некоторых разработчиков. Одной из веских причин стали лицензионные ограничения GCC, которые с появлением Clang были преодолены. Заинтересованность в проекте выразили такие известные компании, как Apple, ARM, Google, Microsoft, Intel и др.

Сам компилятор Clang (как и LLVM) разработан на языке С++, а поддерживаемыми языками стали C, C++, Objective-C, Objective-C++, OpenMP, OpenCL, CUDA.


Архитектура
Архитектура

Как мы уже выяснили, LLVM, по сути, является бек-эндом компилятора, фронт-эндом которого выступает Clang. Как правило, у разработчиков компиляторов на основе Clang/LLVM не возникает потребности модифицировать «ядро», и необходимыми знаниями в этом случае становятся:
  • общее понимание архитектуры LLVM;
  • владение языком внутреннего представления (LLVM IR, LLVM intermediate representation);
  • понимание организации мультиступенчатой оптимизации.


Архитектура LLVM



Результат
Резюме

Разработка компилятора на базе Clang/LLVM – хороший вариант для компаний, если ожидаемая выгода от постоянного развития «ядра» компилятора и широкий спектр поддерживаемых «из коробки» технологий перевешивают потенциальный риск, связанный с зависимостью от зарубежных решений и невозможностью влиять на направление развития базового функционала. АстроСофт предлагает свои компетенции в создании таких компиляторов. Если же потенциальные риски «перевешивают», мы предлагаем полностью российскую разработку – универсальный компилятор UCC.

Клиент
Клиент

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

Решение
Решение

В качестве базы для проекта использовалась собственная разработка АстроСофт — продукт Universal C Compiler (UCC). В нем существует механизм разработки компилятора для новой платформы: реализовано построение кодогенерационной модели, которая настраивает внутренние алгоритмы генерации кода и позволяет конвертировать абстрактное внутреннее представление программы в ассемблерные инструкции целевой машины. С целью сокращения издержек было принято решение портировать ассемблер, линкер и симулятор заказчика на новую платформу.

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


Результат
Результат

Разработаны: компилятор С для нового узконаправленного процессора, а также ассемблер, линкер и симулятор для новой платформы.

Компилятор интегрирован и активно применяется заказчиком. Готов к использованию при разработке Flash и SSD-накопителей.



Технологии
Технологии

Основное средство разработки — Универсальный компилятор C (UCC). Сборка компилятора осуществлялась при помощи MSVC 2010 и модифицированным Yacc. В качестве базы для других инструментальных средств использовались: ассемблер, линкер, симулятор компании-клиента. Для тестирования использовалась собственная система тестирования компиляторов АстроСофт — TestSuite (насчитывает более 25 тысяч тестов и синтезирует в себе признанные сторонние решения с наборами, разработанными сотрудниками компании).