Die Schaltungsminimierung ist das Problem, um die Größe einer gegebenen Schaltung zu minimieren. Gibt es etwas Ähnliches für allgemeine Programme?
Insbesondere ist meine Frage -
Gibt es Algorithmen, um die Anzahl der Anweisungen für ein bestimmtes Programm zu minimieren? Ich weiß, dass es ein unentscheidbares Problem ist, aber ich suche keine Lösung, die etwas Optimales zurückgibt.
Während man bereits vorhandene Compiler-Transformationen anwenden kann, um dies zu erreichen, suche ich nach etwas, bei dem ich keine sehr engen Transformationen und Algorithmen definieren muss, um vorher nach ihnen zu suchen.
Bearbeiten: Die andere Frage, die ich habe, ist, ob man einen soliden und vollständigen Kalkül haben kann, der es uns ermöglicht, den gesamten Raum solcher semantisch äquivalenten Programme zu erkunden, oder ob dies nicht möglich ist.
Antworten:
Es gibt einen naiven Algorithmus für Programme mit Eingaben mit begrenzter Größe: Zählen Sie alle Programme in der Reihenfolge zunehmender Länge (oder Ausführungszeit, die eine begrenzte Funktion der Länge ist) auf. Wenn Sie nachweisen können, dass das Programm dem Original entspricht, stoppen Sie; Ansonsten suche weiter.
Dieser Algorithmus ist solide. Damit es vollständig ist, müssen Sie nachweisen können, dass alle abgelehnten Programme nicht dem Original entsprechen. Dies ist bei Endmaschinenmodellen möglich, sofern Sie eine Grenze für die Eingabegröße haben.
Beachten Sie, dass es möglicherweise keine optimale Lösung gibt, wenn die Programmausführungszeit von der Eingabe abhängt. Wenn Sie beispielsweise nach einer Worst-Case-Grenze suchen, werden Sie sehr schnell auf unentscheidbare Äquivalenzen stoßen, wenn Sie alle möglichen unbegrenzten Eingaben quantifizieren, und auf nicht auffindbare Probleme, wenn die Eingaben begrenzt sind.
Vor einem Jahrzehnt konnte „Denali: Ein zielgerichteter Superoptimierer“ von Rajeev Joshi, Greg Nelson und Keith Randall optimale Programme mit etwa 5 Maschinenanweisungen finden. Ich habe mir keine neueren Ergebnisse angesehen.
quelle