Ich habe irgendwo gelesen, dass die funktionale Programmierung geeignet ist, um die Vorteile des Multi-Core-Trends in der Computertechnik zu nutzen. Ich habe die Idee nicht wirklich verstanden. Hängt das mit dem Lambda-Kalkül und der von-Neumann-Architektur zusammen?
Antworten
Zu viele Anzeigen?Die funktionale Programmierung minimiert oder eliminiert Seiteneffekte und eignet sich daher besser für die verteilte Programmierung, d.h. für die Multicore-Verarbeitung.
Mit anderen Worten: Viele Teile des Puzzles können unabhängig voneinander auf verschiedenen Kernen gleichzeitig gelöst werden, ohne dass man sich Sorgen machen muss, dass ein Vorgang einen anderen so stark beeinflusst, wie es bei anderen Programmierstilen der Fall ist.
Eine der schwierigsten Aufgaben bei der Parallelverarbeitung ist das Sperren von Datenstrukturen, um eine Beschädigung zu verhindern. Wenn zwei Threads gleichzeitig eine Datenstruktur verändern, ohne dass diese perfekt gesperrt ist, kann dies zu ungültigen Daten oder sogar zu einem Deadlock führen.
Im Gegensatz dazu legen funktionale Programmiersprachen den Schwerpunkt auf unveränderliche Daten. Jeder Zustand wird von der Logik getrennt gehalten, und sobald eine Datenstruktur erstellt ist, kann sie nicht mehr geändert werden. Der Bedarf an Sperren ist stark reduziert.
Ein weiterer Vorteil ist, dass einige Prozesse, die sich sehr leicht parallelisieren lassen, wie z. B. Iteration, zu Funktionen abstrahiert werden. In C++ könnten Sie eine for-Schleife haben, die eine Datenverarbeitung über jedes Element in einer Liste durchführt. Aber der Compiler kann nicht wissen, ob diese Operationen sicher parallel ausgeführt werden können - vielleicht hängt das Ergebnis einer Operation von der vorhergehenden ab. Wenn eine Funktion wie map()
ou reduce()
verwendet wird, kann der Compiler wissen, dass keine Abhängigkeit zwischen den Aufrufen besteht. So können mehrere Elemente gleichzeitig verarbeitet werden.
Ich habe irgendwo gelesen, dass funktionale Programmierung geeignet ist, um die Vorteile des Multi-Core-Trends in der Informatik zu nutzen... Ich habe die Idee nicht wirklich verstanden. Hängt das mit dem Lambda-Kalkül und der von-Neumann-Architektur zusammen?
Das Argument hinter der von Ihnen zitierten Überzeugung ist, dass rein funktionale Programmierung Seiteneffekte kontrolliert, was die Einführung von Parallelität viel einfacher und sicherer macht, und dass daher rein funktionale Programmiersprachen im Kontext von Mehrkerncomputern von Vorteil sein sollten.
Leider ist dieser Glaube aus mehreren Gründen längst widerlegt worden:
-
Die absolute Leistung von rein funktionalen Datenstrukturen ist schlecht . Rein funktionale Programmierung ist also ein erster großer Schritt in die falsche Richtung, wenn es um Leistung geht (was der einzige Zweck der parallelen Programmierung ist).
-
Rein funktionale Datenstrukturen skalieren schlecht, weil sie die gemeinsam genutzten Ressourcen, einschließlich des Allokators/GC und der Hauptspeicherbandbreite, belasten. Parallelisierte, rein funktionale Programme erreichen daher mit zunehmender Anzahl von Kernen oft nur geringe Geschwindigkeitssteigerungen.
-
Rein funktionale Programmierung macht die Leistung unberechenbar. So sehen echte rein funktionale Programme oft Leistung Verschlechterung wenn sie parallelisiert werden, weil die Granularität effektiv zufällig ist.
Zum Beispiel, die bastardisierte zweizeilige Schnellsortierung die oft von der Haskell-Gemeinschaft zitiert wird, läuft typischerweise tausende Male langsamer als ein echtes In-Place-Quicksort, das in einer konventionelleren Sprache wie F# geschrieben wurde. Und obwohl man das elegante Haskell-Programm leicht parallelisieren kann, ist es unwahrscheinlich, dass man irgendeine Leistungsverbesserung sieht, weil all die unnötigen Kopiervorgänge dazu führen, dass ein einziger Kern die gesamte Hauptspeicherbandbreite eines Mehrkern-Rechners ausnutzt, was die Parallelität wertlos macht. Tatsächlich hat es noch niemand geschafft, eine generische parallele Sortierung in Haskell zu schreiben, die konkurrenzfähig leistungsfähig ist. Die von der Haskell-Standardbibliothek bereitgestellten modernen Sortierfunktionen sind in der Regel Hunderte Male langsamer als herkömmliche Alternativen.
Die gebräuchlichere Definition der funktionalen Programmierung als ein Stil, der die Verwendung von Funktionen erster Klasse betont, erweist sich jedoch im Kontext der Multicore-Programmierung als sehr nützlich, da dieses Paradigma ideal für das Factoring paralleler Programme ist. Siehe zum Beispiel die neue höhere Ordnung Parallel.For
Funktion aus der System.Threading.Tasks
Namespace in .NET 4.
Das Hauptargument ist, dass es schwierig ist, Sprachen wie C/C++/etc automatisch zu parallelisieren, weil Funktionen globale Variablen setzen können. Betrachten Sie zwei Funktionsaufrufe:
a = foo(b, c);
d = bar(e, f);
Obwohl foo und bar keine gemeinsamen Argumente haben und der eine nicht vom Rückgabewert des anderen abhängt, könnten sie dennoch Abhängigkeiten haben, weil foo eine globale Variable (oder einen anderen Nebeneffekt) setzen könnte, von der bar abhängt.
Funktionale Sprachen garantieren, dass foo und bar unabhängig voneinander sind: Es gibt keine Globals und keine Seiteneffekte. Daher können foo und bar sicher auf verschiedenen Kernen ausgeführt werden, und zwar automatisch, ohne dass der Programmierer eingreifen muss.
- See previous answers
- Weitere Antworten anzeigen