Мінімізація програми


10

Мінімізація схем - це проблема мінімізувати розмір заданої ланцюга. Чи є щось подібне для загальних програм?

Зокрема, моє запитання -

Чи існують алгоритми, щоб мінімізувати кількість інструкцій для даної програми. Я знаю, що це нерозв'язна проблема, але я не шукаю рішення, яке поверне щось оптимальне.

Хоча для цього можна застосувати попередні перетворення компілятора, я шукаю те, де мені не потрібно заздалегідь визначати набір дуже вузьких перетворень та алгоритмів для їх пошуку.

Редагувати: Інше питання, яке у мене є, чи може бути обчислення, яке є надійним і повним, що дозволяє нам досліджувати весь простір таких семантично еквівалентних програм, чи це неможливо.


2
Відповідь на ваше інше питання залежить від вашого визначення "обчислення". Той факт, що HALT не відповідає coRE, дає відповідь "ні" для більшості таких визначень.

fn

Відповіді:


10

Існує наївний алгоритм для програм з обмеженими розмірами: перерахуйте всі програми в порядку збільшення довжини (або часу виконання, що є обмеженою функцією довжини). Якщо ви зможете довести, що програма еквівалентна оригіналу, зупиніться; інакше продовжуйте пошук.

Цей алгоритм є звуковим. Для того, щоб він був повноцінним, ви повинні мати можливість довести, що всі відхилені програми не рівнозначні оригіналу. Це можливо в кінцевих моделях машин, якщо у вас є обмежений розмір вводу.

Зауважте, що коли час виконання програми залежить від вкладених даних, оптимальне рішення може не бути. Якщо ви шукаєте, наприклад, найгірший зв'язаний випадок, ви дуже швидко зіткнетесь з невідповідними еквівалентами, коли будете кількісно оцінювати всі можливі необмежені входи, і виникнете проблеми, які не можна вирішити, якщо входи обмежені.

Десятиліття тому "Деналі: цільовий супероптимізатор" Радєєва Джоші, Грега Нельсона та Кіта Рандалла зміг знайти оптимальні програми з приблизно 5 машинних інструкцій. Я не переглядав останні результати.


5
Один з наших студентів тут, в Університеті Сассекса, використовував супероптимізацію, щоб скоротити тривалість основної програми Java (наприклад, додавання). Для цього він спалив величезну кількість обчислень Amazon EC2. Його дисертація тут . Зрозуміло, це не підхід для нічого, крім дійсно коротких програм.
Мартін Бергер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.