Привалов Александр Николаевич, д-р техн. наук, профессор, privalov. ei a mail.ru, Россия, Тула, Тульский государственный педагогический университет им. Л.Н. Толстого,
Гладких Илья Юрьевич, программист, gladkihinagmail.com, Россия, Тула, Тульский государственный педагогический университет им. Л.Н. Толстого
EMULATION OF A RELAY RACE WITH A UNIVARIATE PROMOTION ROUTE
A.N. Privalov, I.J. Gladkih
This article is devoted to the software implementation of emulation passing the relay with a monovariant relay route. A mathematical model and a sequential solution algorithm are considered. And also the variants of the parallel softwaresolutionaredescribed.
Key words: relay, programming, parallel programming, informatics.
Privalov Aleksandr Nicolaevich, doctor of technical sciences, professor, privalov. 61 a mail. ru, Russia, Tula, Tula State Pedagogical University named after Lev Tolstoy,
Gladkih Ilya Yurievich, programmer, gladkihin a mail. ru, Russia, Tula, Tula State Pedagogical University named after Lev Tolstoy
УДК 004.42; 519.85
РАЗРАБОТКА БИБЛИОТЕКИ КЛАССОВ С++ ДЛЯ РАБОТЫ С ДИНАМИЧЕСКИМИ ТИПАМИ ДАННЫХ DWARF
И.Ю. Гладких, А.Н. Привалов
Рассмотрен формат данных DWARF, основным принципам построения структуры данных в соответствии с форматом DWARF, ее преимуществами и недостатками. Разработана библиотека для поддержки типологии, основанной на DWARF, для языка С++ в соответствии со спецификацией mapsforge версии 3.
Ключевые слова: DWARF, код переменной длины, программирование, информатика.
Классический подход к размещению информации в машинной памяти основан на том, что для единицы информации выделяется объем памяти, заранее определенный в соответствии с природой и величиной данных - эти свойства характеризуют тип данных [1 - 4]. Структура типа данных такова, что система знает, где начинается и заканчивается единица информации и, таким образом, считывает именно эту единицу, эти границы четко определены заданным типом данных размером, который в свою очередь жестко привязан к типу данных и статичен для каждого типа
597
данных. Стандартные повсеместно используемые типы данных обладают существенным недостатком для обработки данных разрядов принадлежащих RBigdata - это ограничения диапазона возможных значений данных определенными максимальными значениями и максимальной возможной длины последовательности данных, что вызвано фундаментальной характеристикой этих типов данных - заранее определеннойпо размерам пространства памяти для хранения некоторой единицы информации. В следствии той же причины возникает и обратная проблема - невозможность выделить объем памяти меньший определенного размера, излишнее выделение объемов памяти неиспользуемых в работе. В то же время машинная арифметика отличается от теоретической «научной» математики, и не маловажной причиной этому является все то же ограничение на объем используемой информации для типа данных унаследованной от ограничения на длину машинного слова. В связи с чем в программировании и информатике возникло целое направление, решающее задачи «длинных чисел». Кардинально решить указанные проблемы призван динамический формат записи и чтения данных.
DWARF - Debugging With Attributed Record Formats (английский) -отладка с использованием атрибутивных форматов записей [6],суть данной технологии - это использование не заранее заданной области памяти для размещения одной единицы информации, а заранее неизвестной величины, одна граница которой известна заранее (начало выделенного участка памяти), а вторая помечена специальным маркером, найти который возможно при последовательном прочтении участка памяти от его начала, данная концепция размещения данных подобна концепции размещения данных файла до маркера конца файла (EOF - endoffile).
Также, как классические типы данных, динамические типы данных определяются природой информации, которой соответствуют целые и вещественные числа, знаковые и беззнаковые, символы. Однако в отличии от классических типов данных динамические не зависят от конкретных значений и хранимые им значения не ограничены минимально и максимально допустимыми. В связи с чем нет необходимости в создании нового типа данных для большого по значению числа, чем мог хранить уже существующий тип данных. Таким образом, количество динамических типов данных существенно меньше классических. И в то же время по той же причине существенным аспектом использования динамических типов данных является тот факт, что они по своей сути являются полностью масштабируемыми структурами, а значит системы, сконструированные на их основе, не будут нуждаться в переконфигурировании или даже полной перестройки с нуля как с классическими типами данных в случае увеличения объемов, данных подлежащих обработки системы и выходящих за предварительные расчеты.
Однако существенным недостатком для широкого применения кодирования с переменной длиной [7] является ее новизна и как следствие малая практическая база готовых решений. Во многих случаях для использования DWARF необходимо создавать специальные решения поддержки типологии, основанной на DWARF, определенной системой или языком программирования. В частности, DWARF поддерживается в проприетарной операционной системе z/OS от IBM для языка С++ (но только в ней), для Цшхподобных систем существует ряд свободно распространяемых модулей языка C, c 2016 для того же языка C созданы модули поддержки для платформы Windows; Android системы также осуществляют поддержку динамической типизации в своих приложениях, но по принципу черного ящика. Существующих реализаций модулей поддержки типологии DWARF недостаточно для широкого применения вне зависимости от необходимой операционной системы и предпочитаемого языка программирования. В целях решения этой проблемы для использования ресурсов проекта mapsforgev.3 [8] была разработана библиотека классовС++ для работы с динамическими типами данныхDWARF4 [5] на основе открыто распространяемых технологий и библиотек С++. Созданный набор классов включает структуры хранения данных, методы обработки и ввода-вывода, а также конвертации в классические типы данных и обратно. Использование библиотеки возможно в любой системе, поддерживающей работу со стандартом С++11 или выше.
В основе библиотеки лежит класс C++ побитового представления данных bitset. Благодаря ему работа с битовыми данными уподобляется работе с массивом логических данных.
Библиотека поддерживает следующие типы данных согласно стандарту DWARF версии 4[5, 8]:
Целые беззнаковые числа (в дальнейшем VBE-UINT) согласно типу «Unsigned LEB128» [7];
Целые знаковые числа (в дальнейшем VBE-SINT) согласно типу «Signed LEB128» [7];
Строковые данные (в дальнейшем VBE-Ustring) согласно спецификации mapsforge [8].
Тип VBE-UINT
Для представления беззнакового целого числа как VBE-UINT используется стандарт «unsigned LEB128». Для этого при кодировании число представляется в двоичной системе исчисления, затем к нему дописываются незначащие нули числом до длины (количества цифр в числе) кратном семи. Дополненная двоичная запись числаразделяется на группы по семь цифр. К каждой группе цифр дописывается дополнительная старшая цифра: 0 - если это группа со старшими значащими цифрами двоичной записи исходного числа, 1 - в противном случае. Получившиеся байтовые группы располагаются в обратном порядке - данная запись рассматривается как VBE-UINT [7].Пример преобразования из int в VBE-UINTпоказан на рисунке.
624485 10011000011101100101 010011000011101100101 0100110 0001110 1100101 00100110 10001110 11100101 11100101 10001110 00100110 111001011000111000100110
Преобразования из int в VBE-UINT
Класс VBE_U_int, предназначенный для хранения и обработки VBE-UINT основан на композиции классов vector и bitset. Что позволяет динамически определять размер битовой последовательности данных при создании экземпляра класса, например, при чтении двоичных данных из файла или области оперативной памяти.
Класс VBE_U_intвключает в себя следующие доступные для вызова методы:
- VBE_U_int() - создание пустого экземпляра класса VBE_U_int;
- VBE_U_int(char* Sm) - создание экземпляра класса VBE_U_int в соответствии с байтовой последовательностью Sm;
- обращение к конкретному биту битовой последовательности текущего значения экземпляра класса VBE_U_int;
- присвоение экземпляру класса VBE_U_intопределенного значения типа VBE-UINTS;
- intsize() - определение размера битовой последовательности текущего значения экземпляра класса VBE-UINT;
- boolItIsZero() - сравнение текущего значения экземпляра класса VBE_U_int с нулем;
- декремент текущего значения экземпляра класса VBE_U_int;
- инкремент текущего значения экземпляра класса VBE_U_int;
- вычитание из текущего значения экземпляра класса VBE_U_int числа типа int;
- voidclear() - очищение области памяти занимаемой экземпляром класса VBE_U_int;
- INT64 ConvertToInt() - конвертация текущего значения экземпляра класса VBE_U_int в число типа INT64;
- intshift() - определение количества байт занимаемых экземпляром класса VBE_U_int;
- вывод в поток битовой последовательности текущего значения экземпляра класса VBE_U_int;
Тип VBE-SINT
Для представления знакового целого числа как VBE-SINT используется стандарт «signed LEB128». Структура данных числа совпадает с VBE-U INT с той лишь разницей, что в конечной записи последний байт числа имеет лишь 6 последних значащих битов, а второй бит в этом байте отвечает за знак: 0 для положительных чисел и нуля, 1 для отрицательных чисел [7].
Класс VBE_S_int, предназначенный для хранения и обработки VBE-SINT, основан на классе VBE_U_int и наследует от него структуру данных и методы хранения и обработки данных, за тем лишь исключением, что добавлен метод определения знака числа, в соответствии с чем скорректированы методы инкрементирования, декрементирования и вывода данных в поток.
Тип VBE-Ustring
Строки типа VBE-U string представляют собой упорядоченную битовую структуру [8]:
- Количество символов, записанное числом типа VBE-UINT, идущих за этим числом и принадлежащих этой строке
- Однобайтовые символы в кодировке UTF-8
Класс VBE_U_string, предназначенный для хранения и обработки VBE-U string основан на комбинации классов VBE_U_int и vector от типа char. Что соответствует определению и позволяет динамически определять размер битовой последовательности данных при создании экземпляра класса, например, при чтении двоичных данных из файла или области оперативной памяти.
Класс VBE_U_string включает в себя следующие доступные для вызова методы:
- VBE_U_string() - создание пустого экземпляра класса VBE_U_string;
- VBE_U_string(char* Sm) создание экземпляра класса VBE_U_string в соответствии с байтовой последовательностью Sm;
- обращение к конкретному биту битовой последовательности текущего значения экземпляра класса VBE_U_string;
- присвоение экземпляру класса VBE_U_string определенного значения типа VBE-Ustring;
- voidclear() - очищение области памяти занимаемой экземпляром класса VBE_U_string;
- вывод в поток битовой последовательности текущего значения экземпляра класса VBE_U_string;
- вывод в поток текущего значения (символьной последовательности) экземпляра класса VBE_U_string;
- intshift() - определение количества байт занимаемых экземпляром класса VBE_U_string.
Для удобства работы с данными в форматах VBE-UINT, VBE-SINT и VBE-Ustring в библиотеке присутствуетнезависимая от указанных классов функция чтения байтовых данных в обратном порядке rmemcpyCHAR, рассматривающая последовательность битов как последовательность байтов (однобайтовых символов) и возвращающая ее в обратном побайтовом порядке.
Разработанная библиотека может быть использована для работы с данными цифровых карт, созданных согласно спецификации mapsforgev.3, переводя множество данных описания географических объектов в граф, представленный многомерным массивом, и обратно с целью поиска определенных маршрутов на картах, найденных по некоторым алгоритмам. Реализация на языке C++ позволит упростить процесс создания мультиплат-форменного программного комплекса с использованием DWARF, а использование стандартных технологий C++ не привязанных к конкретной реализации или семейству операционных систем позволит решить проблемы переноса системы между различными системами.
Использование типологии, основанной rnDWARF, позволяет сокращать объем используемой памяти для хранения плохо нормализуемой информации (такой как перечень и описание географических объектов на участке карты, перечень и описание товаров электронной торговли и т.п.), т. е. данные в такой форме записи могут существенно сократить сетевой трафик необходимый для передачи плохо нормализуемой информации. Числа, записанные согласно форматуDWARF неограниченны максимальным или минимальным значениями, могут обеспечить любую точность рационального числа. Однако существенно проигрывают в скорости обработки процессором относительно классических типов данных.
Список литературы
1. Date C.J. Date on database: Writings 2000—2006: монография. Apress, 2006. 546 c.
2. IEEE Std 1320.2-1998 (R2004) IEEE Standard for Conceptual Modeling Language Syntax and Semantics for IDEF1X97 [Электронный ресурс]. URL: http://standards.ieee.org/findstds/standard/1320.2-1998.html (дата обращения: 06.08.2017).
3. ISO/IEC 19500-2:2003, Information technology — Open Distributed Processing — Part 2: General Inter-ORB Protocol (GIOP)/Internet Inter-ORB Protocol (IIOP) [Электронный ресурс]. URL: https://www.iso.org/obp/ui/ #iso:std:iso-iec-ieee:24765:ed-1:v1:en (дата обращения: 06.08.2017).
4. ISO/IEC/IEEE 24765-2010 Systems and software engineering — Vocabulary [Электронный ресурс]. URL: https://www.smaele.nl/documents/iso/ ISQ-24765-2010.pdf (дата обращения: 06.08.2017).
5. DWARF Debugging In formation Format V4 [Электронный ресурс]. URL: http://dwarfstd.org/doc/DWARF4.pdf (дата обращения: 06.08.2017).
6. Dwarf Home [Электронный ресурс]. URL: http://dwarfstd.org/Home.php (дата обращения: 06.08.2017).
7. LEB128 - Wikipedia [Электронный ресурс]. URL: https://en.wikipedia.org/wiki/LEB 128#Unsigned LEB128 (дата обращения: 06.08.2017).
8. Mapsforge: Specification: Mapsforge Binary Map File Format [Электронный ресурс]. URL: http://mapsforge.org/docs/master/md docs Specification- Binary-Map-File.html (дата обращения: 06.08.2017).
9. z/OSXLC/C++ documentation library - Uneted States [Электронный ресурс]. URL: http://www-01.ibm.com/support/ docview.wss? uid= swg27036892 (дата обращения: 06.08.2017).
Гладких Илья Юрьевич, программист, gladkihiuamail.ru, Россия, Тула, Тульский государственный педагогический университет им. Л.Н. Толстого,
Привалов Александр Николаевич, д-р техн. наук, профессор, privalov. 61amail.ru, Россия, Тула, Тульский государственный педагогический университет им. Л.Н. Толстого
DEVELOPMENT OF A C ++ CLASS LIBRARY FOR WORKING WITH DYNAMIC
DWARF DATA TYPES
I.J. Gladkih, A.N. Privalov
This article is devoted to the DWARF data format, the basic principles of constructing a data structure in accordance with the DWARF format, its advantages and disadvantages. A librarywasdeveloped to support the typology, based on DWARF, for the C + + language in accordance with the specification mapsforge version 3.
Key words: DWARF, variable-length code, programming, informatics.
Gladkih Ilya Yurievich, programmer, gladkihiuamail. ru, Russia, Tula, Tula State Pedagogical University named after Lev Tolstoy,
Privalov Aleksandr Nicolaevich, doctor of technical sciences, professor, privalov. 61a mail. ru, Russia, Tula, Tula State Pedagogical University named after Lev Tolstoy