Pergunta

Há toda o novo paradigma da "programação funcional", que precisa de uma mudança total de padrões de pensamento em relação à programação procedural. Ele usa funções de ordem superior, pureza, mônadas, etc., que nós não costumamos ver em linguagens imperativas e orientada a objetos.

A minha pergunta é como o aplicação de línguas difere do imperativo ou linguagens orientadas a objeto, com respeito a, por exemplo, gerenciamento de memória ou internos como ponteiros etc ..

Existem linguagens funcionais que são executados em cima da JVM. Isso significa que essas línguas internamente trabalho como as outras linguagens na JVM?

Foi útil?

Solução

As implementações de linguagens de programação funcional estiver usando uma ampla gama de técnicas de implementação. Uma excelente introdução para a implementação do esquema (um dialeto Lisp) dá a este livro: Lisp em pequenas partes por Christian Queinnec.

Outras dicas

Código resultante de linguagens funcionais utiliza muitos recursos que você vê em graus variados em línguas não-funcionais. A coleta de lixo passou para uso geral. otimização de chamada é feito no GCC e VC ++ .

Closures, no entanto, são uma característica da programação funcional. Você não vê um sem o outro. Se você definir "linguagens funcionais" para se referir apenas a linguagens funcionais puras, os dois não são sinônimos como você encontrar fechamentos em linguagens imperativas que suportam programação funcional (por exemplo, Javascript e Scheme (que é tecnicamente imperativo, embora o paradigma funcional é o que é na sua maioria usava)). Closures pode ser implementado com um spaghetti pilha para a pilha de chamadas, ou copiando a variáveis ??locais quando sair de um quadro de pilha, ou através da atribuição de variáveis ??locais na pilha e deixando lixo coleção cuidar deles.

Depois de ter encerramentos, funções anônimas são relativamente fáceis (com um intérprete, eles são realmente fácil). Com um compilador, a função é convertido em bytecode em tempo de compilação, eo bytecode (em vez disso, o endereço do ponto de entrada) está associado em tempo de execução com o ambiente atual.

Composição de funções pode confiar em função anônima. Quando um compilador encontra um f . g operador de composição de função, ele cria uma função anônima que chama os dois argumentos f e g, passando o resultado de um como o argumento para o outro.

Mônadas podem ser implementados em linguagens OO, eles são apenas não tão necessário quanto eles estão em linguagens funcionais puras. I / monads S não algo é muito especial, eles só contam com o fato de que ele subjacente plataforma permite efeitos colaterais.

Eu acho que há muitos aspectos que beneficiam de uma atenção especial em linguagens funcionais, um que vem à mente é:

As linguagens funcionais usar recursão muito. Assim, qualquer implementação deve tentar otimizar este caso. Por exemplo. identificar cauda-recursão e se transformar em um loop internamente (poupando assim despesas gerais chamada de função como pilha save / restore). ( http://en.wikipedia.org/wiki/Tail_recursion )

A implementação de uma linguagem de programação funcional como Haskell são frequentemente muito diferente do que as de linguagens imperativas. Você pode ler sobre uma maneira de fazê-lo aqui . Mesmo que o papel é de vários anos eu acredito que as idéias ainda são usados.

A maior diferença que vem à mente é que as linguagens funcionais tendem a ser concebidos de modo que o código fonte é desaçucarado para uma linguagem intermediária matematicamente simples e poderosa. Esta linguagem geralmente contém lambda, chamadas de função, if / else, tipos de máquinas, algo como let, e não muito mais. O código transformado está profundamente aninhados, detalhado, e não de forma realista legível. A sintaxe superfície é jogado fora.

Um compilador para uma linguagem como este tem que fazer alguma inlining e algumas otimizações de fechamento para produzir código decente. (Para mim, essas otimizações de fechamento da linha de base parecem não trivial - análise de fuga e assim por diante -, mas que poderia ser apenas falta de familiaridade.)

Tudo corre no mesmo processador (e, portanto, as mesmas instruções de montagem), por isso, enquanto você ir fundo o suficiente, tudo é o mesmo internamente.

@outis: Enquanto o idioma pode apoiá-los, fechamentos de conflito com o conceito matemático de uma função, da mesma forma que os efeitos colaterais fazer: eles permitem que você obter resultados diferentes dos mesmos argumentos. Isso faz fechamento processual, e não funcional.

Dito isto, há argumentos de eficiência que favorecem fechamento de mais de globals (especialmente no contexto da implementação do compilador). [Mas eu sei de linguagens funcionais que não fornecem fechamento diretamente, embora "alikes de trabalho" pode ser implementado.]

(No entanto, currying é semelhante ao encerramento e não sofre esse conflito, e é de fato rotineiramente presente em linguagens funcionais.)

De qualquer forma, na minha opinião, linguagens de programação funcionais são as línguas que fazem grandes esforços para tornar a computação seja representável como se fossem funções matemáticas. Isto significa que as otimizações são inclinadas a otimização funções.

Hipoteticamente, pelo menos, as linguagens funcionais permitir que a máquina trabalhar em abstrações mais profundos do que seriam úteis para uma abordagem puramente processual.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top