Однако, веха (изгнание CDL)
Всякий, кто начинал работу с библиотекой Open CASCADE Technology (OCCT), задавался вопросом: что такое CDL? Действительно, среди привычных файлов с расширениями cxx (тело C++) и hxx (заголовочные файлы C++) нередко можно встретить странные вкрапления в виде файлов с расширением cdl. И даже больше: с расширениями ixx, jxx, lxx и gxx. Последние хоть и имеют какое-то непонятное назначение, но, по существу, являются все теми же «старыми-добрыми» исходниками C++. Что же касается cdl-файлов, то здесь обнаруживается некоторый доморощенный синтаксис, который похож на C++ только тем, что и CDL и C++ придерживаются парадигмы ООП. Пример файла CDL приведен ниже:
class XYZ from gp inherits Storable --- Purpose : -- This class describes a cartesian coordinate entity in -- 3D space {X,Y,Z}. This entity is used for algebraic -- calculation. This entity can be transformed -- with a "Trsf" or a "GTrsf" from package "gp". -- It is used in vectorial computations or for holding this type -- of information in data structures. uses Mat from gp raises ConstructionError from Standard, OutOfRange from Standard is Create returns XYZ; ---C++: inline --- Purpose : Creates an XYZ object with zero co-ordinates (0,0,0) Create (X, Y, Z : Real) returns XYZ; ---C++:inline --- Purpose : creates an XYZ with given coordinates SetCoord (me : in out; X, Y, Z : Real) ---C++: inline ---Purpose: For this XYZ object, assigns -- the values X, Y and Z to its three coordinates is static; ... fields x : Real; y : Real; z : Real; end;
Этот кусочек кода играет ту же роль, что и простейший заголовочный файл C++ — объявляет класс. В данном случае речь идет о классе с именем XYZ из пакета gp (Geometric Primitives), который представляет собой упорядоченную тройку вещественных чисел для декартовых координат. Но почему бы не использовать привычный C++? Чтобы это понять, надо разобраться, что такое CDL и для чего он был изобретен.
К истокам
CDL (Open CASCADE Component Definition Language) — это основа библиотеки OCCT. По крайне мере, так было раньше. Теперь это просто реликт, который всем мешает. Забегая вперед, отмечу, что команда разработчиков OCCT взяла курс на окончательное избавление от тех древних артефактов, что достались ей в наследство от CAx-платформы EUCLID. Но вернемся к определению. CDL — это мета-язык, т.е. «над-язык», который позволяет архитектору программного обеспечения «воспарить» над серой обыденностью конкретным языком программирования и мыслить категориями компонент и взаимосвязей между ними. Реально он чем-то напоминает CORBA IDL (Interface Definition Language), т.е. служит только для описания интерфейсов, но не самих алгоритмов. Приведем неполный список задач, которые решались при помощи CDL разработчиками OCCT:
- Фокусирование на логике, но не на реализации. Задумка понятная, но реальный мир, как обычно, сложнее. Даже в простейшем gp_XYZ.cdl мы видим разного рода низкоуровневые заклинания, такие как
C++: inline
или
C++: alias operator +
Наличие CDL, разумеется, предполагает, что есть некоторая среда, способная его интерпретировать. Такая среда называется WOK (Workshop Organization Kit). С помощью нее осуществляется преобразование cdl-файлов в заголовочные файлы C++ и организуется вся сопутствующая работа (инстанцирование generic-классов, создание «умных указателей», определение зависимостей и т.д.). Среда WOK предоставляет командный интерпретатор, в котором все операции, перечисленные выше, выполняются при помощи инструкции «umake». Например, чтобы полностью собрать пакет gp, можно дать следующую команду:
umake gp
Модернизация
Инструменты, которые существенно облегчали труд программиста и проектировщика OCCT, на сегодняшний день устарели. Практическая польза языка CDL с развитием стандарта C++ оказалась ничтожна. Более того, синтаксис современного C++ куда более выразителен, нежели синтаксис CDL, а потому язык определения интерфейсов становится лишь дополнительной преградой, а не подспорьем (не зря появились такие заклинания, как «C++ inline» и им подобные).
Стоит также отметить, что роль среды WOK не ограничивается обработкой cdl-файлов. WOK позволяет организовать одновременную работу группы программистов над разной функциональностью, вводя понятие «workbench» — своеобразной «песочницы». Однако и эта сильная сторона WOK в настоящее время кроется великим множеством систем контроля версий (Git, SVN, Perforce и т.д.).
После всего сказанного остается порадоваться, что официальный разработчик OCCT не цепляется за устаревшие технологии и модернизирует библиотеку, изгоняя из нее духов прошлого. Поводом к написанию настоящей заметки послужила отрадная новость с официального сайта: вышла промежуточная версия OCCT без CDL и WOK. Что ж, остается дождаться официального релиза и поблагодарить команду разработчиков за проделанную работу и волю к обновлениям.