Я сейчас на работе создаю язык описания объектов сообщений (Message Object Definition Language = MODeL) и пишу для него транслятор в C++, C#,... Потребность в языке MODeL возникла в связи с тем, что у нас есть несколько программ общающихся друг с другом по сети с помощью сообщений и
1) нужно формальное описание типов сообщений просто чтобы в них не запутаться;
2) нужен кодогенератор позволяющий по формальному описанию сгенерировать текст на языке C++, C#,... вместе с сериализаторами (экстернализерами, сериализерами, и прочими функциями), причём так чтоб программы написанные на разных языках (C++, C#, ...) могли общаться с помощью одних и тех же объектов сообщений.
Можно было бы использовать ASN, но он на столько громоздок, что никто не захотел в нём всерьёз разбираться. Вот я и предложил как бы изобретённый мной язык MODeL (а на самом деле просто украденую часть Оберона в которой описываются типы). Местные сишники долго думали (сильно спорили против "END"), но в результате согласились. Описание MODeL сейчас занимает 5 страниц, так что по сравнению с ASN он абсолютно вне конкуренции (там ~600 страниц).
Вот пример текста на языке MODeL:
Код:
DOCUMENT VoipMessages;
IMPORT DefaultSettings;
VoipMessage = RECORD
callId: STRING("n/a");
confId: STRING("n/a");
id: STRING
END;
VoipRegistrationUpdate = RECORD (VoipMessage)
proto: STRING;
nameList: LIST OF VoipRegistrationName;
addresses: VoipAddresses;
contacts: VoipAlias;
maxRegTime: INT32(0);
active: INT32(-1);
isNatUser: BOOLEAN(FALSE), VERSION(31..*);
registrarName: STRING(""), VERSION(31..*)
END;
SETTINGS (DefaultSettings)
rootMessageType = "VoipMessage";
LANGUAGE ("C++");
namespace = "mvoip"
END
END;
END VoipMessages.
На прошлой неделе я реализовал раздельную компиляцию, а сегодня попытался было протолкнуть
ABSTRACT RECORD.
Не вышло. Сишники по поводу ABSTRACT сказали, что
Цитата:
Увы, мы пользуемся старым, кривым C++... И поэтому не хотим при
написании компонента A что-то запрещать написателю компонента B...
И мой начальник мне ABSTRACT запретил. Вот сижу теперь и горюю...