Мета-язык для кодирования генерирует упакованные структуры для структур 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.
Затем вам придется сесть, определить языки инструмента (если они еще не определены) и сконструировать преобразования.
(Полное раскрытие: я создаю такой инструмент. См. Мою биографию).