No estilo funcional, o fluxo de valores através de um programa é muito, muito visível (para o compilador e o programador). Isso dá ao compilador muita margem de manobra para decidir onde armazenar valores, quanto tempo mantê-los por perto e assim por diante.
Em uma linguagem imperativa, o compilador promete ao programador um modelo em que a maioria das variáveis corresponde a locais reais na memória que permanecem por um tempo definido. Potencialmente, qualquer instrução pode ler (ou gravar em!) Qualquer um desses locais; portanto, o compilador pode substituir apenas os locais de memória pela alocação de registros, mesclar duas variáveis em um único local de armazenamento ou executar otimizações semelhantes depois de realizar uma análise cuidadosa de onde caso contrário, no programa essa variável pode ser referenciada.
Agora, existem duas advertências:
- A comunidade da linguagem de programação gastou (desperdiçou?) Muito esforço nos últimos cinquenta anos no desenvolvimento de maneiras inteligentes de fazer essa análise. Existem truques bem conhecidos, como coloração de registros e assim por diante, para que alguns dos casos mais fáceis sejam executados na maioria das vezes; mas isso cria compiladores grandes e lentos e uma troca constante da complexidade da compilação pela qualidade do código resultante
- Ao mesmo tempo, a maioria das linguagens de programação funcionais também não é puramente funcional; muitas das coisas que os programas realmente precisam fazer, como responder a E / S, são inerentemente não funcionais; portanto, nenhum compilador pode ficar completamente livre desses truques e nenhuma linguagem os evita completamente - até o Haskell, que é um pouco demais. puro para o meu gosto (Sua milhagem pode variar) pode apenas controlar e isolar as partes não funcionais do seu código, não evitá-las por completo.
Mas, para responder à pergunta geral, sim, um paradigma funcional oferece ao compilador muita liberdade para otimizar que ele não possui em um cenário imperativo.