Auswahl einer funktionalen Programmiersprache [geschlossen]

48

Ich habe in letzter Zeit eine Menge Threads über funktionierende Programmiersprachen gelesen (fast im letzten Jahr sogar). Ich würde wirklich gerne eine auswählen und es gründlich lernen.

Im letzten Semester wurde ich in das Schema eingeführt. Ich liebte es. Liebte die extreme Einfachheit der Syntax, das Homoikonizitätsprinzip , die Makros ( hygienisch und nicht hygienisch), die n-Arität der Prozeduren usw.

Das Problem bei Scheme ist, dass es sich um eine akademische Sprache handelt. Ich denke nicht, dass es wirklich in Produktionsumgebungen verwendet wird. Ich glaube auch nicht, dass es besonders gut ist, in unserem Lebenslauf zu haben. Also habe ich mich nach Alternativen umgesehen. Es gibt viele von ihnen und sie scheinen alle einen ähnlichen Bekanntheitsgrad zu haben.

Einige Gedanken zu anderen funktionalen Sprachen, die ich bisher in Betracht gezogen habe:

  • Clojure: Es klingt großartig, weil es auf die Java-Welt zugreifen kann, auf Skalierbarkeit und Parallelität ausgerichtet ist, aber ist die Java-Welt im Moment nicht am Rande? Ich kenne Java bereits ziemlich gut, aber wäre es sinnvoll, abhängig von der JVM noch mehr Energie hinzuzufügen?
  • Haskell: Sieht nach einer sehr geschätzten Sprache aus, aber nach dem, was ich gelesen habe, ist es auch eher eine akademische Sprache.
  • Lisp: Es gibt es schon seit Ewigkeiten. Es scheint das meiste zu haben, was ich von Schema mag. Es hat eine große Community. Soweit ich weiß, ist es wahrscheinlich die am weitesten verbreitete funktionale Programmiersprache in der Industrie (?).
  • F #: Ich habe es nicht wirklich bedacht. Ich bin kein großer Fan von MS-Sachen. Ich habe nicht das Geld, um ihre Software zu bezahlen (ich könnte sie von Universitätsallianzen befreien, aber ich bin eher geneigt, auf Community-basierte Lösungen zu setzen). Obwohl ... ich denke, es wäre die beste karriereorientierte Wahl.

Heute Nacht neige ich mich zu Lisp. Vor einer Woche war es Haskell. Vorher war es Clojure. Im vergangenen Jahr habe ich ein Scheme zum Spaß gemacht und es nicht aus dem Grund gepusht, den Sie kennen. Jetzt möchte ich ernsthaft werden (über das Erlernen eines, über das Durchführen echter Projekte, über die mögliche professionelle Arbeit damit). Mein Problem ist, dass ich sie alle gründlich lernen muss, bevor ich mich für eine entscheiden kann.

Joanis
quelle
5
Was auch immer Sie wählen, schreiben Sie viel Code, den Sie für etwas darin verwenden.
8
Haben Sie nicht über Scala nachgedacht ?
ykombinator
@ykombinator: Ich habe davon gehört, aber ich habe nicht weiter gesucht. Ich weiß nicht, ob es irgendetwas zu bieten hätte, das ich aufgelistet habe, oder vielleicht bringt es eine Kombination von interessanten Optionen von jeder von ihnen ... Weiß nicht. Klingt für mich nach einer ziemlich unauffälligen Sprache, obwohl sie immer beliebter zu werden scheint.
Joanis
1
Ich weiß nicht, wo Sie gehört haben, dass die Java-Welt "am Rande" ist - sie erlebt derzeit eine große Renaissance, hauptsächlich dank a) OpenJDK als Standardimplementierung b) neuer JVM-Sprachen wie Scala und Clojure und c) The Tatsache, dass die Big-Data- / Cloud-Projekte zunehmen und sich für die JVM als Zielplattform und für d) Android entscheiden. Ab Anfang 2012 ist es wahrscheinlich die aufregendste Plattform, auf der man sein kann .....
mikera
1
@mikera: Einverstanden. Dies ist mehr als ein Jahr alt, kurz nachdem Oracle Sun Microsystems übernommen hatte, und es gab all diese Bedenken und Spekulationen darüber, dass die Zukunft von Java durch ein stärker kontrollierendes Unternehmen, das die Kontrolle übernimmt, gefährdet wird ... Die JVM scheint im Moment zum Glück ziemlich sicher zu sein!
Joanis

Antworten:

35

