Eu estava lendo o livro "Programação Funcional para o Mundo Real". Tudo começou com a comparação entre linguagens de programação imperativas e funcionais. E afirmou como 'valores' e 'expressões' na programação funcional são diferentes de 'variáveis' e 'funções' da programação imperativa. A partir da discussão, desenvolvi uma ideia que -
As linguagens de programação funcional têm mais oportunidade de otimizar o tempo de compilação do que suas contrapartes imperativas.
É verdade?
fonte
O fato de haver, em princípio, mais possibilidades de otimização do tempo de compilação para linguagens funcionais do que para suas contrapartes imperativas é provavelmente verdade.
Mais interessante, porém, é se elas são realmente implementadas nos compiladores atuais e qual a relevância dessas otimizações na prática (ou seja, desempenho final do código idiomático da 'vida real (TM)') em um ambiente de produção, com configurações previsíveis a priori do compilador.
por exemplo, os envios de Haskell para o famoso jogo Computer Language Benchmarks (por pior que seja - mas não é como se houvesse - no momento - algo significativamente melhor por aí) dão a impressão de que uma quantidade significativa de tempo foi gasta em otimizações manuais, que confrontadas com a alegação de "possíveis otimizações do compilador devido a
insert some property about FP languages here
", fazem parecer que as otimizações são (atualmente pelo menos) mais uma possibilidade teórica do que uma realidade relevante.Eu ficaria feliz em estar errado neste ponto.
fonte
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:
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.
fonte
main
é uma função de transformação de estado, e não algo que usa o próprio estado.