Sollten wir mehr funktionale und / oder logische Programmiersprachen verwenden?

8

Ich habe ein bisschen Haskell und Prolog als Teil einiger Uni-Kurse programmiert, aber das war es auch schon. Und ich habe noch nie gesehen, dass es in der Industrie verwendet wird (nicht, dass ich anfangs viel Berufserfahrung gesammelt habe, aber ich habe noch nie eine Anzeige gesehen, in der Sie sie kennen müssen).

Sollten wir also häufiger funktionale und / oder logische Programmiersprachen verwenden? Gibt es Vor- oder Nachteile für die Verwendung oder Nichtverwendung?

gablin
quelle

Antworten:

9

Ich glaube daran, das richtige Werkzeug für den Job zu verwenden. Sowohl imperative als auch funktionale Sprachen haben ihren Platz und es besteht keine Notwendigkeit, darauf zu drängen, eine Art mehr als die andere zu verwenden.

Für die Vor- und Nachteile glaube ich nicht, dass ich Eric Lipperts Antwort auf die Frage "Warum wurde die funktionale Programmierung noch nicht übernommen?" SO Frage.

Adam Lear
quelle
Hmm? Warum das Downvote?
Adam Lear
1
Ich habe nicht abgelehnt, aber ich bin mit seiner Antwort nicht einverstanden (wie "Verwechseln" von Parallelität und Parallelisierung - in der funktionalen Welt bedeuten diese Begriffe zwei verschiedene Dinge). Dies bedeutet jedoch nicht, dass ich denke, dass es eine schlechte Antwort ist.
Maciej Piechotka
In der Tat war Eric Lipperts eine sehr informative Antwort. Danke für die Richtung.
Gablin
5

Zuallererst - weil der Compiler viel mehr tun muss. Wenn Sie einen imperativen Compiler erstellen möchten, können Sie fast eine 1-1-Transformation zum Assembler durchführen, und der erzeugte Code hat eine akzeptable Geschwindigkeit (sicher - es könnte viel zu tun sein, aber es handelt sich im Grunde genommen um 1-1-Kompilierung + Optimalisierung). Funktionale Compiler MÜSSEN mit starkem Inlineing, Tail-Call-Optimalisierung usw. umgehen. Daher war die Implementierung funktionaler Sprachen in der Vergangenheit viel langsamer als in C / C ++ / ... (sie gewinnen jedoch mit jeder Iteration viel an Geschwindigkeit, da Compiler besser werden).

Zweitens - Programmierer sind es so gewohnt zu sagen, dass sie den Ansatz "Es gibt keinen Spoo ... State" nicht akzeptieren können. Sicher - der Mangel an Staat ist nicht in jeder Bedingung nützlich, aber der Mangel an (globalem) Staat bedeutet nicht den Mangel an lokalem Staat.

Drittens - funktionale Programmierung hat keine schöne Geschichte. Die OOP haben eine schöne Geschichte, da die Objekte Substantiven zugeordnet sind und wie intuitiv sie sind. Danach wissen Sie , dass es nicht so einfach ist , weil Sie nicht eine Klasse erstellen kann Managerals Unterklasse von Employeewie Employeebekommen fördern kann , Managerund Sie müssen Dekorateure rumspielen. Die Funktionsprogramme haben eine Geschichte in der Mathematik, die meiner Meinung nach nützlicher, aber weniger marktfähig ist.

Wie intern aus der Computerperspektive gibt es keinen Unterschied zwischen parallelem und gleichzeitigem Rechnen. Viele Programmierer sehen keinen Unterschied, und viele Sprachen haben dieselben Grundelemente, um beide zu handhaben. Dank des Mangels an lokalem Status und einfachen Threads in funktionalen Programmiersprachen ist die Parallelisierung des Algorithmus viel einfacher. Die gleichzeitige Programmierung wird jedoch nicht automatisch vereinfacht, da es bei der Parallelität um den globalen Status geht.

Schließlich gibt es viele ältere Programme, die inperativ geschrieben sind. Selbst die Portierung von der imperativen Sprache zur imperativen Sprache ist viel einfacher als zur funktionalen.

Soweit ich weiß, beginnen Investmentbanken, die Funktionsprogramme intern zu übernehmen, damit sie in XXI c. (in sehr wichtigen, wenn auch versteckten Bereichen) - damit sie an Dynamik gewinnen.

PS. Obwohl ich glaube, dass funktionale Programme "besser" sind, was bedeutet, dass sie die Komplexität besser verbergen als andere Ansätze, bedeutet dies nicht, dass es keine Bereiche wie Skripte gibt, die von Natur aus zwingend erforderlich sind.

Maciej Piechotka
quelle
2

Eine Programmiersprache ist eine Form der Darstellung von Informationen. In diesem Fall müssen die Anweisungen für den Computer befolgt werden. Die Darstellung ist jedoch auch für die Zielgruppe (dh die Programmierer) wichtig.

Funktionale / logische Konzepte werden im täglichen Leben nicht so häufig verwendet wie prozedurale Konzepte. Wenn Sie Anweisungen lesen (z. B. wie Sie Ihren Fernseher oder DVD-Player verwenden oder Möbel von IKEA bauen), werden diese meist prozedural geschrieben (wenn auch in natürlicher Sprache).

Daher sind viele Leute, die sich nicht sehr intensiv mit Mathematik oder Naturwissenschaften beschäftigen, mit solchen Verfahrenskonzepten oft weitaus besser vertraut als mit den logischen oder funktionalen.

Ich denke, dies hat einen großen Einfluss auf die Wahl der verwendeten Programmiersprachenklasse. Am Ende sind die Probleme, die mit einer solchen Programmiersprache gelöst werden können, ziemlich gleich (solange sie alle vollständig sind).

Viele prozedurale Sprachen erhalten jedoch immer mehr Facetten anderer Konzepte. Python kann Lambda-Kalkül und Verschlüsse machen, auch Rubin. Javascript, das in der Industrie häufig verwendet wird, ist eigentlich eine funktionale Sprache (selbst die meisten Leute "missbrauchen", indem sie es eher prozedural verwenden). Daher ist es wirklich die Aufgabe des Programmierers, diese Funktionen dort zu verwenden, wo sie passen.

txwikinger
quelle
1
Seit wann ist JavaScript eine funktionale Sprache?
Jonas
1
@ Jonas - Es ist in der Tat eine funktionale Sprache und es war schon immer so. Natürlich kann eine Sprache wie JavaScript vielen Paradigmen gleichzeitig folgen.
ChaosPandion
1
@ChaosPandion: Nur weil es Verschlüsse und Funktionen hoher Ordnung hat? :)
Jonas
@ Jonas - Natürlich reden wir hier nicht über Haskell, aber Sie können es trotzdem als funktional bezeichnen.
ChaosPandion
2
Ich denke, Sie sollten die allgemeine Herangehensweise an das Problem auf idiomatische Weise betrachten. Wenn die Programmiersprache vorschlägt, das Problem in reine Funktionen aufzuteilen, ist es daher funktionsfähig. Wenn es vorschlägt, das Problem in Objekte aufzuteilen, ist es objektorientiert. Wenn es vorschlägt, "dies und dann das zu tun", ist es unerlässlich. Daher sind Lambdas, Fortsetzungen usw. nicht nur für funktionale Sprachen notwendige Merkmale, und JS ist keine funktionale Sprache, da es nicht "vorschlägt", in Funktionen und unveränderlichen Daten zu denken.
Maciej Piechotka