Da möchten Sie eine praktische  Sprache:

Alt-Text

Beachten Sie, dass Haskell und Lisp in der Industrie häufiger verwendet werden als die anderen, obwohl in letzter Zeit ein gewisses Interesse an Clojure und F # besteht.

Aber schauen Sie, was passiert, wenn wir der Mischung Schema hinzufügen:

Alt-Text

Hmm, sieht jetzt nicht mehr so ​​nach einer akademischen Sprache aus, oder?

Tatsächlich ist die obige Grafik wahrscheinlich eine Lüge. Das Wort "Schema" kann in Hilfesuchanzeigen auch in anderen Kontexten als in Programmiersprachen vorkommen. :)

Hier ist ein weiteres Diagramm, das wahrscheinlich (ein wenig) repräsentativer ist:

Alt-Text

Wenn Sie einen wirklich guten Dialekt von Scheme kennenlernen möchten, schauen Sie sich Racket an.

Robert Harvey
quelle
Wow, schöner Beitrag. Schläger ist genau das, was ich benutze ... PLT-Schema war der Name, als ich anfing, es zu lernen. Diese rote Linie in der letzten Grafik stört mich. Ich hätte nie gedacht, dass Scheme so oft angewendet werden kann. Und Clojure scheint auf dem Vormarsch zu sein. Hmm ...
Joanis
@M. Joanis: Nehmen Sie die letzten beiden Graphen mit einem Körnchen Salz. Die Treppenoptik und die Volatilität des letzten Diagramms lassen darauf schließen, dass das Diagramm nicht viele Datenpunkte enthält, obwohl dies darauf hinweist, dass jemand der Meinung ist, dass die Sprachen es wert sind, dafür bezahlt zu werden.
Robert Harvey
@Robert Harvey, was hat sich von der zweiten zur dritten Grafik geändert?
Systemovich
@ Geoffrey: Schau dir die Untertitel an; Ich habe den Suchbegriffen das Wort "Entwickler" hinzugefügt.
Robert Harvey
Beachten Sie, dass Haskell und Lisp auch Homonyme sind und dass sich die Daten von Indeed nicht auf den Rest der Welt übertragen lassen. ITJobsWatch listet 79 Scala-Jobs, 55 F # -, 47 Haskell-, 30 Lisp- und 7 Clojure-Jobs auf.
Jon Harrop
17

Wenn Sie funktionale Programmierung lernen möchten, ist es möglicherweise besser, zuerst Haskell zu lernen und dann die gewünschte Sprache zu verwenden. Sie können die funktionale Programmierung in den anderen Sprachen erlernen, sie ermöglichen jedoch weiterhin einen imperativen und objektorientierten Code. Wenn Sie ein echtes Programm in Haskell schreiben, werden Sie die funktionale Programmierung schneller erlernen, da die anderen Paradigmen nicht zur Verfügung stehen, auf die Sie zurückgreifen können.

Nachdem Sie Ihr Haskell-Programm geschrieben haben, verfügen Sie über Tools wie Monaden und Techniken wie punktloses Codieren, um die Sprache Ihrer Wahl zu erstellen. Die Konzepte scheinen besonders gut Schema zuzuordnen.

Larry Coleman
quelle
Ich denke, Sie haben Recht, wenn Sie zuerst eine reine funktionale Sprache auswählen. Ich wäre sehr daran interessiert, eine Sortierung der funktionalen Sprachen nach Reinheit zu sehen.
Joanis
@M. Joanis: Von den in Ihrer Frage aufgeführten Sprachen würde ich sagen, dass Haskell die reinste ist, gefolgt von Clojure, F # und Lisp.
Larry Coleman
15

Wenn Sie in der Lage wären, ein einigermaßen komplexes System in Scheme zu implementieren, wären Sie in Unternehmen, in denen Sie wahrscheinlich arbeiten möchten, ziemlich wünschenswert. Zu Beginn meiner Karriere traf ich einige Studenten, die in Scheme ziemlich viel gearbeitet hatten, und das einzige Mal war es ein Nachteil, wenn sie ihre Arbeit nicht erklären konnten oder es nicht gut genug verstanden hatten, um grundlegende Daten zu implementieren Strukturen und Algorithmen innerhalb eines angemessenen Zeitraums. Ich lasse Kandidaten solche Fragen immer in ihrer bevorzugten Sprache beantworten. Ich habe einige Leute getroffen, die dachten, sie wären die Besten in Scheme, die es geschafft haben, einiges mit Dingen zu tun, die einfach sein sollten, wie das Hinzufügen eines Elements zu einer verknüpften Liste, was mich verwirrte.

