24.11.2020

Выпуск языка описания бинарных форматов 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, Go, Nim). Сформированные модули будут включать сгенерированный код для парсера, который может читать описанную структуру данных из файла и предоставлять доступ к содержимому в форме удобного 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».
  • Язык выражений:
  • Общие улучшения компиляции:
    • Поддержка деревьев директорий, похожих на 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» не указан.
  • Разное:
    • Компилятор 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.

Источник: https://www.opennet.ru/opennews/art.shtml?num=53912

Добавить комментарий