Funktionale Programmierung auf dem Vormarsch?

42

In letzter Zeit ist mir aufgefallen, dass funktionale Programmiersprachen immer beliebter werden . Ich habe kürzlich gesehen, dass der Tiobe-Index im Vergleich zum letzten Jahr immer beliebter geworden ist, obwohl die meisten von ihnen nach diesem Index nicht einmal die 50 beliebtesten Sprachen erreichen.

Und das ist schon lange so. Funktionale Programmierung ist einfach nicht so populär geworden wie andere Modelle (dh objektorientierte Programmierung).

Ich habe jedoch ein wiedergeborenes Interesse an der Leistungsfähigkeit der funktionalen Programmierung gesehen, und jetzt, da Multicores immer beliebter werden, zeigen Entwickler Interesse an anderen Modellen der Parallelität, die bereits in der Vergangenheit von Sprachen wie Haskell und Erlang untersucht wurden.

Ich sehe mit großem Interesse, dass trotz der mangelnden Akzeptanz in der Gemeinschaft immer mehr Sprachen dieser Art auftauchen. Clojure (2007), Scala (2003), F # (2002) sind nur drei Beispiele des letzten Jahrzehnts.

Ich selbst habe einige Zeit investiert, um Haskell und Scala zu lernen. Und ich finde großes Potenzial in dem Paradigma, das für mich neu war, obwohl ich so lange da draußen war.

Und natürlich ist meine größte Frage, ob einige von ihnen populär genug werden, um sich überhaupt darum zu bemühen, aber diese Frage könnte nicht einmal Mandrake beantworten, trotz all der Aufregung, die die Leute über sie machen.

Was ich fragen möchte ist:

  • In welchen Szenarien sollte ich eine funktionierende Programmiersprache als besser geeignet für eine bestimmte Aufgabe betrachten? Neben dem in letzter Zeit beliebten Multicore-Problem der Parallelprogrammierung.
  • Wenn ich mich für eine funktionierende Programmiersprache entscheiden würde, welche wären für Sie die größten Tücken, denen ich begegnen würde? (Neben dem Paradigmenwechsel und der Schwierigkeit, die Leistung aufgrund fauler Bewertung zu bewerten).
  • Wie würden Sie bei so vielen funktionalen Programmiersprachen die auswählen, die Ihren Anforderungen am besten entspricht?

Empfehlungen für die weitere Forschung werden mehr als willkommen sein.

Ich habe im Internet nach Meinungen gesucht, und es scheint, dass all diese erneute Beliebtheit auf die Idee zurückzuführen ist, dass wir jetzt die Mauer von Moores Gesetz sprengen und funktionierende Programmiersprachen kommen und uns heldenhaft retten werden. Aber wenn dies der Fall ist, würde ich sagen, dass es mehr Wahrscheinlichkeiten für die Anpassung bestehender populärer Sprachen an das Paradigma gibt.

Einige von Ihnen, die jeden Tag mehr Erfahrung mit diesen Sprachen haben, können mehr Einblicke in das Thema gewähren. Alle Ihre Meinungen werden besser gewürdigt und sorgfältig abgewogen.

Danke im Voraus!

edalorzo
quelle
4
Es ist Erlang, nicht Earlang (ich hätte Ihren Beitrag bearbeitet, aber das System erlaubt keine 1-Buchstaben-Bearbeitung).
quant_dev
6
Es ist zu erwähnen, dass es keine feste Grenze zwischen funktionalen und imperativen Sprachen gibt. ML-Familiensprachen sind nicht nebenwirkungsfrei und unterstützen zwingende Aussagen und Strukturen sowie veränderbare Variablen. Einige zwingende Sprachen - Python und Javascript - haben bedeutende Merkmale, die der funktionalen Programmierung entnommen sind. Persönlich hoffe ich, mehr funktionale Ideen im Mainstream zu sehen - insbesondere Pattern Matching.
Steve314
1
Ein paar gemeinsame Merkmale von funktionalen Sprachen machen eine Sprache nicht unbedingt "funktional". Bei der funktionalen Programmierung geht es sowohl um das Denken und Entwerfen von Programmen als auch um bestimmte Sprachmerkmale.
Mipadi
2
@mipadi - und deshalb können Sie die Funktionsphilosophie in jeder Sprache anwenden, soweit die verfügbaren Tools dies zulassen. Sie können Code im funktionalen Stil in Python schreiben (in Grenzen), und insofern ist Python eine funktionale Sprache. Und Sie können Code im imperativen Stil in ML schreiben, und insofern ist ML eine imperative Sprache. Dies ist nicht ganz das Gleiche wie die "schlechten Programmierer können Fortran in jeder Sprache schreiben", obwohl dies offensichtlich eine einfache Falle ist, in die man geraten kann, wenn man meinen Standpunkt falsch interpretiert.
Steve314
1
@mipadi - aber wenn die imperative Sprache alle normalen funktionalen Konstrukte hätte, könnte man alles damit machen, was man in einer funktionalen Sprache könnte - die Lücke wäre geschlossen und die Frage wäre "Was ist der beste Weg, dies zu tun" anstatt msgstr "Was ist der funktionale / zwingende Weg?" Die ML-Familie hat diese Lücke bereits geschlossen, aber da sie als funktional bezeichnet wird, betrachten wir ihren Stil eher als funktionalen Stil als einfach guten Stil.
Steve314

