Современная техника от радаров и видеокамер до спутников и подводных лодок оснащена микропроцессорами. В свою очередь, работа микропроцессоров невозможна без специального программного обеспечения (ПО), для создания которого требуются уникальные инструменты: средства разработки.
Основные сведения |
Компания АстроСофт разрабатывает свой компилятор языков программирования 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 – набора компиляторных технологий, упакованных в удобную модульную форму.
Стартовав в 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.
|
Архитектура |
|
Резюме |
Разработка компилятора на базе Clang/LLVM – хороший вариант для компаний, если ожидаемая выгода от постоянного развития «ядра» компилятора и широкий спектр поддерживаемых «из коробки» технологий перевешивают потенциальный риск, связанный с зависимостью от зарубежных решений и невозможностью влиять на направление развития базового функционала. АстроСофт предлагает свои компетенции в создании таких компиляторов. Если же потенциальные риски «перевешивают», мы предлагаем полностью российскую разработку – универсальный компилятор UCC.
|
Клиент |
Транснациональная компания по производству микроэлектроники, потребительской электроники, промышленного и телекоммуникационного оборудования. |
|
Решение |
В качестве базы для проекта использовалась собственная разработка АстроСофт — продукт Universal C Compiler (UCC). В нем существует механизм разработки компилятора для новой платформы: реализовано построение кодогенерационной модели, которая настраивает внутренние алгоритмы генерации кода и позволяет конвертировать абстрактное внутреннее представление программы в ассемблерные инструкции целевой машины. С целью сокращения издержек было принято решение портировать ассемблер, линкер и симулятор заказчика на новую платформу.
Проект был разделен на две итерации: разработка и оптимизация. В ходе первой итерации был получен полностью работоспособный комплект разработки на основе существующих решений, в ходе второй итерации добавлены оптимизации, специфичные для новой платформы.
|
Результат |
Разработаны: компилятор С для нового узконаправленного процессора, а также ассемблер, линкер и симулятор для новой платформы.
Компилятор интегрирован и активно применяется заказчиком. Готов к использованию при разработке Flash и SSD-накопителей.
|
Технологии |
Основное средство разработки — Универсальный компилятор C (UCC). Сборка компилятора осуществлялась при помощи MSVC 2010 и модифицированным Yacc. В качестве базы для других инструментальных средств использовались: ассемблер, линкер, симулятор компании-клиента. Для тестирования использовалась собственная система тестирования компиляторов АстроСофт — TestSuite (насчитывает более 25 тысяч тестов и синтезирует в себе признанные сторонние решения с наборами, разработанными сотрудниками компании).