Perses: редуцирует программный код, сохраняя условия из тестов
Perses — это универсальный редуктор программного кода, который сводит программу к минимально возможному виду, сохраняя заданные условия. Он принимает на вход программу и скрипт с тестами, выводя упрощённый код, который по-прежнему удовлетворяет условиям из теста.
Проект отличается от других методов уменьшения, таких как Delta Debugging, тем, что использует синтаксическую информацию из грамматики Antlr для эффективной фильтрации неверных программ. На данный момент поддерживаются несколько языков, включая C, Java, Python и JavaScript, что делает его полезным для разработчиков на разных платформах, желающих упростить код, сохраняя его работоспособность.
Для запуска ты можешь скачать готовый JAR файл или собрать проект из исходников с помощью Bazel. Обрати внимание, что в репозитории пока не указаны ограничения на платформы, но может потребоваться тестовая среда.
Perses: Синтаксически-ориентированное сокращение программ
Perses — это проект, который позволяет уменьшать программы, сохраняя определенные ограничения. Он работает независимо от языков программирования и принимает на вход программу и тестовый сценарий, который задает эти ограничения. В результате работы получается уменьшенная версия программы, удовлетворяющая заданным условиям. В отличие от других методов, таких как Delta Debugging, Perses учитывает синтаксическую информацию из грамматики Antlr, что позволяет избежать генерации синтаксически некорректных программ.
Поддерживаемые языки
На данный момент Perses поддерживает сокращение программ на следующих языках:
- C: `*.c`
- C++: `*.cc`, `*.cpp`, `*.cxx`
- GLSL: `*.glsl`, `*.comp`, `*.frag`, `*.vert`
- Go: `*.go`
- Jackson YAML: `*.jackson`, `*.yaml`, `*.yml`
- Java: `*.java`
- JavaScript: `*.javascript`, `*.js`
- Line: `*.line`
- Makefile: `*.mk`
- MySQL: `*.mysql`
- OneToken: `*.onetoken`
- PHP: `*.php`
- Python 3: `*.py`, `*.py3`
- Ruby: `*.rb`
- Rust: `*.rs`
- Scala: `*.scala`, `*.sc`
- SMT-LIB v2: `*.smt2`, `*.sy`
- Solidity: `*.sol`
- SQLite: `*.sqlite`
- System Verilog: `*.v`, `*.sv`
- WebAssembly: `*.wat`, `*.wasm`
- XML: `*.xml`
Скоро будет добавлена поддержка других языков.
Как получить и запустить
Есть три способа получить Perses:
- Скачать предварительно собранный JAR-файл с [страницы релизов](https://github.com/perses-project/perses/releases). Например:
wget https://github.com/uw-pluverse/perses/releases/download/v2.7/perses_deploy.jar
java -jar perses_deploy.jar [options]? --test-script <test-script.sh> --input-file <program file>
git clone https://github.com/perses-project/perses.git
cd perses
bazelisk build //src/org/perses:perses_deploy.jar
java -jar bazel-bin/src/org/perses/perses_deploy.jar [options]? --test-script <test-script.sh> --input-file <program file>
wget https://raw.githubusercontent.com/perses-project/perses/master/scripts/perses-trunk
chmod +x perses-trunk
./perses-trunk [options]? --test-script <test-script.sh> --input-file <program file>
Обрати внимание, что для успешной работы `perses-trunk` требуется Bazelisk.
Важные параметры
При запуске указываются несколько ключевых параметров:
--test-script <test-script.sh>: скрипт, задающий ограничения, которым должны соответствовать оригинальная и сокращённая версии программы. Он должен возвращать0, если ограничения выполнены.--input-file <program-file>: файл программы, который нужно сократить. В данный момент поддерживаются языки C, Rust, Java и Go.
Ограничения и рекомендации
Тестовый скрипт является ключевым моментом в процессе сокращения: Perses копирует текущую кандидату программу в новую рабочую директорию, выполняет сценарий и оставляет кандидата, только если скрипт возвращает 0. Скрипт должен быть детерминированным, самодостаточным и не блокироваться ожидая ввода от пользователя. Важно, чтобы сценарий избегал побочных эффектов вне рабочей директории, и обертывал все сторонние инструменты в ограничения по времени выполнения.
Также Perses может предоставлять веб-панель для визуализации процесса сокращения, где отображается количество токенов и скорость сокращения. Для её активации нужно использовать параметр --enable-web-ui true.
Лицензия
Проект распространяется под лицензией GNU General Public License 3.
Радар проекта: 60 из 100 — крепкий проект
- Импульс 1 ≈ 1 звезда в месяц
- Темп разработки 77 78 коммитов за 12 недель
- Зрелость 93 проекту 6 лет, 18 релизов
- Сообщество 43 9 участников, 36 форков
- Свежесть 99 последний коммит — 1 день назад
- Быстрый старт 0 инструкции по запуску не нашли
- Готовность к продакшену 90 релиз v2.7, автосборка, тесты
- Безопасность и доверие 60 лицензия GPL-3.0, организация
- Документация 93 README 24.4 тыс. знаков, 10 разделов, папка docs
- Экосистема 47 6 подписчиков на обновления, 7 тем
Как считаем
Только открытые данные GitHub на 14.11.2026, без оценок нейросети. Каждая ось — от 0 до 100, итог — среднее.
- Импульс — звёзд в день: за время наших замеров, а пока их нет — за всю жизнь проекта; 200 в день — максимум.
- Темп разработки — коммитов за последние 12 недель; 300 — максимум. Пока GitHub не досчитал статистику, ось не учитывается.
- Зрелость — возраст проекта (3 года — максимум) и число релизов (30 — максимум), поровну.
- Сообщество — участников с коммитами (200 — максимум) и форков (5000 — максимум), поровну.
- Свежесть — дней с последнего коммита: сегодня — 100, полгода и больше или архив — 0.
- Быстрый старт — в README есть команда установки, раздел «быстрый старт» или примеры использования, в репозитории — Docker и папка примеров, у проекта есть сайт или демо.
- Готовность к продакшену — релизы, версия 1.0 и выше, автосборка (GitHub Actions), тесты, лицензия, журнал изменений.
- Безопасность и доверие — открытая лицензия (своя — половина балла), политика безопасности (SECURITY.md), проект организации, правила для участников, не в архиве.
- Документация — объём и структура README, папка docs или сайт, оценка «здоровья сообщества» GitHub.
- Экосистема — звёзды (50 тыс. — максимум), подписчики на обновления (1000 — максимум), темы репозитория.
Открыть на GitHub: uw-pluverse/perses →
RepoRadar