Antworten:

24

In welchen Szenarien sollte ich eine funktionierende Programmiersprache in Betracht ziehen, die für eine bestimmte Aufgabe besser geeignet ist? Neben dem in letzter Zeit beliebten Multicore-Problem der Parallelprogrammierung.

Alles, was das Erstellen einer Sequenz abgeleiteter Datenelemente mit einer Reihe von Transformationsschritten umfasst.

Im Wesentlichen das "Tabellenkalkulationsproblem". Sie haben einige Anfangsdaten und eine Reihe von zeilenweisen Berechnungen, die Sie auf diese Daten anwenden können.

Unsere Produktionsanwendungen enthalten eine Reihe statistischer Zusammenfassungen von Daten. dies wird am besten funktional angegangen.

Wir führen häufig drei monströse Datensätze zusammen. Ähnlich wie ein SQL-Join, jedoch nicht so verallgemeinert. Daran schließt sich eine Reihe von Berechnungen abgeleiteter Daten an. Dies ist alles nur funktionale Transformationen.

Die Anwendung ist in Python geschrieben, wird jedoch in einem funktionalen Stil unter Verwendung von Generatorfunktionen und unveränderlichen benannten Tupeln geschrieben. Es ist eine Komposition von Funktionen auf niedrigerer Ebene.

Hier ist ein konkretes Beispiel für eine funktionale Zusammensetzung.

for line in ( l.split(":") for l in ( l.strip() for l in someFile ) ):
    print line[0], line[3]

Auf diese Weise beeinflusst die funktionale Programmierung Sprachen wie Python.

Manchmal wird so etwas geschrieben:

cleaned = ( l.strip() for l in someFile )
split = ( l.split(":") for l in cleaned )
for line in split:
     print line[0], line[3]

Wenn ich mich für die Umstellung auf eine funktionierende Programmiersprache entschieden habe, welche sind für Sie die größten Gefahren, denen ich mich gegenübersehen werde? (Neben dem Paradigmenwechsel und der Schwierigkeit, die Leistung aufgrund fauler Bewertung zu bewerten).

Unveränderliche Gegenstände sind die härteste Hürde.

Oft werden Sie Werte berechnen, die neue Objekte erstellen, anstatt vorhandene Objekte zu aktualisieren. Die Vorstellung, dass es sich um ein veränderliches Attribut eines Objekts handelt, ist eine schwierige mentale Angewohnheit, sich davon zu lösen.

Eine abgeleitete Eigenschaft oder Methodenfunktion ist ein besserer Ansatz. Stateful Objekte sind eine schwierige Angewohnheit zu brechen.

Wie würden Sie bei so vielen funktionalen Programmiersprachen die auswählen, die Ihren Anforderungen am besten entspricht?

Es ist zunächst egal. Wähle eine Sprache zum Lernen. Sobald Sie etwas wissen, sind Sie in der Lage, ein anderes auszuwählen, das Ihren Bedürfnissen besser entspricht.

Ich habe Haskell gelesen, um zu verstehen, was Python fehlt.

