L’ottimizzazione del programma è il processo di modifica di un programma per computer in modo che il programma venga eseguito più velocemente, consumi meno risorse o generalmente funzioni con un livello di efficienza più elevato. L’attività di ottimizzazione può essere eseguita automaticamente da alcuni compilatori di linguaggi di programmazione, intenzionalmente utilizzando un programma di ottimizzazione o manualmente da programmatori che esaminano il codice sorgente e tentano di apportare miglioramenti specifici. In generale, l’ottimizzazione del programma viene eseguita con un fine specifico in mente, perché ci sono pochissime ottimizzazioni generali che possono essere fatte a un programma che non riducono in qualche modo lo stato ottimizzato di un’altra parte del programma, il che significa che un programma di solito può essere ottimizzato per la velocità o l’utilizzo delle risorse, ma di solito non entrambi. Una complicazione che può verificarsi con alcuni tipi di ottimizzazione è che molti linguaggi di programmazione di alto livello forniscono un livello così elevato di astrazione tra il codice nativo e il linguaggio del computer che l’ottimizzazione può essere difficile o impossibile da implementare su tutte le piattaforme in tutte le situazioni, specialmente con linguaggi interpretati che utilizzano la compilazione just-in-time (JIT).
Un concetto importante nell’ottimizzazione del programma è l’idea che un’ottimizzazione di solito ha un qualche tipo di prezzo. Un esempio di ciò è che, quando una parte di codice è ottimizzata per essere eseguita più rapidamente, l’aumento della velocità potrebbe avere un prezzo in termini di leggibilità del codice, utilizzo della memoria, flessibilità del programma o una serie di altri costi. Ciò significa che l’ottimizzazione del programma deve essere un processo mirato, con l’intenzione di far funzionare meglio un aspetto di un programma pur essendo disposti a sacrificare l’efficienza di altri aspetti.
Diversi tipi di ottimizzazione del programma possono essere eseguiti in diverse fasi dello sviluppo del programma. Durante la progettazione, è possibile eseguire un’ampia ottimizzazione assicurando che un programma sembri funzionare in modo efficace. Quando si lavora con il codice sorgente effettivo, le ottimizzazioni possono includere la garanzia che non vi siano comandi estranei, chiamate ripetitive o funzioni scritte male. Al momento della compilazione, molte ottimizzazioni vengono eseguite automaticamente dal compilatore e possono essere guidate dal programmatore attraverso l’uso di diverse opzioni o direttive del compilatore.
Le ottimizzazioni automatiche, come possono verificarsi con un compilatore o un programma di ottimizzazione dedicato, spesso possono comportare trucchi troppo complessi per essere pratici per i programmatori umani. Ciò può comportare lo spostamento di istruzioni in un programma in modo che vengano eseguite fuori dall’ordine originariamente scritto ma in un modo più efficiente per il processore. Può anche comportare lo spostamento intenzionale di risorse come i blocchi di memoria in modo che sia possibile accedervi più velocemente. La maggior parte dell’ottimizzazione del programma avviene automaticamente a livello di compilatore.
Una complicazione con l’ottimizzazione del programma ripetuta o aggressiva è che, una volta che un programma è stato modificato per funzionare in modo più efficiente, diventa generalmente più difficile modificarlo per altri scopi, come l’aggiunta di funzionalità o la correzione di bug. Ciò può verificarsi quando le ottimizzazioni iniziano a bloccare comportamenti del programma impostati che non possono essere facilmente modificati o adattati al nuovo codice senza richiedere l’annullamento di tutte le ottimizzazioni. Un problema più grande è che, in molti casi, un programma ottimizzato diventa meno leggibile dall’uomo, perché vengono utilizzati trucchi e scorciatoie invece dei soli comandi concisi e strutture di controllo classiche. Per questi motivi, spesso esiste un livello di ottimizzazione del programma al quale è accettabile fermarsi, anche se modifiche drastiche al codice potrebbero far funzionare un programma in modo leggermente più efficiente.