Набор POSIX-утилит и декодировщик AV1, написанные на Rust

Опубликован выпуск проекта posixutils-rs 0.2.1, нацеленного на разработку на языке Rust коллекции утилит командной строки, упоминаемых в стандарте POSIX и соответствующих его требованиям (cp, mv, awk, make, vi, find, sort, wc, xargs, sh, m4, sed и т.п.). При разработке по возможности используются уже существующие crate-пакеты. Код posixutils-rs распространяется под лицензией MIT.

Проект сосредоточен главным образом на достижении соответствия требованиям спецификации POSIX.2024 и не планирует обеспечивать совместимость с утилитами GNU, функциональность которых воспринимается авторами как необоснованно раздутая. Тем не менее, в posixutils-rs планируется реализовать наиболее популярные расширенные опции утилит GNU, встречающиеся в существующих скриптах.

Из отличий от проекта uutils, развивающего реализацию GNU Coreutils на Rust, упоминается более широкий охват утилит, включающий, среди прочего, создание таких упоминаемых в POSIX компонентов системы, как vi, awk, bc, m4, cron и компилятора c99, а также минималистичный подход, подразумевающий предоставление только минимально необходимого набора опций, определённых в спецификации POSIX или без которых проблематично обойтись. Программы в наборе posixutils-rs изначально поставляются в виде самодостаточного кода, который можно использовать в других проектах.

В настоящее время 55 развиваемых проектом утилит соответствуют POSIX и находятся на стадии покрытия тестами, в 22 утилитах обеспечена необходимая функциональность (но пока не реализовано покрытие тестами), 20 находятся на стадии чернового варианта, а работа над 44 утилитами ещё не начата. Среди утилит c реализованной функциональностью: awk, basename, bc, cp, cut, chown, date, diff, file, find, grep, ls, nice, ps, sort, strings, tail, tr, tty, wc, uniq. Среди утилит, работа над которыми не начиналась: crontab, c17, cflow, ctags, gettext, ed, ex, iconv, lex, locale, mailx, make, patch, pax, sed, sh, sccs, yacc, uucp, vi.

Из изменений в новом выпуске отмечается добавление реализаций утилит awk, m4, ps, realpath, join, time, fuser и gencat, а также начальная поддержка работы в окружениях на базе Си-библиотеки musl и предоставление библиотеки ftw для обхода дерева каталогов с защитой от состояний гонки.

Дополнительно можно отметить анонс проекта rav1d, развивающего высокопроизводительный декодировщик формата кодирования видео AV1, написанный на языке Rust. Разработка ведётся через портирование на Rust кода декодировщика библиотеки dav1d, отличающейся высокой производительностью. Подготовленный порт полностью совместим с API библиотеки dav1d. Выбор в пользу портирования существующей библиотеки вместо написания собственного варианта объясняется желанием использовать в качестве основы уже проверенный и протестированый декодировщик, чтобы избежать возможных проблем с совместимостью и учесть все тонкости работы с форматом AV1.

В текущем виде подготовленная реализация rav1d на 6% отстаёт по производительности от dav1d, но в дальнейшем после оптимизации кода планируется добиться паритета в производительности. Для достижения высокой производительности использован подход при котором базовые функции декодирования примитивных значений реализованы на ассемблере в виде unsafe-блоков (задействован ассемблерный код из dav1d), данные в которые поступают после проверки написанными на Rust функциями разбора потока (прошлый опыт выявления уязвимостей в декодировщиках видео показывает, что проблемы в основном возникают в высокоуровневом коде разбора формата, а не в низкоуровневых операциях с данными).