Haskell / Clojure n'est-il pas réellement adapté aux systèmes dynamiques tels que la simulation de particules?

9

On m'a dit dans des questions précédentes que les langages de programmation fonctionnels ne conviennent pas aux systèmes dynamiques tels qu'un moteur physique, principalement parce qu'il est coûteux de muter des objets. Dans quelle mesure cette affirmation est-elle réaliste et pourquoi?

MaiaVictor
la source
4
Vous pouvez trouver github.com/linneman/particles-clj intéressant. 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 vous a dit qu'ils n'étaient pas adaptés? Lien pour répondre / commenter?
Andres F.
7
@Dokkat: Je suis sceptique quant au fait que le commentateur y connaisse beaucoup de choses sur la programmation fonctionnelle, pour être très honnête. Je le prendrais avec un gros grain de sel.
CA McCann
6
De plus, je ne tiendrais pas compte de la réponse qui commence par "Une approche fonctionnelle pure n'est pas un bon choix pour les jeux ..." à moins que l'auteur ne prouve qu'il a réellement essayé d'écrire un programme fonctionnel. Sinon, il ne fait que deviner ce qu'il pense que les problèmes peuvent être.
Andres F.
1
Le développement de jeux @Dokkat a des contraintes supplémentaires plutôt qu'un simple simulateur de particules et un moteur physique (qui peuvent s'intégrer assez bien dans la programmation fonctionnelle) - les performances d'exécution sont essentielles pour le développement de jeux (et plus importantes que la physique elle-même parfois). Le moteur physique d'une entreprise minière qui prédit les explosions demande plus de précision que de performances. Avec la programmation fonctionnelle, plus de performances peuvent être obtenues plus facilement en y jetant plus de matériel (ce que les moteurs de jeux ne peuvent pas faire).

Réponses:

10

Haskell et Clojure permettent une mutabilité réelle, donc ce n'est pas un problème pour commencer.

Au-delà de cela, si vos données "mutables" consistent en des valeurs intermédiaires mises à jour de manière incrémentielle dans le cadre d'un calcul plus important, vous n'aurez peut-être même pas besoin de mutabilité pour être efficace! Par exemple, des recherches sont en cours à Haskell concernant une technique appelée fusion de flux , où le compilateur fusionne les boucles de traitement, les producteurs de données et les consommateurs de données pour éliminer complètement les structures de données intermédiaires.

Le problème principal avec Haskell ici est la paresse - dans un programme de calcul de nombres où vous avez beaucoup de données d'entrée et beaucoup de données de sortie et tout cela est important, la paresse vous fait très peu de faveurs mais impose toujours des frais généraux. Cela ne veut pas dire que vous ne pouvez pas écrire des programmes comme celui-ci à Haskell (les gens le font en fait), mais cela ne joue pas sur les points forts du langage et vous devez avoir une meilleure compréhension du modèle d'évaluation pour obtenir les performances souhaitées.

Cela dit, la forte compression des nombres ne joue pas non plus sur les atouts de la JVM. Ce genre de programme explique pourquoi FORTRAN est toujours là.

CA McCann
la source
1
vaut la peine d'être noté: la prochaine version 8.0 de GHC supportera un mode d'évaluation strict par module.
Erik Kaplun
8

Je ne peux pas parler pour Clojure, mais je peux dire que Haskell a beaucoup de packages IO très hautement disponibles qui permettront toutes les mutations que vous pourriez souhaiter.

Voici une réponse à une question que j'ai écrite où quelqu'un détaille les 3 plus courantes et concerne leurs performances: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286

Vous pouvez également voir ici un graphique simple montrant les mesures de performances d'un serveur Web haskell appelé Warp, qui est une application très intensive en E / S.

Il y a beaucoup de confusion à ce sujet en ce qui concerne Haskell, la vérité est qu'il a de fantastiques installations d'E / S avec de nombreux packages sur le piratage pour utiliser les E / S de nombreuses façons différentes, dont beaucoup ont été hautement réglées. La raison pour laquelle les gens pensent que ce n'est pas le cas est que Haskell fait de grands efforts pour séparer les E / S de tout le reste, mais cela n'a aucun effet sur les caractéristiques de performance.

Maintenant, pour parler des caractéristiques de performance, la raison pour laquelle les gens la reconnaissent comme ayant de mauvaises performances est due à l'évaluation paresseuse qui la fait se comporter de manière pas toujours intuitive. C'est toutefois quelque chose dont vous devez vous préoccuper beaucoup moins lorsque vous commencez à travailler dans un contexte d'E / S à effectuer des mises à jour destructrices, comme dans un système auquel vous faites référence. De plus, les gens ont tendance à constater que lorsqu'ils ont des problèmes de performances, les installations intégrées pour instrumenter et identifier où les ressources vont aider beaucoup.

Une autre monade qui mérite d'être étudiée pour un système comme vous le décrivez serait la monade ST qui est spécifiquement destinée aux mises à jour destructrices effectuées par de très petits appels d'E / S, ce qui lui confère d'excellentes performances.

Désolé, je ne peux vraiment pas parler à Clojure, j'espère que quelqu'un d'autre peut donner des détails là-bas.

Jimmy Hoffa
la source