Выпуск языка описания бинарных форматов Kaitai Struct 0.9
Представлен новый выпуск Kaitai Struct 0.9, декларативного языка разметки для описания различных бинарных структур данных — бинарных форматов файлов, архивов, сетевых пакетов, файловых систем, изображений, видео и т.п. Код компилятора Kaitai Struct распространяется под лицензией GPLv3, а библиотек под лицензиями MIT и Apache 2.0.
Основная идея проекта в том, что конкретный формат может быть описан на языке Kaitai Struct и затем транспилирован при помощи kaitai-struct-compiler в исходный текст на одном из поддерживаемых языков программирования (C++, C#, Java, JavaScript, Perl, PHP, Python, Ruby). Сформированные модули будут включать сгенерированный код для парсера, который может читать описанную структуру данных из файла и предоставлять доступ к содержимому в форме удобного API. Проектом также развивается IDE для визуального исследования файлов.
В новой версия добавлена поддержка целевого языка C++11 (с умными указателями). Реализовано несколько новых функций, таких как валидация и обработка структур поверх little-endian чисел. Структуры поверх чисел, известные как «bit-sized types» в местной терминологии — это когда поле занимает нецелое число байт. Это было и раньше, но только для big-endian. Для little-endian это делалось полностью вручную: программист должен был самостоятельно переотобразить позиции битов в little-endian числе в big-endian число, если поле переходит границы байтов — порезать и склеить.
Сейчас это частично автоматизированно, но не через прослойку для переотображение бит и обобщение endianness, при этом сохраняя прежний («be») порядок перечисления полей в структуре. Новый ведущий разработчик Petr Pucil решил, что для little-endian хорошо бы перечислять поля тоже в little-endian порядке, что приводит как минимум к тому, что при описании «bit-sized types» в форматах, которые могут иметь как «be», так и «le» endianness, приходится в явном виде иметь по 2 варианта одной и той же структуры]).
Главные новшества релиза:
- Поддержка новых целей:
- Python с библиотекой Construct.
- HTML — для документации, предварительная поддержка.
- Nim — начальный уровень поддержки (проходит 51% тестов).
- Новые возможности языка Kaitai Struct:
- doc-ref поддерживает список ссылок.
- «meta/tags» позволяют специфицировать несколько тегов для улучшения навигации в галерее форматов.
- Разрешён доступ ко вложенным типам используя синтаксис «foo: bar».
- Реализована валидация распарсенных данных, используя ключ «valid».
- Реализованы вычисляемые во время компиляции операторы «sizeof» и «bitsizeof». Для типа: «sizeof‹u4›», «bitsizeof‹b13›», «sizeof‹user_type›». Для значения: «file_header._sizeof», «flags._bitsizeof» (где «file_header» и «flags» — поля, определённые в текущем типе).
- Реализована поддержка little-endian типов с полями с размером в нецелое число байт. Выбор endianness осуецествляется через суффикс le/be: «type: b12le», «type: b1be». Для выбора битовой endianness (le/be) по умолчанию добавлен ключ «meta/bit-endian».
- Язык выражений:
- Форсированные массивы байт, настоящие литералы массивов и литералы массивов «пустого» типа.
- Новые методы: массивы байт: «length».
- Разрешено приведение к чистым типам:».as‹u2›»,».as‹str›».
- Общие улучшения компиляции:
- Поддержка деревьев директорий, похожих на Maven, путём недобавления более поддиректории «src» для результатов Go и Java. Хотя изменение с большей вероятностью ломает существующие построения, оно уравнивает языки Go и Java с другими. Кроме того, добавление поддиректорий проще для пользователя, чем удаление некоторых добавленных Kaitai автоматически.
- Улучшенные сообщения об ошибках.
- Поддержка .ksy файлов с UTF-8 BOM.
- Сообщения об ошибках отправляются в stderr, а не в stdout.
- Режим »--debug» разделён на »--no-auto-read» и »--read-pos».
- Добавлен режим C++11, включаемый через опцию »--cpp-standard 11» (98 по умолчанию).
- C++11 цель: поддерживает литералы массивов, использует »#pragma once» (вместо »#ifndef FOO_H_» header guards) и «std: unique_ptrЬ‹foo› для владеющих указателей, сырые указатели «foo*» для не владеющих.
- Для C++11 реализован редим »--no-auto-read» и добавлена поддержка Windows и Visual C++.
- Преобразования регистра избавлены от зависимости от локали.
- Изменения в API времени выполнения:
- Добавлены исключения «Validation{Not{Equal, AnyOf},{Less, Greater}Than, Expr}Error» наследующие от общего предка «ValidationFailedError» — генерируются на проваленных валидациях, определённых через ключи «valid» или «contents».
- Добавлен метод «read_bits_int_le» для парсинга little-endian целых с размером в битах.
- Создана официальная библиотека алгоритмов сжатия для использования в «process» и внесены изменения в компилятор, чтобы позволить использовать «process» не в runtime.
- Не рекомендованы классы и методы:
- ensure_fixed_contents ⟶ явный «if», который проверяет равенство «readBytes (n)», ожидаемому массиву из «n» байт (генерируя «ValidationNotEqualError» при неудаче)
- UnexpectedDataError ⟶ ValidationNotEqualError
- read_bits_int ⟶ read_bits_int_be
- Значительные исправления:
- «params/type» — добавлена поддержка:
- пользовательских типов
- enum
- массивов байт («bytes»)
- массивов не-байт («u2[]», «struct[]» и т.п.)
- В условном операторе (»? :») и литерале массива исправлено приведение разных типов строк/массивов байт/перечислений/булевых (распарсенных из потока и созданных из литерала).
- Подстрока «not» не может быть использована в выражениях.
- Целые с размером в битах не учитывались как надо в «repeat: eos».
- Исправлен выбор с одним лишь значением по умолчанию (»_: foo»).
- C++: поправили все известные утечки памяти (но всё равно в некоторых случаях потребление слишком большое).
- C++: исправили абсолютные импорты.
- Java: более последовательное закрытие нижележащих IO потоков на вынужденном «close ()».
- Python: обход генерации циклических зависимостей.
- PHP: правка невалидных объявлений «namespace», когда »--php-namespace» не указан.
- «params/type» — добавлена поддержка:
- Разное:
- Компилятор Kaitai Struct доступен в форме плагина к Maven и Gradle.
- Нестабильные бинарные сборки теперь доступны для всех платформ после каждой сборки CI на Bintray Bintray.
- Справочник по языку KS заменён документацией, генерируемой из JSONSchema.
- Содержимое formats.kaitai.io теперь перестраивается автоматически с помощью CI/CD.
- Новая модульная CI/CD-система для компилятора, параллельно работающая на многих разных ОС (Linux, Windows, macOS) и показывающая статус на сайте ci.kaitai.io.
- Обеспечена генерауция тестов из KST-спецификаций, одних и тех же для всех языков.
- Создан список проектов awesome, относящихся к Kaitai Struct.
- Появились альтернативные компиляторы KSC, спефичные для целевых языков и нацеленные на упрощение интеграции KS в сборочные инструментарии: ksc-rs для Rust, kaitaigo для Go и nimitai для nim.
Источник: http://www.opennet.ru/opennews/art.shtml? num=53912
© OpenNet