Генерация парсеров для двоичных структурированных данных;метапрограммирование или внешние скрипты? - PullRequest
0 голосов
/ 05 апреля 2011

Я пишу сервер, который взаимодействует с проприетарным протоколом. В настоящее время большая часть кода состоит из обработчиков пакетов, которые анализируют все поля пакета, при этом удостоверившись, что размер доступных данных по крайней мере является минимальным оставшимся размером после каждого поля. В дополнение к этому обработчики пакетов также выполняют проверки достоверности принятых данных (т.е. должны находиться в определенном диапазоне или в наборе предопределенных значений).

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

Сейчас я вижу два подхода:

  • Придумайте некоторую структуру метапрограммирования, которая позволяет мне описывать структуры пакетов и, в конечном итоге, правила проверки данных, чтобы я мог генерировать код синтаксического анализа во время компиляции. Я предполагаю, что это будет похоже на то, что делает Boost.Spirit.

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

Способ метапрограммирования кажется превосходным в теории, но я еще не придумал безупречного способа реализации этого. Предпочтительно объявление пакетов было бы похоже на объявление класса и не было бы заполнено макросами. Существует также проблема в тех случаях, когда мне приходится ссылаться на предыдущие элементы данных (это относится к полям, повторяемым переменное число раз, где число указано ранее в пакете).

У кого-нибудь есть опыт работы с подобными фреймворками, и что бы вы предложили?

Я знаю о буферах протокола Google, но это навязчиво, так как требует контроля над протоколом.

1 Ответ

1 голос
/ 05 апреля 2011

В прошлом я несколько раз создавал свой собственный язык и инструменты для двоичных структурированных данных, но это было отчасти обусловлено необходимостью поддержки нескольких целевых языков из определений данных (в то время C #и C ++);Я также создал третью цель для создания справочной HTML-документации из определений.

Основное преимущество, которое я вижу при использовании метапрограммирования шаблонов C ++, заключается в том, что вы можете напрямую взаимодействовать с системой типов времени компиляции, если и когда этополезно.Тем не менее, для типичных бинарных структурированных данных я никогда не находил это настолько полезным.Например, вам нужен способ обработки соответствующих членов в определенном порядке;Ускоренная сериализация делает это, требуя метод сериализации, который определяет, какие элементы обрабатываются и в каком порядке.

...