Aber wenn Sie in der Lage wären, Scheme gut genug zu "bekommen", um selbst eine durchschnittliche Web-App zu schreiben, wäre das ein ziemlich gutes Verkaufsargument für die meisten seriösen Software-Unternehmen.

Wenn Sie in einem "blub" -Shop interviewt haben und die Entwickler Sie aufgrund Ihrer Kenntnisse bei Scheme, Haskell oder F # für verrückt hielten, würden Sie wahrscheinlich nicht dort arbeiten wollen. In den meisten Fällen haben kompetente Entwickler die Wahl zwischen verschiedenen Auftritten. Schwitzen Sie also nicht über die Praktikabilität, es sei denn, die einzigen Optionen, die Sie sich für Ihre Zukunft vorstellen können, sind Unternehmen. Arbeiten Sie daran, kompetent, flexibel und problematisch zu sein.

Im College geht es nicht um Praktikabilität. Es geht darum, eine sichere Umgebung zum Erkunden und Lernen zu schaffen. Das ist sogar dann nützlich, wenn Sie für den Rest Ihrer Karriere gewöhnliche Software schreiben.

Trotzdem verstehe ich nicht, warum Sie sich so schnell auf eine dieser Möglichkeiten beschränken möchten. Sie könnten sich in ungefähr 4 Wochen leicht ein Bild von allen vier Sprachen machen und dann eine auswählen, die am besten zu Ihren aktuellen Launen passt. Kehren Sie dann zu einer anderen Ihrer Optionen zurück und versuchen Sie, etwas Ähnliches zu implementieren. Gehen Sie zu etwas Komplexerem über und überlegen Sie sich Ihre Optionen noch einmal. Das Experimentieren ist gut. Wenn Sie nicht versuchen, nächsten Monat Ihren Lebensunterhalt zu verdienen, müssen Sie noch kein Spezialist werden.

Ich habe einige in Scheme, F #, Emacs Lisp und Common Lisp geschrieben und mindestens ein bisschen Haskell gelesen, zumindest gelegentlich in den letzten Jahren. Ich kann nicht sagen, dass ich Experte in einer von ihnen bin, aber jeder Ausflug in diese Sprachen hat mir in allen anderen Sprachen, in denen ich beruflich arbeite, Vorteile gebracht (C #, Java, Ruby und gelegentlich Boo, Perl und Python). Neugierde wird Ihnen eine nachhaltigere und erfüllendere Karriere ermöglichen als alles andere.

JasonTrue
quelle
2
"Neugierde wird Ihnen eine nachhaltigere und erfüllendere Karriere ermöglichen als alles andere." Diese Aussage ist sehr inspirierend. Du hast recht. Ich bin zu schnell. Ich habe immer das Gefühl, dass es zu lange dauern wird, bis ich es gelernt habe ... Wenn ich vor 12 Jahren anfangen könnte, würde ich nicht meine ganze Zeit mit VB und C ++ verschwenden. Ich habe das Gefühl, dass diese Jahre ziemlich vergeudet waren. Ich war nicht neugierig genug. Ich wollte Sachen codieren. Die Sprachen, die ich kannte, waren genug. Ich dachte damals, ich wüsste eine ganze Menge, aber das war so schrecklich überhaupt nicht der Fall.
Joanis
10

Ich tauchte eine Weile in Haskell ein, aber ich kam zu dem Schluss, dass es etwas zu akademisch war. Es war sehr schwer, irgendetwas Praktisches zu tun. In einer reinen funktionalen Sprache passen Dinge wie IO einfach nicht ganz in das Modell, also muss man sich mit Monaden auseinandersetzen. Ich entschied, dass ich enorm viel Zeit investieren musste, um kaum kompetent zu sein, also ging ich weiter.

Ich habe Scheme in der Schule gemacht. Es mag trivial klingen, aber alle Parens sind wirklich ablenkend / ärgerlich. Es ist schwierig, darauf zurückzukommen, nachdem man Sprachen wie Python verwendet hat.

Vor kurzem habe ich F # erforscht. Es ist funktional, kann aber auch zwingend und objektorientiert sein, wenn Sie möchten. Zusammen mit der Möglichkeit, beliebige .NET-Bibliotheken zu verwenden, können Sie auf einfache Weise Ihre reinen Funktionsteile mit praktischeren Dingen wie GUIs, E / A und Netzwerken kombinieren. Sie können eine eigenständige Version von F # erhalten.

