Riduzione al minimo del programma


10

La minimizzazione dei circuiti è il problema per ridurre al minimo le dimensioni di un determinato circuito. C'è qualcosa di simile per i programmi generali?

In particolare la mia domanda è:

Esistono algoritmi per ridurre al minimo il numero di istruzioni per un determinato programma. So che è un problema indecidibile, ma non sto cercando una soluzione che restituisca qualcosa di ottimale.

Mentre uno può applicare trasformazioni di compilatore preesistenti per raggiungere questo obiettivo, sto cercando qualcosa in cui non devo definire una serie di trasformazioni e algoritmi molto stretti per cercarli in anticipo.

Modifica: L'altra domanda che ho è se si può avere un calcolo che sia solido e completo che ci consenta di esplorare l'intero spazio di tali programmi semanticamente equivalenti o è impossibile.


2
La risposta alla tua altra domanda dipende dalla tua definizione di "un calcolo". Il fatto che HALT non sia in CORE rende la risposta "no" per la maggior parte di tali definizioni.

fn

Risposte:


10

Esiste un algoritmo ingenuo per i programmi con input di dimensioni limitate: enumera tutti i programmi in ordine crescente di lunghezza (o tempo di esecuzione, che è una funzione limitata della lunghezza). Se puoi provare che il programma è equivalente all'originale, fermati; altrimenti continua a cercare.

Questo algoritmo è valido. Affinché sia ​​completo, devi essere in grado di provare che tutti i programmi respinti non sono equivalenti all'originale. Ciò è possibile nei modelli di macchine finite, purché si abbia un limite per le dimensioni di input.

Si noti che quando il tempo di esecuzione del programma dipende dall'input, potrebbe non esserci una soluzione ottimale. Se cerchi, ad esempio, un limite nel caso peggiore, ti imbatterai molto rapidamente in equivalenze indecidibili quando quantificerai su tutti i possibili ingressi non limitati e in problemi irrintracciabili se gli ingressi sono limitati.

Un decennio fa, "Denali: un supereroptimizer diretto da obiettivi" di Rajeev Joshi, Greg Nelson e Keith Randall è stato in grado di trovare programmi ottimali di circa 5 istruzioni della macchina. Non ho visto risultati più recenti.


5
Uno dei nostri studenti qui all'Università del Sussex ha usato la superottimizzazione per abbreviare la lunghezza di alcune routine di base di Java (come l'aggiunta). Per fare questo ha bruciato enormi quantità di calcolo Amazon EC2. La sua tesi di laurea è qui . Chiaramente non è un approccio fattibile per tutto tranne che per programmi davvero brevi.
Martin Berger,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.