S.Lott
quelle
5
@edalorzo: Python ist nicht schwach getippt. Es ist sehr, sehr stark getippt. Es gibt keinen Besetzungsoperator, daher ist er stärker typisiert als Java oder C ++.
S.Lott
5
@ S.Lott - Hilft die statische Typprüfung nicht bei IDE-Refactoring-Tools und intellisense-artigen Inhalten? Wenn Sie eine Hintergrundkompilierung durchführen und Typen statisch überprüfen, können Sie dann nicht mehr in Ihren Tools automatisieren? Ich bin damit einverstanden, dass wenn Sie in Ihren Tests eine 100% ige Codeabdeckung haben, diese erfasst wird. Sie müssen sich darüber im Klaren sein, dass wahrscheinlich weniger als 50% des Produktionscodes im Unternehmen tatsächlich eine Einheitentestabdeckung aufweisen, oder? :) Es gibt eine reale Welt da draußen, in der wir leben müssen.
Scott Whitlock
8
@ S.Lott "Die statische Typprüfung ist nicht sehr hilfreich. Es spielt keine Rolle, ob eine statische Prüfung durch einen Compiler oder eine Laufzeitprüfung durchgeführt wird. Sie schreiben immer noch die gleiche Menge Code und die gleiche Anzahl von Komponententests. " Äh, nein. Der springende Punkt bei der statischen Typprüfung ist, dass Fehler aufgefangen werden, wodurch der erforderliche Testaufwand massiv reduziert wird.
Jon Harrop
3
@ S.Lott "Python ist nicht schwach geschrieben. Es ist sehr, sehr stark geschrieben." Python wandelt implizit zwischen numerischen Typen um, die schwach typisiert sind.
Jon Harrop
3
@ Steve314 "Immerhin werden bei der statischen Typprüfung einige Fehler abgefangen, die einigen Grundregeln entsprechen. Unit-Tests können im Prinzip alle diese Fehler und viele weitere abfangen." Die statische Überprüfung beweist die Richtigkeit eines Aspekts eines Programms. Unit-Tests versuchen, die Korrektheit zu widerlegen, beweisen aber nicht die Korrektheit von irgendetwas. Unit Testing ist kein Ersatz für statische Typprüfungen oder andere Nachweise.
Jon Harrop
23

"Funktional" ist eine Reihe verschiedener Funktionen, von denen jede für sich nützlich ist. Ich finde es sinnvoller, sie einzeln zu betrachten.

Unveränderlichkeit

Jetzt, da ich damit vertraut bin, versuche ich immer, ein unveränderliches Ergebnis zu erzielen, auch in einem objektorientierten Programm. Es ist einfacher, über das Programm nachzudenken, wenn Sie Daten vom Typ Wert haben. Normalerweise benötigen Sie Anpassungsfähigkeit für Dinge wie GUIs und Leistungsengpässe. Meine Entitäten (mit NHibernate) sind auch veränderbar (was sinnvoll ist, weil sie Daten modellieren, die in einer Datenbank gespeichert sind).

Funktioniert als erstklassige Typen

Wie auch immer Sie es nennen möchten: Das Weitergeben von Delegierten, Aktionen oder Funktionen ist ein sehr praktischer Weg, um eine ganze Klasse von Problemen der realen Welt zu lösen, wie z. B. das "Loch im mittleren Muster". Ich habe auch festgestellt, dass das Übergeben eines Delegaten, einer Aktion oder einer Funktion an ein Objekt sauberer ist, als wenn diese Klasse ein Ereignis deklariert und dieses Ereignis verknüpft (vorausgesetzt, es gibt normalerweise nur einen "Listener"). Wenn Sie wissen, dass es einen Listener gibt, kann die Rückrufaktion als Konstruktorparameter übergeben werden (und in einem unveränderlichen Member gespeichert werden!)