http://www.microsoft.com/downloads/de/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=de

Erik
quelle
Die Tatsache, dass F # und Clojure nicht rein funktional sind, spielt eine wichtige Rolle für sie. Vielleicht könnte F # eines Tages mein Einstieg in die .Net-Familie sein ...
Joanis
1
@MJoanis, du hast angegeben, dass es ein Punkt gegen F # ist, aber wie Erik betont, kannst du es völlig kostenlos bekommen.
Benjol
Wenn ich die Bedingungen richtig lese, erhalten Sie sie im Grunde kostenlos, wenn Sie sie nicht verwenden (oder Lizenzen kaufen). Ich verstehe jedoch, dass es immer noch eine sehr gute Sache sein kann, wenn ich mit Visual Studio in einem Unternehmen lande. Ich werde es wahrscheinlich versuchen, sobald ich mit einer kostenloseren funktionalen Programmiersprache funktionsfähig bin.
Joanis
1
@M. Joanis: Nein, F # ist sogar Open Source und Sie können versuchen, Mono auf anderen Plattformen zu verwenden.
Jon Harrop
Vielleicht haben sich die Zeiten seit 2010 geändert, aber als jemand, der in den letzten Monaten angefangen hat, Haskell zu lernen, denke ich, dass es überhaupt nicht schwierig ist, IO in Haskell zu machen. Für grundlegende Dinge brauchen Sie nur ein paar neue Do-Syntax zu erlernen. Es dauert ein paar Wochen, bis Sie das wahre Grundverständnis erlangt haben, aber ich verstehe wirklich nicht, worum es bei Monaden geht. Ich glaube nicht, dass es schwerer war, sie zu lernen als Klassen, Instanzen, statische Mitglieder und all den anderen staatlichen Jazz in OOP.
Sara
9

Ich habe vor ein oder zwei Jahren alle wichtigen funktionalen Sprachen evaluiert, um eine praktische funktionale Programmiersprache für allgemeine Zwecke zu finden.

Am Ende habe ich mich für Clojure entschieden , was sich später als hervorragende Wahl erwiesen hat.

Im Großen und Ganzen waren die Hauptgründe:

  • Bibliotheksökosystem - Damit eine Sprache nützlich ist, benötigen Sie Zugriff auf gute Bibliotheken. Bei der JVM zu sein bedeutet, dass Sie einfachen Zugriff auf die größte Open-Source-Bibliothek und das größte Tool-Ökosystem haben. Daher war die Entscheidung für eine JVM-Sprache aus pragmatischer Sicht ein Kinderspiel. Auch hier hat Scala sehr gut abgeschnitten.

  • Makro-Metaprogrammierung - Dieser Aspekt von Lisp hat mich immer gereizt, zumal ich damit gerechnet habe, einiges an Code zu generieren. Ich habe die Argumente in Paul Grahams kurzem Aufsatz " Beating The Averages " sehr geschätzt . Die verschiedenen Lisps haben hier alle stark abgeschnitten.

  • Leistung war "gut genug" - Clojure wird immer kompiliert und erhält die Vorteile des JVM-JIT-Optimierers und der exzellenten GC. Wie immer ist die Verwendung einer funktionalen Sprache mit einem gewissen Aufwand verbunden, aber mit Clojure war klar, dass Sie sich jeder Java-Geschwindigkeit mit ein wenig Aufwand annähern können (Clojure unterstützt Java-Primitive und optionale statische Typisierung für Situationen, in denen Sie sie benötigen). Meiner Schätzung nach ist Clojure um das 2-5-fache langsamer als mit optimiertem Java- oder C ++ - Code, was mit dem übereinstimmt, was Sie in den fehlerhaften Benchmarks sehen. Mit der Zeit erwarte ich, dass sich diese Lücke weiter verringert . Außerdem ist es einfach genug, besonders leistungskritischen Code in reinem Java zu schreiben und ihn von Clojure aus aufzurufen.

  • Parallelität - Clojure bietet einen ziemlich einzigartigen und leistungsstarken Ansatz für die Parallelität, insbesondere für die Parallelität mit mehreren Kernen. Es ist ein bisschen schwer zu erklären, aber dieses Video ist hervorragend , um einen Vorgeschmack auf die Prinzipien zu geben. Ich denke, Clojure hat derzeit die beste Antwort auf die knifflige Frage "Wie soll man einen gemeinsamen, gleichzeitigen und veränderlichen Zustand in einer funktionalen Programmiersprache verwalten?".

  • Sprachdesign - Clojure ist IMO ein sehr durchdachtes Sprachdesign. Beispiele sind neben den regulären Lisp-Klammern auch Vector [] - und Map {} -Literale, die Verwendung unveränderlicher persistenter Datenstrukturen, die Unterstützung der sprachübergreifenden Faulheit über die Sequenzabstraktion und die Bereitstellung einer Vielzahl von orthogonalen Merkmalen für den Programmierer zur Lösung verschiedener Probleme . Sehen Sie die Kunst der Abstraktion und einfach leicht gemacht .

  • Community - immer subjektiv, aber mir hat gefallen, was ich in der Clojure-Community gesehen habe. Die Einstellung war sehr hilfreich, konstruktiv und pragmatisch. Es gibt einen starken Schwerpunkt auf dem Thema "Dinge erledigen", was möglicherweise die Tatsache widerspiegelt, dass viele Clojure-Mitarbeiter (einschließlich Rich Hickey selbst) aus dem Hintergrund des Aufbaus komplexer Unternehmenssysteme stammen. Die Tatsache, dass die Clojure-Community auch starke Verbindungen zur Java-Community hat, war wichtig, um mich davon zu überzeugen, dass Clojure nicht die Gefahr laufen würde, in einer "Nische" zu stecken.

