¿Haskell / Clojure es realmente inadecuado para sistemas dinámicos como la simulación de partículas?

9

Me han dicho en preguntas anteriores que los lenguajes de programación funcional no son adecuados para sistemas dinámicos como un motor de física, principalmente porque es costoso mutar objetos. ¿Cuán realista es esta afirmación y por qué?

MaiaVictor
fuente
44
Puede encontrar interesante github.com/linneman/particles-clj . 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
¿Quién te dijo que no eran adecuados? Enlace para responder / comentar?
Andres F.
77
@Dokkat: Soy escéptico de que el comentarista allí sepa mucho sobre programación funcional, para ser honesto. Lo tomaría con un gran grano de sal.
CA McCann
66
Además, también ignoraría la respuesta que comienza con "Un enfoque funcional puro no es una buena opción para los juegos ..." a menos que el autor pruebe que realmente ha intentado escribir un programa funcional. De lo contrario, solo está adivinando cuáles cree que pueden ser los problemas .
Andres F.
1
El desarrollo del juego @Dokkat tiene restricciones adicionales en lugar de solo un simulador de partículas y un motor de física (que puede encajar bastante bien en la programación funcional): el rendimiento del tiempo de ejecución es clave para el desarrollo del juego (y más importante que la física en ocasiones). El motor de física de una empresa minera que predice explosiones requiere más precisión que rendimiento. Con la programación funcional, se puede obtener más rendimiento más fácilmente lanzando más hardware (algo que los motores de juego no pueden hacer).

Respuestas:

10

Tanto Haskell como Clojure permiten la mutabilidad real, por lo que no es un problema para empezar.

Más allá de eso, si sus datos "mutables" consisten en valores intermedios que se actualizan de manera incremental como parte de un cálculo mayor, ¡es posible que ni siquiera necesite mutabilidad para ser eficiente! Por ejemplo, hay una investigación en curso en Haskell con respecto a una técnica llamada fusión de flujo , donde el compilador fusiona bucles de procesamiento, productores de datos y consumidores de datos para eliminar por completo las estructuras de datos intermedias.

El problema principal con Haskell aquí es la pereza: en un programa de cálculo de números en el que tiene muchos datos de entrada y muchos datos de salida y todo es importante, la pereza le hace muy pocos favores pero aún impone algunos gastos generales. Eso no quiere decir que no pueda escribir programas como ese en Haskell (de hecho, las personas lo hacen), pero no está jugando con las fortalezas del lenguaje y necesita comprender mejor el modelo de evaluación para obtener el rendimiento que desea.

Dicho esto, la gran cantidad de números tampoco juega con las fortalezas de la JVM. Ese tipo de programa es la razón por la que FORTRAN todavía existe.

CA McCann
fuente
1
Vale la pena señalar: la próxima versión 8.0 de GHC admitirá un modo de evaluación estricto por módulo.
Erik Kaplun
8

No puedo hablar por Clojure, pero puedo decir que Haskell tiene muchos paquetes de E / S muy ajustados disponibles que permitirán toda la mutación que pueda desear.

Aquí hay una respuesta a una pregunta que escribí donde alguien detalla los 3 más comunes y considera su desempeño: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286

También puede ver aquí un gráfico simple que muestra las métricas de rendimiento de un servidor web haskell llamado Warp, que es una aplicación altamente intensiva en E / S.

Hay mucha confusión sobre esto con respecto a Haskell, la verdad es que tiene fantásticas instalaciones de E / S con muchos paquetes de piratería para usar IO de muchas maneras diferentes, muchas de las cuales han sido muy optimizadas. La razón por la que la gente presume que este no es el caso es porque Haskell hace todo lo posible para separar la E / S de todo lo demás, pero eso no tiene ningún efecto en las características de rendimiento.

Ahora, para hablar sobre las características de rendimiento, sin embargo, la razón por la cual las personas reconocen que tiene un rendimiento bajo se debe a que la evaluación perezosa hace que se comporte de maneras que no siempre son intuitivas. Sin embargo, esto es algo de lo que debe preocuparse mucho menos cuando comienza a trabajar en un contexto de E / S que realiza actualizaciones destructivas, como en un sistema al que se refiere. Además, las personas tienden a descubrir que cuando tienen problemas de rendimiento, las instalaciones integradas para instrumentar e identificar hacia dónde van los recursos ayudan mucho.

Otra mónada que vale la pena buscar para un sistema como el que usted describe sería la mónada ST, que es específicamente para actualizaciones destructivas realizadas por llamadas IO muy pequeñas que le brindan un gran rendimiento.

Lo siento, realmente no puedo hablar con Clojure, espero que alguien más pueda dar detalles allí.

Jimmy Hoffa
fuente