In der Lage zu sein, Funktionen zu komponieren (zum Beispiel Action<T>nur eine zu werden, Actionist in manchen Szenarien auch sehr nützlich.

Wir sollten hier auch die Lambda-Syntax beachten, da Sie die Lambda-Syntax nur erhalten, wenn Sie Funktionen zu erstklassigen Typen hochstufen. Lambda-Syntax kann sehr ausdrucksstark und prägnant sein.

Monaden

Zugegeben, dies ist meine Schwachstelle, aber ich verstehe, dass Computerworkflows in F #, wie z. B. der asyncWorkflow, eine Monade sind. Dies ist ein subtiles, aber sehr mächtiges Konstrukt. Es ist so leistungsfähig wie das yieldSchlüsselwort, mit dem IEnumerableKlassen in C # erstellt werden. Im Grunde baut es eine Zustandsmaschine für Sie unter der Decke, aber Ihre Logik sieht linear aus.

Lazy Evaluation & Rekursion

Ich habe diese zusammengestellt, weil sie zwar immer als Merkmale der funktionalen Programmierung zusammengefasst sind, aber so schnell in ansonsten unerlässliche Sprachen übergegangen sind, dass es schwierig ist, sie als funktional zu bezeichnen.

S-Ausdrücke

Ich bin mir nicht sicher, wo ich das ablegen soll, aber die Möglichkeit, den nicht kompilierten Code als Objekt zu behandeln (und ihn zu untersuchen / zu ändern), wie z. B. Lisp S-Expressions oder LINQ Expressions, ist in gewisser Weise das mächtigste Werkzeug der funktionalen Programmierung. Die meisten neuen "fließenden" .NET-Schnittstellen und DSLs verwenden eine Kombination aus Lambda-Syntax und LINQ-Ausdrücken, um einige sehr übersichtliche APIs zu erstellen. Ganz zu schweigen von Linq2Sql / Linq2Nhibernate, wo Ihr C # -Code "magisch" als SQL anstelle von C # -Code ausgeführt wird.

Das war die lange Antwort auf den ersten Teil Ihrer Frage ... jetzt ...

Wenn ich mich für die Umstellung auf eine funktionierende Programmiersprache entschieden habe, welche sind für Sie die größten Gefahren, denen ich mich gegenübersehen werde? (Neben dem Paradigmenwechsel und der Schwierigkeit, die Leistung aufgrund fauler Bewertung zu bewerten).

Die größte Gefahr für mich bestand darin, die Grenze zwischen funktionalen und imperativen Lösungen zu finden. Nachdem Sie jedoch beide Ansätze ein paar Mal ausprobiert haben, erhalten Sie ein Gefühl, das besser funktioniert.

Wie würden Sie bei so vielen funktionalen Programmiersprachen die auswählen, die Ihren Anforderungen am besten entspricht?

Wenn Sie mit .NET vertraut sind, empfehle ich dringend F #. Wenn Sie jedoch mit der JVM vertraut sind, gibt es immer Clojure . Wenn Sie mehr akademisch als praktisch sind, würde ich mich für Common Lisp oder Scheme entscheiden. Wenn Sie Python bereits kennen, gibt es meines Erachtens bereits viele funktionale Konstrukte.

Scott Whitlock
quelle
@Scott Danke für deine ausführliche Erklärung. Ich denke, was Sie als die größte Falle bezeichnen, würde durch die Verwendung einer reinen funktionalen Programmiersprache wie Haskell aus der Gleichung genommen werden. Deshalb habe ich damit angefangen, weil ich mein ganzes Leben lang ein unverzichtbarer Programmierer war und ich nicht mit einer unreinen Programmiersprache spielen möchte und das Risiko habe, nicht auf die richtige Weise zu lernen. Wenn es Ihnen nichts ausmacht, dass ich eine andere Frage stelle: Zwei Dinge, die mich beunruhigen, sind Werkzeuge und Bibliotheken. Wie gut ist die Integration von F # in andere .Net-Tools und -Bibliotheken?
Edalorzo
Ich verstehe nicht, warum Sie Code zur Laufzeit pauschalieren und Code zur Laufzeit generieren und mit funktionaler Programmierung überprüfen. Die beiden haben keine Beziehung zueinander. Die von Ihnen beschriebenen Metaprogrammierungsfunktionen können nahezu jeder Sprache hinzugefügt werden, ob funktional oder nicht. Ich denke, lisp hat den Code als Datentrend gestartet, aber er ist jetzt in Ruby und anderen nicht funktionalen Sprachen verfügbar.
Davidk01
1
Die Integration von @edalorzo - F # in .NET ist sehr gut, mit nur einer kleinen Ausnahme: Kein GUI - Designer. Sie können dies umgehen, indem Sie Ihre GUI in einer C # -Baugruppe entwerfen und von F # aus darauf verweisen oder die GUI in F # nur in Code generieren (nicht mit einem Designer).
Scott Whitlock
@ davidk01 - gute frage zur meta-programmierung. Ich finde nur, dass Lambda-Syntax und Meta-Programmierung sich gegenseitig ausbauen, aber Sie haben Recht, sie könnten getrennt werden. Es scheint nur so, als würden Sie eher Metaprogramme mit einer funktionalen Sprache erhalten.
Scott Whitlock
1
@Scott: Ich denke, es ist in vielerlei Hinsicht einfacher - zum Beispiel, wenn Sie sich keine Gedanken über Nebenwirkungen machen müssen, können Sie einen Codeabschnitt im laufenden Betrieb viel sicherer ändern - es schränkt das ein, was Sie ändern müssen.
Michael K
15

Und das ist schon lange so. Funktionale Programmierung ist einfach nicht so populär geworden wie andere Modelle (dh objektorientierte Programmierung).

Dies trifft zu, wenn Sie Programme zählen, die von professionellen Programmierern entwickelt wurden (oder zumindest von Personen, die sich selbst als solche sehen). Wenn Sie Ihr Netz um Programme erweitern, die von Leuten entwickelt wurden, die sich selbst nicht als solche betrachten, kommt FP (oder zumindest das Programmieren in einem funktionalen Stil) OO ziemlich nahe (Excel, Mathematica, Matlab, R ... sogar "modernes" JavaScript) ).

