Основные сведения
Компания разрабатывает свой компилятор языков программирования C/C++ с 1999 года. К проекту привлекаются исключительно российские специалисты, на разработку потрачено в общей сложности более 170 человеколет. За это время созданы несколько пакетов средств разработки на базе компилятора UCC, которые используются в производственных процессах крупных промышленных компаний.
За счет архитектуры адаптация компилятора к новой платформе занимает около 2 месяцев в зависимости от сложности процессора и методов низкоуровневой оптимизации. Адаптация включает в себя настройку правил кодогенерации, в то время как основной исходный код компилятора остается неизменным.
Сферы применения:
- оборонно-промышленный комплекс
- системы безопасности и связи
- авионика
- приборо- и станкостроение
- компьютерная периферия
Принципы работы
Первая фаза компиляции – Frontend позволяет произвести первичное преобразование программы в ее высокоуровневое древовидное представление. Одним из основных предназначений данного этапа компиляции является лексический и синтаксический разбор исходного кода и его абстрагирование от конкретного языка программирования. Компилятор поддерживает два Frontend: C и C++.
На следующем этапе проводится первичная оптимизация промежуточного представления.
Применяются алгоритмы, в целом независящие от целевой платформы, такие как вынесение подвыражений, распространение констант, упрощение циклов, комбинирование, адресная оптимизация и т.п. Впрочем, некоторые высокоуровневые оптимизации могут косвенно зависеть от целевой платформы, поэтому в таких оптимизациях организована обратная связь с кодогенерационной моделью.
В дальнейшем дерево промежуточного представления проходит фазу кодогенерации. На этой фазе применяются правила кодогенерационной модели, и дерево преобразуется к машиннозависимому виду. После этой фазы в узлах дерева остаются только инструкции и атрибуты, совместимые с целевым процессором. Над этим представлением проводятся дополнительные среднеуровневые оптимизации и распределение переменных на регистры/память в зависимости от настроек модели. Следующим этапом дерево промежуточного представления преобразуется в список ассемблерных инструкций целевой платформы, и над этим списком проводится серия низкоуровневых оптимизаций и прогон алгоритмов, заточенных под конкретную платформу.
В финале список ассемблерных инструкций преобразуется в ассемблерный файл, который передается на трансляцию целевому ассемблеру.
Установка Компилятора U
Компилятор U предназначен для использования в составе с другими инструментальными программами: ассемблером и компоновщиком (линкером).
Для обеспечения стабильной и бесперебойной работы компилятора персональный компьютер, на котором будет эксплуатироваться Компилятор U, должен отвечать системным требованиям, указанным в сопроводительной документации.
Компилятор U не требует отдельной установки. Для начала работы достаточно скопировать все файлы поставки в одну папку на целевом компьютере. Затем необходимо указать в командной строке или графическом интерфейсе IDE параметры для работы компилятора, указанные в сопроводительной документации.
Эксплуатация Компилятора U
Компилятор U предназначен для двух категорий пользователей:
Оператор компилятора – пользователь, который отвечает за проведение компиляции по заранее настроенным правилам кодогенерации (CGM). Оператор должен иметь базовые знания программирования на языке C и знания разработки ПО в IDE.
Программист компилятора – пользователь, который отвечает за настройку правил кодогенерационной модели (CGM) для адаптации компилятора под конечную платформу. Программист компилятора должен иметь базовые знания программирования на языках C/C++ и знания разработки ПО в IDE. А также базовые знания о принципах построения и структуре компиляторов.
Алгоритм настройки компиляции и правил CGM указаны в сопроводительной документации.
Архитектура
Основная идея компилятора UCC — вынос платформо-специфичных настроек и алгоритмов в отдельный модуль. Этот модуль может быть гибко настроен при помощи описания правил кодогенерации на специализированном языке.
Для этого в компилятор введено понятие промежуточного высокоуровневого представления программы, состоящего из узлов: команд и атрибутов «псевдопроцессора». Этот процессор содержит универсальный набор команд, бесконечное количество регистров и памяти.
Процесс разработки
Лицензирование и стоимость использования Компилятора U
Лицензионный ключ не предусмотрен и не требуется для использования Компилятора U.
Поддержание жизненного цикла компилятора осуществляется в рамках договора сопровождения, заключаемого между заказчиком и разработчиком.
В рамках договора сопровождения разработчик берёт на себя обязательства по оказанию услуг по информационному обновлению и авторскому сопровождению программного продукта, которые включают в себя в том числе предоставление заказчику неисключительной лицензии на право пользования Компилятора U.
Стоимость договора сопровождения определяется сроком его действия и объёмом услуг, предоставляемых разработчиком.
Хранение исходного кода компилятора U
Компилятор U разработан на языке программирования C++.
Для хранения исходного текста и объектного кода используется Microsoft Team Foundation Server 2017 Upd 3.1, работающий под управлением ОС Microsoft Windows Server 2016 Std.
Для компиляции исходного текста в объектный код используется компилятор Microsoft Visual C++ из состава Microsoft Visual Studio 2010.
Место нахождения технических средств хранения исходного текста и объектного кода Компилятора U и компиляции исходного текста в объектный код Компилятора U: ООО «МИР», Россия, г. Санкт-Петербург, ул. Гельсингфорсская, д.4, БЦ «Красная Заря», офис 86.
История разработки компилятора
1999 – 2000
Разработка первой версии мультиплатформенного компилятора C.
2000-2001
Разработка C++ Frontend для мультиплатформенного компилятора.
2001-2002
Разработка модели для 32-битного стекового процессора шведской компании.
2002-2003
Полный рефакторинг компилятора –
обновление платформы и алгоритмов.
Разработка и поддержка.
2004-2005
кодогенерационной модели для узкоспециализированного многоядерного процессора PRIME (задачи печати) для южнокорейской компании.
2006-2010
Разработка и оптимизация модели процессора южнокорейской компании, предназначенного для медиаприложений.
Разработка новых специализированных методов высокоуровневой и низкоуровневой оптимизации.
2008-2010
Разработка и оптимизация модели процессора южнокорейской компании, предназначенного для смарт-карт.
2011-2014
Поддержка и постоянные улучшения кодогенерационных моделей вышеуказанных процессоров.
2012-2013
Разработка кодогенерационной модели для узкоспециализированного 32-битного RISC-процессора для контроллеров SSD-дисков крупнейшего в мире производителя чипов.
Настоящее время
Поддержка обновлённых стандартов языка и реализация новых оптимизаций кода.
Основные сведения
В случае, когда у заказчика нет ограничений по использованию зарубежных разработок и отсутствуют опасения насчет возможных изменений в лицензионной политике таких решений, подходящим вариантом может оказаться компилятор на основе LLVM – набора компиляторных технологий, упакованных в удобную модульную форму.

Стартовав в 2000 году как исследовательский проект Университета Иллинойса, на сегодняшний день LLVM де-факто является стандартом в качестве платформы для создания новых компиляторов и продолжает активно развиваться.
В отличие от компилятора GCC, LLVM не требует раскрытия исходных кодов создаваемых на его основе продуктов, что стимулирует его использование в коммерческих проектах.
МИР обладает соответствующими компетенциями, имея опыт разработки специфических LLVM оптимизаций.
Основные сведения
LLVM не является компилятором сам по себе, а скорее предоставляет инфраструктуру для его создания. Используя эту инфраструктуру, был создан компилятор Clang, на данный момент неотрывно связанный с LLVM и развивающийся параллельно. Сегодня, когда мы говорим LLVM, подразумеваем Clang, и наоборот. А разработка нового компилятора на базе LLVM обычно означает портирование на новую платформу компилятора Clang.
lang создавался с целью замены 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);
- понимание организации мультиступенчатой оптимизации.

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