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.

Ссылки и действия