In welchen Szenarien sollte ich eine funktionierende Programmiersprache in Betracht ziehen, die für eine bestimmte Aufgabe besser geeignet ist? Neben dem in letzter Zeit beliebten Multicore-Problem der Parallelprogrammierung.

Meine persönliche Meinung ist, dass Multicore nicht das Killer-Feature von FP ist (zumindest bis Haskell, Scala, Clojure, F # -Compiler das Problem mit der Cache-Lokalität lösen). Das Killer - Feature ist map, filter, foldund Freunde , die einem prägnanten Ausdruck einer großen Gruppe von Algorithmen ermöglichen. Hinzu kommen FP-Sprachen mit einer präziseren Syntax als die meisten gängigen OO-Sprachen.

Da FP näher am relationalen Modell ist, verringert sich auch die Impedanzfehlanpassung mit RDBMS ... was - zumindest für Nicht-Programmierer - sehr schön ist.

Auch wenn es besonders schwierig ist, die Anforderungen an die Korrektheit zu erfüllen - in einer Form, die schwer zu testen ist (üblich beim wissenschaftlichen Rechnen / bei der Analyse großer Datenmengen, bei denen das Ziel darin besteht, zuvor unbekannte und als solche nicht spezifizierbare Ergebnisse zu erzielen), die FP bieten kann vorteile.

Wenn ich mich für die Umstellung auf eine funktionierende Programmiersprache entschieden habe, welche sind für Sie die größten Gefahren, denen ich mich gegenübersehen werde?

  • Mangel an Werkzeugunterstützung (F # und einige Lisps sind die Ausnahme, Scala ist auf dem Weg)
  • Es ist schwieriger, das letzte Stück Leistung aus Ihrer Hardware herauszuholen
  • Communities konzentrieren sich häufig auf andere Themen als diese, mit denen eine große Gruppe kommerzieller Softwareentwicklungsprojekte konfrontiert ist
  • Sehr wenige Entwickler haben Erfahrung in der Verwendung von FP in einem industriellen Umfeld. Wenn Sie diese finden, müssen Sie wahrscheinlich mit dem Gehalt und den Vorteilen der Finanzbranche konkurrieren
  • Der funktionale Programmierstil ist in der Regel schwieriger zu debuggen. dh zwischendurch zu beobachten führt zu einer langen Kette zusammengesetzter Funktionen ist in den meisten (allen?) Debuggern normalerweise nicht möglich

Wie würden Sie bei so vielen funktionalen Programmiersprachen die auswählen, die Ihren Anforderungen am besten entspricht?

  • Wie viele Ihrer Probleme können gelöst werden, indem bereits vorhandene Bibliotheken / Frameworks auf welcher Plattform (z. B. JVM oder .Net) beendet werden? Wie viele sind brandneu? Gibt es Sprachkonstrukte, die diese Probleme direkt ausdrücken können?

  • Wie viel Kontrolle auf niedriger Ebene benötigen Sie für die räumliche und zeitliche Leistung Ihrer Anwendung?

  • Wie streng sind Ihre "Korrektheits" -Anforderungen?

  • Können Sie es sich leisten, Entwickler neu auszubilden und / oder mit den Vorteilen zu konkurrieren, die einige hochprofitable Nischen in der SW-Entwicklung bieten?

Alexander Battisti
quelle
+1 @Alexander das ist sicherlich eine der besten Antworten in dieser Diskussion. Sie haben eine neue Dimension von Argumenten in die Diskussion eingebracht, indem Sie den Faktor Mensch eingeführt haben, die Schwierigkeit, qualifizierte Entwickler zu finden und sie zu motivieren. Ich stimme voll und ganz Ihrer Vision der Killer-Features von FP langs zu, da ich jeden Tag sehe, dass immer mehr imperative Sprachen diese ebenfalls übernehmen. Aber Ihr Beitrag hat mir die Augen geöffnet, um zu erkennen, dass es viele Dinge gibt, die ich immer noch nicht über FP weiß. Schließlich ist es durchaus sinnvoll, sich auf eine vorhandene Plattform wie .NET oder Java zu stützen.
edalorzo
9

Wenn ich mich für die Umstellung auf eine funktionierende Programmiersprache entschieden habe, welche sind für Sie die größten Gefahren, denen ich mich gegenübersehen werde? (Neben dem Paradigmenwechsel und der Schwierigkeit, die Leistung aufgrund fauler Bewertung zu bewerten).

Angenommen, Sie sind ein C ++ / C # / Java-Entwickler in der Industrie ...

Seien Sie bereit für mürrische Kollegen, die nichts lernen wollen. Seien Sie auf spitze Chefs vorbereitet, die schlechte Sprachwahlen auferlegen, "weil sie einmal Kodierer waren". Seien Sie auf markige Akademiker in Foren vorbereitet, die Sie über Monoide bevormunden. Bereite dich auf endlose Sprachkriege vor, denn Scala hat nicht einmal die Möglichkeit, Anrufe zu eliminieren, und Clojure benötigt wirklich Fußpedale für alle Klammern und bringt mich nicht dazu, Erlang zu lernen.

Wenn Sie ein Web-Programmierer sind, sind wahrscheinlich Ihre Haare die größte Gefahr.

Wie würden Sie bei so vielen funktionalen Programmiersprachen die auswählen, die Ihren Anforderungen am besten entspricht?

Ich würde mit Plattform beginnen:

  • OCaml ist großartig unter Linux und schrecklich unter Windows.
  • F # ist großartig unter Windows und schrecklich unter Linux.
  • Scala und Clojure sind großartig in der JVM.
Jon Harrop
quelle
1
Wenn ich lese: "Sei auf mürrische Kollegen vorbereitet, die nichts lernen wollen." Ich wollte schreien: "So wahr! So verdammt wahr!" aber es ist wirklich traurig.
Zelphir Kaltstahl
3

Eine (zugegebenermaßen voreingenommene) Perspektive zu dieser Frage bietet der Blog von Bob Harper, Existential Type . Carnegie Mellon hat kürzlich sein CS-Curriculum überarbeitet, um zunächst funktionales Programmieren zu unterrichten. Andere Paradigmen werden erst unterrichtet, wenn eine solide Grundlage für funktionales Programmieren geschaffen wurde, und Harper gibt einen Schlag für Schlag, während das neue Curriculum in der Praxis eingeführt wird .

Harper ist einer der Hauptentwickler der Standard-ML-Programmiersprache. Man kann also sagen, dass seine eigene Meinung zu diesem Thema im Voraus erraten werden kann, und er scheut sich sicherlich nicht, umstrittene Aussagen zu machen, wenn er für diese Position argumentiert, aber er macht sein Fall gut.

im uhrzeigersinn
quelle
1
+1 Dieser Artikel ist sicherlich sehr interessant und ich werde ihn von nun an in meinen Favoriten behalten. Ich denke, dass es ein guter Ansatz ist, zuerst FP zu unterrichten, da es wirklich schwierig ist, das imperative Denken loszuwerden, wenn man es anders macht, und vor allem, wenn man keine rein funktionale Programmiersprache verwendet, ist es schwierig, das Alte zu brechen Gewohnheiten. Ich sehe auch, dass große OOP-Sprachen funktionale Merkmale beinhalten und daher muss es in naher Zukunft wirklich praktisch sein, die Fähigkeiten und den Geisteszustand eines funktionalen Programmierers zu erwerben. Interessante Einblicke, danke!
Edalorzo
@jimwise: +1 für Harpers Artikel. Ich finde seinen Ansatz sehr angemessen. @edalorzo: Wenn Sie anfangen, funktional zu denken, sehen Sie das imperative Paradigma als letzten Ausweg, den Sie anwenden müssen, um Ihr Programm zu optimieren, wenn es nicht schnell genug ist. Ich habe in letzter Zeit einige kleine Tools in Scala geschrieben, nicht sehr große, aber nicht triviale und mit einigen echten Funktionen. Zu meinem Erstaunen habe ich kein vareinziges Mal eine veränderbare Sammlung verwendet. Imperatives Denken ist also IMO eine Art vorzeitige Optimierung, die, wie wir alle wissen, die Wurzel allen Übels ist.
Giorgio
2

In welchen Szenarien sollte ich eine funktionierende Programmiersprache in Betracht ziehen, die für eine bestimmte Aufgabe besser geeignet ist? Neben dem in letzter Zeit beliebten Multicore-Problem der Parallelprogrammierung.

Es gibt keine Zauberformel, die Ihnen sagt, wann Sie die funktionale Programmierung verwenden sollen. Es ist nicht so, dass die objektorientierte Programmierung besser zu unseren aktuellen Programmiersituationen passt. Es ist nur eine andere Art, Programme in Bezug auf eine andere Menge von Abstraktionen zu strukturieren.

Wenn ich mich für die Umstellung auf eine funktionierende Programmiersprache entschieden habe, welche sind für Sie die größten Gefahren, denen ich mich gegenübersehen werde? (Neben dem Paradigmenwechsel und der Schwierigkeit, die Leistung aufgrund fauler Bewertung zu bewerten).

Funktionale Programmierung hat nichts mit Faulheit zu tun. ML und OCaml sind funktionale und strenge Sprachen. Die größte Hürde, der Sie gegenüberstehen, besteht darin, Dinge in unveränderlichen Werten zu strukturieren und sich mit der Abstraktion zu befassen, die im Typensystem für Nebenwirkungen verwendet wird. Funktionale Sprachen eignen sich besser zur Optimierung, da sie Nebenwirkungen im Typensystem sehr deutlich machen. Haskell verwendet Monaden, aber es gibt andere Ansätze für die Verwendung von Effekten in reinen funktionalen Sprachen. Clean hat Einzigartigkeitstypen und einige andere Sprachen in der Entwicklung haben andere Dinge.

Wie würden Sie bei so vielen funktionalen Programmiersprachen die auswählen, die Ihren Anforderungen am besten entspricht?

Unter den mir bekannten Programmiersprachen kann man nur Haskell und Clean als funktionale Sprachen bezeichnen. Alle anderen erlauben Nebenwirkungen, ohne diese im Typensystem explizit zu machen. Wenn Sie also Zeit für das Erlernen der funktionalen Programmierung investieren möchten, ist Haskell wahrscheinlich der einzige, der diese Anforderungen erfüllt. Alle anderen, die ich kenne, wie Erlang, Scala, Clojure usw., bieten nur funktionale Abstraktionen über einer imperativen Sprache. Wenn Sie sich also dem funktionalen Paradigma in kleinen Schritten nähern möchten, würde ich Scala oder Erlang empfehlen. Wenn Sie alles auf einmal angehen und möglicherweise frustriert aufgeben möchten, sollten Sie sich für Haskell entscheiden.

davidk01
quelle
@ Dadivk01 +1 Ich mag die Argumentation, dass FP langs nur ein wettbewerbsfähiges Werkzeug wie jedes andere ist und verwendet werden kann, um die gleichen Probleme zu lösen, die mit anderen Modellen gelöst wurden. Warum denkst du, sind sie dann weniger beliebt? Und würden Sie immer noch zustimmen, dass sie besser zur Lösung des Problems des Parallel-Computing geeignet sind als zum Beispiel die meisten OOP langs? Würden Sie sagen, dass unveränderliche Datentypen im Vergleich zu imperativen langs einen Einfluss auf den Speicherbedarf und die Leistung haben? Ich gab Haskell eine Chance, warum würdest du sagen "gib frustriert auf", du machst mir Angst, Alter :)
edalorzo
@edalorzo: Ich denke nicht, dass funktionale Programmierung für parallele Algorithmen besser ist. Leute verwechseln deklaratives Programmieren mit funktionalem Programmieren. Was für die funktionale Programmierung von Bedeutung ist, ist ihre deklarative Natur und eine Menge wirklich kluger Leute, die exzellente Compiler schreiben, um deklarativen Code in Maschinencode zu übersetzen. Jede andere Sprache, die eher zur Beschreibung von Problemen als zur expliziten Darstellung kleinerer Details beiträgt, eignet sich auch für die parallele Programmierung.
Davidk01
@edalorzo: Was "frustriert aufgeben" angeht, sage ich, dass das Typensystem von haskell und seine monadische Herangehensweise an die Beschreibung von Effekten ein wenig zu viel sein könnten, wenn Sie nur die imperative Programmierung kennen. Ich denke, es ist besser, mit einer Sprache zu beginnen, die Nebenwirkungen wie Erlang und Scala pragmatischer behandelt.
Davidk01
0

Ich würde den gegenwärtigen Anstieg von Interessen in funktionalen Sprachen auf die Tatsache zurückführen, dass sie sich ideal für paralleles Rechnen eignen. Beispielsweise basiert die gesamte Idee der Kartenreduzierung auf einem Funktionsparadigma. Und es besteht kein Zweifel, dass das parallele Rechnen zunehmen wird, da klar ist, dass das derzeitige Scale-out viel einfacher und billiger ist als das Scale-up. Auch auf dem Consumer-Markt bekommen CPUs mehr Kerne, nicht mehr GHz.

EDIT: da es nicht für alle offensichtlich ist.

In der reinen Funktionsprogrammierung nimmt eine Funktion Eingaben auf, erzeugt Ausgaben und hat keine Nebenwirkungen. Keine Nebenwirkung bedeutet, dass kein gemeinsamer Status vorliegt und daher keine Synchronisationsmechanismen erforderlich sind, die andernfalls bei gleichzeitiger Ausführung erforderlich wären. Die Synchronisation ist der schwierigste Teil einer gleichzeitigen / parallelen Software. Wenn Sie also eine reine Funktionssoftware einsetzen, müssen Sie sich im Grunde genommen nicht mit dem schwierigsten Teil befassen.

Bei der Kartenreduzierung stammt sogar der Name aus der funktionalen Programmierung (sowohl die Zuordnung als auch die Reduzierung sind typische Operationen im funktionalen Paradigma). Beide Schritte der Kartenreduzierung sind Funktionen, die parallel ablaufen, Eingaben entgegennehmen, Ausgaben produzieren und keine Nebenwirkungen haben. Das ist also genau die rein funktionale Programmieridee.

Einige Beispiele für FP, die für Parallelität verwendet werden:

  • CouchDB - auf Erlang aufbauen
  • Facebook-Chat - auf Erlang aufbauen
  • Twitter - ein Großteil basiert auf Scala
vartec
quelle
3
Alle machen die Behauptung der parallelen Programmierung geltend, aber es gibt nur sehr wenige Daten, um sie zu sichern. Wenn Ihnen solche Quellen bekannt sind, sollten Sie sie zitieren. Komplexe Berechnungen weisen häufig komplexe Datenabhängigkeiten auf, und wenn Sie ein funktionales Programmierparadigma verwenden, verschwindet die inhärente Datenabhängigkeit einiger Modelle nicht auf magische Weise. GPU-Programmierung ist so parallel wie es nur geht, aber die Verwendung von imperativen Sprachen ist in Ordnung, da in den Modellen, mit denen sie arbeiten, Parallelität eingebaut ist.
davidk01
4
@vartec: Im Interesse der Objektivität wäre es immer noch schön, wenn Sie eine Referenz angeben könnten, die Ihre Behauptungen stützt. Es würde den unwissenden Lesern weit mehr helfen als eine Gegenfrage ...
blubb
1
@vartec: Eigentlich nein, mir ist nie in den Sinn gekommen, dass eine Menge Leute, die Behauptungen aufstellten, dies wahr gemacht haben. Ich gebe meinem Mathematikunterricht die Schuld, aber nicht jeder von uns glaubt an Fakten und konkrete Gründe für unsere Behauptungen, und Ihre Bearbeitung geht immer noch nicht auf meinen Kommentar ein.
Davidk01
1
@vartec Sie könnten einen Verweis auf eine glaubwürdige Quelle setzen, die Ihre Behauptungen stützt.
quant_dev
1
+1 @ davidk01 "Alle machen die Behauptung über die parallele Programmierung geltend, aber es gibt nur sehr wenige Daten, um sie zu sichern". Mir ist eine Vielzahl von Beweisen für das Gegenteil bekannt. In den Cilk-Artikeln wird beispielsweise beschrieben, wie wichtig eine direkte Mutation ist, wenn Sie eine gute Cache-Komplexität wünschen, die eine skalierbare Parallelität auf einem Multicore voraussetzt.
Jon Harrop