In stile funzionale, il flusso di valori attraverso un programma è molto, molto visibile (sia per il compilatore che per il programmatore). Ciò conferisce al compilatore un ampio margine di manovra per decidere dove memorizzare i valori, quanto a lungo tenerli in giro e così via.
In un linguaggio imperativo, il compilatore promette al programmatore un modello in cui la maggior parte delle variabili corrispondono a posizioni reali nella memoria che restano intorno per una durata definita. Potenzialmente, qualsiasi affermazione può leggere da (o scrivere!) Qualsiasi di queste posizioni, quindi il compilatore può solo sostituire le posizioni di memoria con l'allocazione dei registri, unire due variabili in un'unica posizione di memoria, o eseguire ottimizzazioni simili dopo aver eseguito un'analisi accurata di dove altrimenti nel programma quella variabile può essere referenziata.
Ora ci sono due avvertimenti:
- La comunità del linguaggio di programmazione ha speso (sprecato?) un lotto di sforzi negli ultimi cinquant'anni sullo sviluppo di modi intelligenti per fare questa analisi. Ci sono trucchi ben noti come la colorazione dei registri e così via per ottenere alcuni dei casi più semplici fatti per la maggior parte del tempo; ma questo rende grandi, lenti compilatori e un compromesso costante di complessità di compilazione per la qualità del codice risultante
- Allo stesso tempo, la maggior parte dei linguaggi di programmazione funzionale non è puramente funzionale; molte delle cose che i programmi devono effettivamente fare, come rispondere agli I / O sono intrinsecamente non funzionali, quindi nessun compilatore può essere completamente libero da questi trucchi, e nessun linguaggio li evita del tutto - anche Haskell, che è un po '< em> too puro per i miei gusti (Your Mileage May Vary) può solo controllare e rimuovere le parti non funzionali del tuo codice, non evitarle del tutto.
Ma per rispondere alla domanda generale, sì, un paradigma funzionale dà al compilatore molta libertà di ottimizzare che non ha in un'impostazione imperativa.