Рекламодатель: ЗАО «Топ Системы»

ИНН 7726601967 ОГРН 1087746953557

Рекламодатель: АО «СИЭС Групп»

ИНН 7722146379 ОГРН 1027700367661

Рекламодатель: ООО «АТИМ»

ИНН 9710098156 ОГРН 1227700259863

Рекламодатель: АО «Цифровая мануфактура»

ИНН 5010058760 ОГРН 1086658008975

Рекламодатель:
ООО «С3Д Лабс»

ИНН 7715938849 ОГРН 1127747049209

5 - 2023

Создание обертки C3D для использования на разных языках и платформах

Максим Пылаев, инженер-программист, C3D Labs
Максим Пылаев, инженер-программист, C3D Labs

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

Базовые требования обертки ядра от C3D Labs включают:

  • поддерживаемость — любые изменения в ядре автоматически отражаются в обертке;
  • масштабирование — расширение обертки;
  • кроссплатформенность — по количеству компиляторов на разных операционных системах обертка должна удовлетворять тем же требованиям, что и ядро C3D.

Отметим, что первые две задачи должны выполняться быстро и зеркально.

Одна из задач в разработке современных программных продуктов (далее — ПП) — снижение порога вхождения. Ее решением может быть, например, документация, снабженная большим количеством примеров, развитая техподдержка или возможность использования ПП на нескольких языках программирования. Такой подход облегчает возможности применения инженерных решений специалистами разных профилей.

Нужно отметить, что на данный момент уже существует обертка для языка C#, которая написана с использованием технологии C++/CLI. У этого решения существует ограничение: библиотеку нельзя применять для иных систем, кроме Windows. Также у нее достаточно сильно ограничена поддержка, так как исправления и доработки не автоматизированы. Именно поэтому подход в формировании оберток ядра подвергся изменениям.

Для унификации процесса нами принято решение создавать обертки в стиле языка Си. Такая обертка может применяться самостоятельно как в Си-, так и в С++-приложениях. Кроме того, она является промежуточным звеном для формирования более высокоуровневых оберток, например для языка C# с использованием технологии P/Invoke. Это, в свою очередь, позволяет производить сборку ядра как для Windows-, так и для Linux-систем.

Рассмотрим процесс создания обертки в стиле Си для библиотеки геометрического ядра C3D Labs. Он состоит из нескольких этапов:

  • Создание обертки в стиле Си (прототип без автоматизации для тестирования жизнеспособности).
  • Парсинг заголовочных файлов С++ на сущности языка.
  • Разработка правил формирования обертки.
  • Написание генератора Си обертки.
  • Формирование и сборка обертки ядра генератором.

На 1-м этапе (рис. 1) по ограниченному набору файлов создается обертка в стиле СИ с целью проверки работоспособности и формирования ряда правил для будущего генератора обертки.

Рис. 1. Создание обертки в стиле СИ с целью проверки работоспособности и формирования ряда правил для будущего генератора обертки
Рис. 1. Создание обертки в стиле СИ с целью проверки работоспособности и формирования ряда правил для будущего генератора обертки

На 2-м этапе задействуется библиотека clang, которая разбирает заголовочный файл в представление AST (abstract syntax tree). Полученное представление clang сохраняется в структуры данных языка Python (для использования генератором обертки, написанным на Python).

На 3-м этапе (рис. 2) формируется набор правил обработки структур данных С++.

Рис. 2. Набор правил обработки структур данных С++
Рис. 2. Набор правил обработки структур данных С++

На 4-м этапе (рис. 3) используются результаты работы парсера и набор правил формирования.

Генератор работает следующим образом:

  1. получает на вход заголовочный файл C++;
  2. запускает парсер по файлу и получает представление структур данных в сущностях языка Python;
  3. формирует «заготовку» — файл со специальными функциями для создания/удаления объектов (классов, структур) библиотеки и функций доступа к родительским классам;
  4. проходя по сущностям из парсера, обрабатывает код согласно правилам и формирует соответствующие функции.

Результатом работы генератора является пара файлов (заголовочный и исполняемый коды) по входному заголовочному файлу.

Рис. 3. Рабочий цикл генератора
Рис. 3. Рабочий цикл генератора

При формировании обертки встречаются некоторые ограничения:

  • функции со значениями по умолчанию преобразуются в функции с явным указанием параметра;
  • для шаблонных классов выбираются конкретные реализации параметров, используемые в API оборачиваемой библиотеки;
  • все методы и функции, переопределенные в исходном заголовочном файле, формируются с перечислением параметров в имени функции обертки.

На 5-м этапе выполняется формирование обертки генератором по набору заголовочных файлов. Далее весь результирующий набор файлов вместе с реализацией шаблонных классов собирается в один проект для построения библиотеки обертки. На этом этапе используются cmake-файлы для конфигурации сборки.

В результате мы получаем библиотеку обертки, которая может быть использована или как основа для последующего уровня обертки (С#, Python), или как самостоятельный продукт. Кроме того, упрощается процесс сопровождения и модификации обертки, поскольку генерация по измененному коду ядра автоматически включает все изменения.

В наших дальнейших планах — автоматизация процесса генерации и сборки обертки в стиле Си (например, при выходе релиза основной библиотеки), формирование C#-обертки на ее основе, выпуск вышеуказанных оберток для Linux и Windows.

Регистрация | Войти

Мы в телеграм:

Рекламодатель:
ООО «Нанософт разработка»

ИНН 7751031421 ОГРН 5167746333838

Рекламодатель: ЗАО «Топ Системы»

ИНН 7726601967 ОГРН 1087746953557