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.
Открыть на GitHub: uw-pluverse/perses →
RepoRadar