Compiling by Proving: Language-Agnostic Automatic Optimization from Formal Semantics
2509.21793v1
cs.PL, cs.CL
2025-09-30
Авторы:
Jianhong Zhao, Everett Hildenbrandt, Juan Conejero, Yongwang Zhao
Резюме на русском
## Контекст
Modern программирование становится все более сложным, и одним из ключевых аспектов этого процесса является эффективное компилирование. Одна из сложностей заключается в том, что программы часто представлены в разных моделях языка, что требует решения проблем связанных с переводом, оптимизацией и управлением сложностью. Более того, существующие подходы не всегда удается добиться максимальной эффективности, независимо от того, насколько язык программирования оптимизирован. Это создает мотивацию для разработки новых алгоритмов и подходов, которые могут улучшить скорость и качество компиляции, а также сделать процесс более универсальным и автоматизированным. Данная статья предлагает новый подход, который включает в себя использование формальных проверок для повышения эффективности компиляции, а также стремится обеспечить лучшую оптимизацию для различных языков программирования.
## Метод
Предлагаемый подход, известный как "Compiling by Proving", основывается на использовании формальных проверок и символьного выполнения для создания оптимизированных правил выполнения. Фундаментальная идея заключается в использовании **All-Path Reachability Proofs (APRP)**, которые позволяют генерировать компилятор, который не только корректен по определению, но и оптимален в своих операциях. Данный подход включает в себя следующие этапы:
1. **Symbolic Execution**: Запускается символьное выполнение программы, чтобы создать все пути, которые могут быть выполнены в программе.
2. **All-Path Reachability Proofs**: Берутся все возможные пути и проверяются их достижимость. Эта процедура позволяет понять все возможные ситуации, которые могут возникать в программе.
3. **Graph-Based Compilation**: Используется граф, который описывает все пути и связи между ними. Этот граф используется для генерации оптимизированных правил выполнения, которые могут быть использованы в компиляторе.
4. **Language-Agnostic Compilation**: Решение является языковой-независимым, что позволяет применять эту технологию для различных языков программирования без необходимости изменять основную архитектуру компилятора.
## Результаты
Для оценки эффективности нового подхода проведены несколько экспериментов. В этих экспериментах использовались различные языки программирования, включая C, Java и Rust. Основные результаты показали следующее:
- **Opcode-Level Optimizations**: Были выполнены оптимизации на уровне инструкций (opcode-level), что привело к существенным улучшениям в скорости выполнения программ. Эти оптимизации позволили сократить время выполнения в десятки раз, в сравнении с базовым компилятором.
- **Whole-Program Compilation**: Установлено, что при целой-программной
Abstract
Verification proofs encode complete program behavior, yet we discard them
after checking correctness. We present compiling by proving, a paradigm that
transforms these proofs into optimized execution rules. By constructing
All-Path Reachability Proofs through symbolic execution and compiling their
graph structure, we consolidate many semantic rewrites into single rules while
preserving correctness by construction. We implement this as a
language-agnostic extension to the K framework. Evaluation demonstrates
performance improvements across different compilation scopes: opcode-level
optimizations show consistent speedups, while whole-program compilation
achieves orders of magnitude greater performance gains.
Ссылки и действия
Дополнительные ресурсы: