Minimalizacja programu

10

Minimalizacja obwodu to problem polegający na zminimalizowaniu rozmiaru danego obwodu. Czy jest coś podobnego do programów ogólnych?

W szczególności moje pytanie brzmi -

Czy istnieją algorytmy minimalizujące liczbę instrukcji dla danego programu? Wiem, że to nierozstrzygalny problem, ale nie szukam rozwiązania, które zwróci coś optymalnego.

Podczas gdy można zastosować wcześniej istniejące transformacje kompilatora, szukam czegoś, w którym nie muszę definiować zestawu bardzo wąskich transformacji i algorytmów, aby je wcześniej wyszukać.

Edycja: Drugim pytaniem, jakie mam, jest to, czy można mieć rachunek dźwiękowy, który jest solidny i kompletny, co pozwala nam badać całą przestrzeń takich semantycznie równoważnych programów, czy też nie jest to możliwe.

Optować
źródło
2
Odpowiedź na twoje drugie pytanie zależy od twojej definicji „rachunku różniczkowego”. Fakt, że HALT nie występuje w coRE, powoduje, że w przypadku większości takich definicji odpowiedź brzmi „nie”.
fn

Odpowiedzi:

10

Istnieje naiwny algorytm dla programów z wejściami o ograniczonym rozmiarze: wylicz wszystkie programy w kolejności rosnącej długości (lub czasu wykonania, który jest ograniczoną funkcją długości). Jeśli możesz udowodnić, że program jest równoważny oryginałowi, zatrzymaj się; w przeciwnym razie szukaj dalej.

Ten algorytm jest zdrowy. Aby było kompletne, musisz być w stanie udowodnić, że wszystkie odrzucone programy nie są równoważne z oryginałem. Jest to możliwe w modelach maszyn skończonych, o ile istnieje granica wielkości wejściowej.

Należy pamiętać, że gdy czas wykonania programu zależy od danych wejściowych, może nie być optymalnego rozwiązania. Jeśli szukasz np. Granicy najgorszego przypadku, bardzo szybko natrafisz na nierozstrzygalne ekwiwalenty podczas kwantyfikacji wszystkich możliwych niezwiązanych danych wejściowych i na nierozwiązywalne problemy, jeśli dane wejściowe są ograniczone.

Dziesięć lat temu Rajeev Joshi, Greg Nelson i Keith Randall „Denali: ukierunkowany na cel superoptimizer” potrafili znaleźć optymalne programy zawierające około 5 instrukcji maszynowych. Nie spojrzałem na nowsze wyniki.

Gilles „SO- przestań być zły”
źródło
5
Jeden z naszych studentów na University of Sussex zastosował superoptymalizację, aby skrócić długość niektórych podstawowych procedur Java (takich jak dodawanie). W tym celu spalił ogromne ilości obliczeń Amazon EC2. Jego rozprawa jest tutaj . Wyraźnie nie jest to wykonalne podejście do niczego, ale naprawdę krótkie programy.
Martin Berger,