научная статья по теме ЯЗЫК ПРОГРАММИРОВАНИЯ БИНАРНЫХ ПРОТОКОЛОВ BPL (BINARY PROTOCOL LANGUAGE) Общие и комплексные проблемы естественных и точных наук

Текст научной статьи на тему «ЯЗЫК ПРОГРАММИРОВАНИЯ БИНАРНЫХ ПРОТОКОЛОВ BPL (BINARY PROTOCOL LANGUAGE)»

Пшеничников А.С., аспирант Института точной механики и вычислительной техники им. С.А. Лебедева Российской академии наук

ЯЗЫК ПРОГРАММИРОВАНИЯ БИНАРНЫХ ПРОТОКОЛОВ BPL (BINARY PROTOCOL LANGUAGE)

Существующие языки программирования не предоставляют разработчику возможностей удобного и эффективного механизма обращения с бинарными данными и битовыми полями. Такие операции являются не сложными, но громоздкими. С целью облегчить работу с бинарными данными и обработку пакетных протоколов, сократить размер и улучшить наглядность программного кода создан язык программирования BPL (Binary Protocol Language). Данная статья описывает преимущества языка BPL, синтаксис, примеры использования. Язык BPL является расширением языка Си (стандарт С99), объединяет свойства таких языков программирования как Erlang, Cyclone.

1. Общие принципы предлагаемого подхода

1.1. Назначение языка BPL

Язык программирования BPL предназначен для эффективной работы с бинарными протоколами. Создаваемый язык обладает необходимыми конструкциями и операторами для обработки бинарных данных. Существующие протоколы подразумевают обмен структурными единицами - кадрами - в соответствии с определенным набором правил. Каждый протокол имеет свой специфический формат кадра. Возможности языка BPL позволяют компактно и наглядно описать разбор кадров протокола, анализ и обработку полученной информации.

В язык BPL введены новые конструкции для работы с бинарными данными. Это позволяет осуществлять такие операции как анализ и разбор битовых полей;

1.3. Свойства языка BPL

Язык BPL является расширением языка программирования Си. Соответственно в создаваемом языке полностью соблюдается стандарт языка Си (типы данных, последовательность объявления и т.д.).

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

Обращение к битовым полям является задачей несложной, но громоздко реализуемой. При работе с бинарными протоколами необходимо выполнять разбор данных определенного формата в соответствии с выбранным протоколом. Осуществление этих операций возможно только путем создания и использования большого количества дополнительных сложных структур, модулей и функций. В связи с этим, для работы с бинарными данными и протоколами введены новые конструкции.

Прежде всего, это конструкция, подобная конструкции binaries из высокоуровневого функционального языка программирования Erlang. В данном случае не вводится новый тип данных, иначе организована работа с существующим типом данных (char*). Конструкции binaries в языке BPL идеологически реализованы аналогично языку Erlang, однако синтаксическое представление изменено в соответствии со стандартом языка Си.

При вводе нового для языка Си принципа обработки бинарных данных необходимо наличие операторов, способных выполнять эти функции. Для этих целей существенные изме-

223

нения претерпел оператор switch (по сравнению с Си). Идеология оператора switch реализована подобно аналогичному оператору языка программирования Cyclone. Такой подход позволяет повысить надежность языка при работе с бинарными данными.

Также, введены 2 новых оператора:

