Haskell / Clojure é realmente inadequado para sistemas dinâmicos, como simulação de partículas?

9

Já me disseram em perguntas anteriores que as linguagens de programação funcional não são adequadas para sistemas dinâmicos, como um mecanismo de física, principalmente porque é caro modificar objetos. Quão realista é essa afirmação e por quê?

MaiaVictor
fonte
4
Você pode achar github.com/linneman/particles-clj interessante. Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases
2
Quem disse que eles eram inadequados? Link para responder / comentar?
18713 Andres F.
7
@Dokkat: Estou cético quanto ao fato de o comentarista saber muito sobre programação funcional, para ser muito honesto. Eu aceitaria com um grande grão de sal.
CA McCann
6
Além disso, eu também desconsideraria a resposta que começa com "Uma abordagem funcional pura não é adequada para jogos ..." , a menos que o autor prove que ele realmente tentou escrever um programa funcional. Caso contrário, ele está apenas adivinhando quais podem ser os problemas .
Andres F.
11
O desenvolvimento de jogos do @Dokkat possui restrições adicionais, em vez de apenas um simulador de partículas e um mecanismo de física (que pode se encaixar bastante bem na programação funcional) - o desempenho em tempo de execução é essencial para o desenvolvimento de jogos (e mais importante do que a própria física às vezes). O mecanismo de física de uma empresa de mineração que prevê explosões exige mais precisão do que desempenho. Com a programação funcional, é possível obter mais desempenho com mais facilidade, jogando mais hardware (algo que os mecanismos de jogo não podem fazer).

Respostas:

10

Tanto Haskell quanto Clojure permitem mutabilidade real, portanto, isso não é um problema para começar.

Além disso, se seus dados "mutáveis" consistirem em valores intermediários sendo atualizados gradualmente como parte de algum cálculo maior, talvez você nem precise da mutabilidade para ser eficiente! Por exemplo, há pesquisas em andamento em Haskell sobre uma técnica chamada fusão de fluxo , em que o compilador funde loops de processamento, produtores de dados e consumidores de dados para eliminar completamente as estruturas intermediárias de dados.

O principal problema com Haskell aqui é a preguiça - em um programa de processamento de números em que você tem muitos dados de entrada e muitos dados de saída e tudo isso é importante, a preguiça oferece muito poucos benefícios, mas ainda impõe alguma sobrecarga. Isso não quer dizer que você não possa escrever programas como esse em Haskell (na verdade, as pessoas fazem), mas não está jogando com os pontos fortes da linguagem e você precisa entender melhor o modelo de avaliação para obter o desempenho desejado.

Dito isto, o processamento pesado de números também não contribui para os pontos fortes da JVM. Esse tipo de programa é o motivo pelo qual o FORTRAN ainda está por aí.

CA McCann
fonte
11
vale a pena notar: a próxima versão 8.0 do GHC oferecerá suporte ao rigoroso modo de avaliação por módulo.
Erik Kaplun #
8

Não posso falar por Clojure, mas posso dizer que o Haskell tem muitos pacotes de E / S altamente sintonizados disponíveis que permitirão toda a mutação que você desejar.

Aqui está uma resposta para uma pergunta que eu escrevi em que alguém detalha os três mais comuns e considera seu desempenho: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286

Você também pode ver aqui um gráfico simples que mostra as métricas de desempenho de um servidor da Web haskell chamado Warp, que é um aplicativo altamente intensivo de IO.

Há muita confusão sobre isso em relação ao Haskell, a verdade é que ele possui instalações fantásticas de E / S com muitos pacotes no hackage para usar o IO de várias maneiras diferentes, muitas das quais foram altamente ajustadas. A razão pela qual as pessoas presumem que esse não é o caso é porque Haskell se esforça bastante para separar a IO de todo o resto, mas isso não afeta as características de desempenho.

Agora, para falar sobre as características de desempenho, no entanto, a razão pela qual as pessoas o reconhecem como tendo um desempenho ruim deve-se à avaliação preguiçosa que faz com que ele se comporte de maneiras que nem sempre são intuitivas. No entanto, é algo com que você deve se preocupar consideravelmente menos quando começa a trabalhar em um contexto de E / S, fazendo atualizações destrutivas, como em um sistema ao qual você está se referindo. Outras pessoas tendem a achar que, quando estão tendo problemas de desempenho, as instalações integradas para instrumentar e identificar para onde os recursos estão indo ajudam muito.

Outra mônada que vale a pena procurar por um sistema como você descreve seria a mônada ST, que é especificamente para atualizações destrutivas feitas por chamadas de E / S muito pequenas, proporcionando excelente desempenho.

Desculpe, eu realmente não posso falar com Clojure, espero que alguém possa dar detalhes lá.

Jimmy Hoffa
fonte