Wenn ich ein paar kleinere Nachteile von Clojure nennen müsste, wären dies:

  • Dynamisches Tippen - dies ist oft ein Produktivitätsvorteil, aber ich denke, dass ich dies im Durchschnitt gegen eine stärkere Typprüfung und Inferenz eintauschen würde. Meistens wird dies durch eine gute automatisierte Testsuite gemildert, aber wenn Sie möchten, dass Ihre Typen vom Compiler statisch validiert werden, sind Haskell oder Scala möglicherweise eher Ihre Wahl.

  • Spitzenklasse - Clojure entwickelt sich sehr schnell und es gibt eine Menge Innovationen - der Nachteil ist, dass viel experimentiert wird, einige Bibliotheken und Tools noch nicht ausgereift sind und gelegentlich wichtige Änderungen zwischen den Clojure-Hauptversionen vorgenommen werden müssen ein Auge auf.

Insgesamt glaube ich jedoch nicht, dass Sie mit Clojure einen Fehler machen können, wenn Sie eine ausgezeichnete und pragmatische moderne funktionale Sprache wollen!

mikera
quelle
1
Vielen Dank! Guter Eintrag! Ich war in diesen Tagen gerade dabei, darüber nachzudenken, es für ein firmeninternes Projekt zu verwenden, das stark auf Bäumen und Rekursivität basiert. Außerdem haben wir hier ziemlich viel Java-Code, den wir mit Clojure wiederverwenden können.
Joanis
6

Es sieht so aus, als ob Sie Ihre Hausaufgaben gemacht haben. Sie wissen das wahrscheinlich bereits, aber Scheme ist ein Lisp-Dialekt, genau wie Common Lisp. Wenn Sie viele Dinge über Scheme mögen, aber die akademische Natur nicht mögen, versuchen Sie es mit Common Lisp. Laut dem TIOBE-Index ist es die 13. beliebteste Sprache im Vergleich zu Schema auf Position 26.

In den Stellenbeschreibungen, die ich kürzlich gesehen habe, sind nur wenige der von Ihnen genannten Sprachen aufgeführt, obwohl dies möglicherweise nur meine kleine Auswahl ist. Ich persönlich werde Haskell lernen, obwohl ich nicht erwarte, diese Sprache direkt in meinem Job zu verwenden. Die Konzepte der funktionalen Programmierung sind für mich für zukünftige Programmentwürfe wertvoller als die direkte Vermarktbarkeit der Sprache selbst.

Zeke
quelle
Vielen Dank für den TIOBE-Link, das ist eine interessante Referenz. Ich vermute, Sie wählen Haskell wegen seiner Reinheit in Bezug auf die funktionale Programmierung?
Joanis
1
@ M.Joanis: Ziemlich genau, obwohl ich darüber nachdenke, später auch Lisp abzuholen. Siehe programmers.stackexchange.com/questions/18838/…
Zeke
Die gewählte Antwort macht sehr viel Sinn. Reinheit scheint der richtige Weg zu sein, bis ich das gesamte funktionale Paradigma verstanden habe.
Joanis