• mem_read; *----[ Формат: Список

• mem_write.

1.2. Требования к языку BPL

Язык программирования бинарных протоколов BPL должен являться расширением языка Си (выбор стандарта Си см. ниже).

Задача нового языка объединить свойства языка Си со следующими возможностями:

- сократить размер программного кода при работе с бинарными данными и протоколами;

- повысить надежность при работе с бинарными данными;

- повысить наглядность программного кода;

Также одной из важнейших задач нового языка является сохранение производительности, сопоставимой с языком Си.

Создание такого языка программирования даст возможность ускорить процесс написания программ и сократить размер программного кода. Это позволит представить программный код более наглядно и компактно, и, как следствие, уменьшить количество ошибок и сократить время на модификацию программного кода.

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

1.4. Выбранный стандарт языка программирования Си

В 1978 году была опубликована первая редакция книги «Язык программирования Си» Ритчи и Кернигана [2]. Эта книга, известная среди программистов как «K&R», служила многие годы неформальной спецификацией языка.

K&R ввёл следующие особенности языка:

- записи (тип данных struct); Формат: Список

- длинное целое (тип данных long int);

- целое без знака (тип данных unsigned int);

- оператор += и подобные ему (старые операторы =+ вводили анализатор лексики компилятора Си в заблуждение, например, при сравнении выражений i =+ 10 и i = +10).

K&R C часто считают самой главной частью языка, которую должен поддерживать компилятор Си. Многие годы даже после выхода ANSI C, он считался минимальным уровнем, которого следовало придерживаться программистам, желающим добиться от своих программ максимальной портативности, потому что не все компиляторы тогда поддерживали ANSI C, а хороший код на K&R C был верен и для ANSI C.

После публикации K&R C в язык было добавлено несколько «неофициальных» возможностей:

- функции, не возвращающие значение (с типом void) и указатели, не имеющие типа (с Формат: Список типом void *);

- функции, возвращающие объединения и записи;

- имена полей данных записей в разных пространствах имён для каждой записи;

- присваивания записей;

- спецификатор констант (const);

- стандартная библиотека, реализующая большую часть функций, введённых различными производителями;

- перечислимый тип;

- дробное число единичной точности (float).

224

-^Формат: Список

В 1983 году Американский Национальный Институт Стандартизации (ANSI) сформировал комитет для разработки стандартной спецификации Си. Был утверждён стандарт «Язык программирования Си» ANSI X3.159-1989. Эту версию языка принято называть ANSI С. В 1990 году стандарт ANSI С был принят с небольшими изменениями Международной Организацией по Стандартизации (ISO) как ISO/IEC 9899:1990. ANSI С сейчас поддерживают почти все существующие компиляторы. Почти весь код Си, написанный в последнее время, соответствует ANSI С.

После стандартизации в ANSI спецификация языка Си оставалась относительно неизменной в течение долгого времени. Стандарт подвергся пересмотру в 1999 году, что привело к публикации ISO 9899:1999. Этот стандарт обычно называют «С99». В марте 2000 года он был принят и адаптирован ANSI. Именно С99 выбран в качестве стандарта языка Си, для которого создается расширения в виде языка программирования BPL.

2. Описание языка BPL

Данный раздел подробно описывает введенные конструкции для работы с бинарными данными. Для каждой из них приведены описание синтаксиса, примеры использования.

2.1. Конструкция binaries.

Для реализации конструкции binaries не вводится нового типа данных, используется существующий тип - char*.

Например, объявление переменной bin_data, которая может использоваться как binaries, выглядит следующим образом:

char* bin_data;

Переменная, объявленная таким образом, может использоваться как binaries такими операторами как switch, mem_read и mem_write.

Формат конструкции представлен ниже.

<< T {,T}, [Tail] >>

T = [byte_order] type (l-expr | const) : size;

где:

[byte_order] - порядок следования байт в потоке (опционально);

big - старшими вперед;

little - младшими вперед,

если не указывается - по умолчанию значение big.

l-expr - переменная или выражение, с которым может быть произведена операция присваивания (в соответствии с выбранным стандартом (см. 2.1.4)).

TOnst - целое, либо символьная константа, либо константное выражение.

size - константа. К size предъявляется следующее требование: Xsize должна быть кратна 8, если нет - некомпилируемая конструкция. Это связано с ограничением выравнивания до байта (см. 2.1.5).

[Tail] - переменная типа char* (опционально). Если выражение T выполнилось корректно - принимает значение указателя на байт, первый после последнего выражения T. Если выражение не выполнилось - указывает на первый байт первого выражения T.

Если T = l-expr : size, то l-expr присваивается первые size бит. Значение l-expr ни с чем не сопоставляется. Такое правило справедливо для операторов switch и mem_read. Правила обработки binaries оператором mem_write описаны ниже. Ограничение: нельзя использовать оператор fallthru в теле оператора case(), если следующий оператор case() содержит l-expr.

Если T = const : size (ограничений нет), то значение const сопоставляется с количеством бит = const.

Примеры использования конструкции binaries приведены ниже.

225

2.2. Оператор switch

Для использования конструкций binaries необходим оператор switch, способный с ними работать. Для этого необходимо модифицировать существующий в языке Си (в соответствии со стандартом С99) оператор switch.

2.2.1. Синтаксис оператора switch

Синтаксис оператора выглядит следующим образом:

switch(sw_expr){

case(case_паттерн) [when (expr)]: { <body of case> окончание_са«е;

}

case(case_паттерн) [when (expr)]: { <body of case> OKOH4aH^_case;

}

[default] [when (expr)]: { <body of default> OKOH4aH^_default;

}

}

Оператор switch вычисляет значение sw_expr, в зависимости от состава case_паттерн, выполняет либо сопоставление sw_expr со всеми случаями (case(case_паттерн)), либо присвоение полям case_паттерн значений соответствующих полей sw_expr. В случае выполнения условий case(case_паттерн) и оператора when (expr) выполняется <body of case>. Если ни один из случаев не подходит, то выполняется оператор после префикса default. Префикс default является необязательным, если его н

Для дальнейшего прочтения статьи необходимо приобрести полный текст. Статьи высылаются в формате PDF на указанную при оплате почту. Время доставки составляет менее 10 минут. Стоимость одной статьи — 150 рублей.

Показать целиком