Ist Haskell / Clojure für dynamische Systeme wie die Partikelsimulation eigentlich ungeeignet?

9

In früheren Fragen wurde mir gesagt, dass funktionale Programmiersprachen für dynamische Systeme wie eine Physik-Engine nicht geeignet sind, hauptsächlich weil das Mutieren von Objekten teuer ist. Wie realistisch ist diese Aussage und warum?

MaiaVictor
quelle
4
Vielleicht finden Sie github.com/linneman/particles-clj interessant. 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
Wer hat dir gesagt, dass sie ungeeignet sind? Link zur Antwort / Kommentar?
Andres F.
7
@Dokkat: Ich bin skeptisch, dass der Kommentator dort viel über funktionale Programmierung weiß, um ganz ehrlich zu sein. Ich würde es mit einem großen Körnchen Salz nehmen.
CA McCann
6
Darüber hinaus würde ich auch die Antwort ignorieren, die mit "Ein reiner funktionaler Ansatz passt nicht gut zu Spielen ..." beginnt, es sei denn, der Autor beweist, dass er tatsächlich versucht hat, ein funktionales Programm zu schreiben. Ansonsten errät er nur, was seiner Meinung nach die Probleme sein könnten .
Andres F.
1
Die Entwicklung von @Dokkat-Spielen unterliegt zusätzlichen Einschränkungen und nicht nur einem Partikelsimulator und einer Physik-Engine (die sich recht gut in die funktionale Programmierung einfügen lassen). Die Laufzeitleistung ist der Schlüssel für die Spieleentwicklung (und manchmal wichtiger als die Physik selbst). Die Physik-Engine eines Bergbauunternehmens, das Explosionen vorhersagt, verlangt mehr Genauigkeit als Leistung. Mit funktionaler Programmierung kann mehr Leistung leichter erzielt werden, indem mehr Hardware darauf geworfen wird (etwas, was Game-Engines nicht können).

Antworten:

10

Sowohl Haskell als auch Clojure ermöglichen eine tatsächliche Veränderlichkeit, sodass dies zunächst kein Problem darstellt.

Wenn Ihre "veränderlichen" Daten aus Zwischenwerten bestehen, die im Rahmen einer größeren Berechnung schrittweise aktualisiert werden, müssen Sie möglicherweise nicht einmal veränderbar sein, um effizient zu sein! Beispielsweise wird in Haskell derzeit nach einer Technik namens Stream Fusion geforscht , bei der der Compiler Verarbeitungsschleifen, Datenproduzenten und Datenkonsumenten zusammenführt, um dazwischenliegende Datenstrukturen vollständig zu eliminieren.

Das Hauptproblem bei Haskell ist hier die Faulheit - in einem Programm zur Zahlenverarbeitung, in dem Sie viele Eingabedaten und viele Ausgabedaten haben und alles wichtig ist, tut Faulheit Ihnen nur sehr wenige Gefälligkeiten, verursacht aber dennoch einen gewissen Overhead. Das heißt nicht, dass Sie in Haskell keine derartigen Programme schreiben können (die Leute tun dies tatsächlich), aber es spielt nicht mit den Stärken der Sprache und Sie müssen das Bewertungsmodell besser verstehen, um die gewünschte Leistung zu erzielen.

Das heißt, starkes Zahlen-Crunching spielt auch nicht mit den Stärken der JVM. Für diese Art von Programm gibt es FORTRAN immer noch.

CA McCann
quelle
1
Bemerkenswert: Die kommende 8.0-Version von GHC unterstützt den strengen Evaluierungsmodus pro Modul.
Erik Kaplun
8

Ich kann nicht für Clojure sprechen, aber ich kann sagen, dass Haskell viele sehr gut abgestimmte E / A-Pakete zur Verfügung hat, die alle gewünschten Mutationen ermöglichen.

Hier ist eine Antwort auf eine Frage, die ich geschrieben habe, in der jemand die drei häufigsten und ihre Leistung beschreibt: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286

Sie können hier auch ein einfaches Diagramm sehen, das die Leistungsmetriken eines Haskell-Webservers namens Warp zeigt, einer sehr E / A-intensiven Anwendung.

In Bezug auf Haskell herrscht große Verwirrung. Die Wahrheit ist, dass es fantastische E / A-Funktionen mit vielen Hackage-Paketen für die Verwendung von E / A auf sehr unterschiedliche Arten gibt, von denen viele stark optimiert wurden. Der Grund, warum die Leute annehmen, dass dies nicht der Fall ist, ist, dass Haskell große Anstrengungen unternimmt, um E / A von allem anderen zu trennen, aber das hat keinen Einfluss auf die Leistungsmerkmale.

Um nun über Leistungsmerkmale zu sprechen, der Grund, warum die Leute erkennen, dass es eine schlechte Leistung hat, liegt in der verzögerten Bewertung, die dazu führt, dass es sich auf eine Weise verhält, die nicht immer intuitiv ist. Dies ist jedoch etwas, worüber Sie sich wesentlich weniger Sorgen machen müssen, wenn Sie in einem E / A-Kontext mit destruktiven Aktualisierungen beginnen, z. B. in einem System, auf das Sie sich beziehen. Weitere Personen stellen häufig fest, dass bei Leistungsproblemen die eingebauten Einrichtungen zur Instrumentierung und Identifizierung der Ressourcen sehr hilfreich sind.

Eine andere Monade, die es wert ist, nach einem System wie dem von Ihnen beschriebenen gesucht zu werden, ist die ST-Monade, die speziell für destruktive Aktualisierungen von sehr kleinen E / A-Aufrufen vorgesehen ist und eine hervorragende Leistung bietet.

Entschuldigung, ich kann wirklich nicht mit Clojure sprechen, hoffentlich kann jemand anderes dort Details angeben.

Jimmy Hoffa
quelle