Мета-язык для кодирования генерирует упакованные структуры для структур ANSI-C и C#

Я пытаюсь найти "мета-язык", который можно использовать для определения структуры и получения / установки кода для членов. Суть в том, что структура уже существует в коде, и этот "метаязык" будет служить бит-за-битой заменой исходной структуры с ручным кодированием, позволяющей генерировать заголовки, описывающие структуры. Дело в том, что структуры используются как часть протокола между приложением C# и встроенным устройством (не на основе Linux, думаю, меньше и более ограниченным, как PIC или CM0.) Мета-язык будет действовать как

  • Документация для членов структуры
  • Генерация структур C# и реализация для операций get/set
  • Генерировать упакованные структуры ANSI-C и функции get/set

Мета-язык должен был бы поддерживать

  • определения перечисления (определенного размера - т.е. uint16_t, uint8_t или меньше, как для многобитовых перечислений)
  • битовые массивы (указанного размера - т.е. 48-битный массив упакован в 6 байтов)
  • битовые структуры / массивы перечисления (определенного размера - т.е. 2-битная структура из 48 индексов составляет 12 байтов)
  • спецификация для порядкового номера и порядка следования битов,
  • генерировать двоичные структуры, которые могут быть прочитаны непосредственно сгенерированным кодом ANSI-C или C-sharp для целей отправки по сети.

Также было бы неплохо иметь некоторую ограниченную проверку данных при их получении.

Пока я смотрел на

  • BSON
  • Etch
  • Гессиан авро
  • ICE
  • MessagePack
  • Буферы протокола
  • бережливость

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

Я также посмотрел на ASN.1 для кодирования ECN, но это кажется слишком нечитаемым, вызывая проблему с документацией.

Я смотрел на создание структуры C# из структуры C, но там не было хорошего варианта.

Любые рекомендации?

1 ответ

То, что вы хотите, это система трансформации программ.

Это инструменты, которые могут читать произвольные экземпляры компьютерного языка, а затем преобразовывать их в другие допустимые экземпляры языка, иногда на одном языке, иногда на другом языке. Они являются общими в том, что вы можете предоставить им описание языков, которыми вы хотите манипулировать, и они могут затем работать с этими языками.

Хорошие инструменты в этом пространстве позволяют вам писать преобразования кода в терминах ("поверхностного") синтаксиса интересующих языков, по сути, в форме "если вы видите это, замените его этим".

Для сценария OP основными трансформациями являются "если вы видите этот слот в структуре, замените его соответствующими геттерами и сеттерами и заменяющим элементом структуры для целевого языка.

В вашем случае вам нужно выбрать один из 3 сценариев:

  • Определите абстрактный язык для определения структур данных и создайте программные преобразования, которые отображаются из языка спецификации в C# и C.
  • Решите, что объявления данных C являются ссылками, и сгенерируйте соответствующий код C#.
  • Решите, что объявления данных C# являются ссылками, и сгенерируйте соответствующий код C.

Затем вам придется сесть, определить языки инструмента (если они еще не определены) и сконструировать преобразования.

(Полное раскрытие: я создаю такой инструмент. См. Мою биографию).

Другие вопросы по тегам