it-swarm-eu.dev

Auswahl einer funktionalen Programmiersprache

Ich habe in letzter Zeit viele Threads über funktionale Programmiersprachen gelesen (tatsächlich fast im letzten Jahr). Ich würde wirklich gerne einen auswählen und ihn gründlich lernen.

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

Das Problem mit Scheme ist, dass es eine akademische Sprache ist. 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, es ist auf Skalierbarkeit und Parallelität ausgerichtet, aber nicht die Java Welt an einem Rand rechts) Ich weiß bereits Java ziemlich gut, aber wäre es ratsam, je nach JVM noch mehr Energie hinzuzufügen?
  • Haskell: Sieht aus wie eine sehr geschätzte Sprache, 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 Scheme mag. Es hat eine große Gemeinschaft. Soweit ich weiß, ist es wahrscheinlich die am weitesten verbreitete funktionale Programmiersprache in der Industrie (?).
  • F #: Ich habe es nicht wirklich in Betracht gezogen. Ich bin kein großer Fan von MS-Sachen. Ich habe nicht das Geld, um für ihre Software zu bezahlen (ich könnte sie frei von Universitätsallianzen haben, aber ich bin eher geneigt, Community-basierte Lösungen zu wählen). Obwohl ... ich denke, es wäre die beste karriereorientierte Wahl.

Heute Abend neige ich mich zu LISP. Vor einer Woche war es Haskell. Davor war es Clojure. Im vergangenen Jahr habe ich ein Programm zum Spaß gemacht und es nicht aus dem Grund, den Sie kennen, vorangetrieben. Jetzt möchte ich es ernst meinen (darüber, eines zu lernen, echte Projekte damit zu machen, vielleicht irgendwann professionell damit zu arbeiten). Mein Problem ist, dass ich sie alle gründlich lernen muss, bevor ich mich für eine entscheiden kann.

49
Joanis

Da Sie eine praktische Sprache wollen:

alt text

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

Aber schauen Sie, was passiert, wenn wir dem Mix Schema hinzufügen:

alt text

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

Tatsächlich ist die obige Grafik wahrscheinlich eine Lüge; Das Wort "Schema" kann in Hilfesuchanzeigen neben den Programmiersprachen auch in anderen Kontexten angezeigt werden. :) :)

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

alt text

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

36
Robert Harvey

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 funktionale Programmierung mit den anderen Sprachen lernen, aber sie ermöglichen immer noch imperativen und objektorientierten Code. Wenn Sie ein echtes Programm in Haskell schreiben, lernen Sie die funktionale Programmierung schneller, da die anderen Paradigmen nicht verfügbar sind, auf die Sie zurückgreifen können.

Nachdem Sie Ihr Haskell-Programm geschrieben haben, stehen Ihnen Tools wie Monaden und Techniken wie punktfreie Codierung zur Verfügung, mit denen Sie die Sprache Ihrer Wahl auswählen können. Die Konzepte scheinen besonders gut auf das Schema abzustimmen.

18
Larry Coleman

Wenn Sie in der Lage wären, ein relativ 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 auf einige Studenten, die eine Menge Arbeit in Scheme geleistet hatten, und das einzige Mal war es ein Nachteil, wenn sie ihre Arbeit nicht erklären konnten oder sie nicht gut genug verstanden, 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 kämpfen, die einfach sein sollten, wie das Hinzufügen eines Elements zu einer verknüpften Liste, was mich mystifizierte.

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

Wenn Sie in einem "Blub" -Laden interviewt haben und die Entwickler Sie aufgrund Ihrer Kenntnisse in Scheme, Haskell oder F # nur für komisch hielten, möchten Sie dort wahrscheinlich nicht arbeiten. In den meisten Fällen haben kompetente Entwickler die Wahl zwischen Auftritten. Schwitzen Sie also nicht an "Praktikabilität", es sei denn, die einzigen Optionen, die Sie sich in Ihrer Zukunft vorstellen können, sind Corporate. Arbeiten Sie daran, kompetent und flexibel zu sein und Probleme zu lösen.

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

Davon abgesehen verstehe ich nicht, warum Sie sich so schnell auf eine dieser Optionen beschränken möchten. Sie könnten in ungefähr 4 Wochen leicht ein Gefühl für alle vier Sprachen bekommen und dann eine auswählen, um sich auf das zu konzentrieren, was 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. Experimentieren ist gut. Wenn Sie nicht versuchen, Ihren Lebensunterhalt im nächsten Monat zu verdienen, müssen Sie noch kein Spezialist werden.

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

16
JasonTrue

Ich tauchte eine Weile in Haskell ein, aber ich kam zu dem Schluss, dass es etwas zu akademisch war. Es war sehr schwer, etwas 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 müsste, um Sei gerade noch kompetent, also ging ich weiter.

Ich habe Scheme im College gemacht. Klingt vielleicht trivial, aber alle Eltern lenken wirklich ab. Es ist schwierig, darauf zurückzukommen, nachdem Sprachen wie Python verwendet wurden.

Vor kurzem habe ich F # erforscht. Es ist funktional, kann aber auch zwingend und objektorientiert sein, wenn Sie möchten. Dies ermöglicht neben der Verwendung beliebiger .NET-Bibliotheken das einfache Mischen Ihrer reinen Funktionsteile mit praktischeren Dingen wie GUIs, IO und Netzwerk). Sie können eine eigenständige Version von erhalten F #.

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

10
Erik

Ich habe vor ein oder zwei Jahren alle wichtigen funktionalen Sprachen bewertet, um eine praktische, universelle funktionale Programmiersprache zu wollen.

Am Ende habe ich Clojure ausgewählt, was sich später als ausgezeichnete 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. Wenn Sie sich in der JVM befinden, haben Sie einfachen Zugriff auf die größte Open Source-Bibliothek und das größte Tool-Ökosystem. Aus pragmatischer Sicht war es daher ein Kinderspiel, sich für eine JVM-Sprache zu entscheiden. Scala hat auch hier sehr gut abgeschnitten.

  • Makro-Metaprogrammierung - Dieser Aspekt von LISP hat mich immer angesprochen, 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 getroffen.

  • Leistung war "gut genug" - Clojure wird immer kompiliert und bietet die Vorteile des JVM JIT-Optimierers und der hervorragenden GC. Wie immer ist die Verwendung einer funktionalen Sprache mit einem gewissen Aufwand verbunden, aber mit Clojure war klar, dass Sie mit ein wenig Aufwand jeweils die Geschwindigkeit Java erreichen können (Clojure unterstützt Java Grundelemente und ist optional statische Eingabe für Situationen, in denen Sie sie benötigen). Ich schätze, dass Clojure 2-5x langsamer ist als das, was Sie mit optimiertem Java oder C++ - Code erreichen könnten, was mit dem übereinstimmt, was Sie in den fehlerhaften Benchmarks sehen , und mit der Zeit erwarte ich, dass sich diese Lücke weiter verringert. Außerdem ist es einfach genug, besonders leistungsempfindlichen Code in reinem Java zu schreiben und ihn von Clojure aus aufzurufen.

  • Parallelität - Clojure hat einen ziemlich einzigartigen und leistungsstarken Ansatz für die Parallelität, insbesondere für die Mehrkern-Parallelität. Es ist ein bisschen schwer zu erklären, aber dieses Video ist ausgezeichnet , um einen Vorgeschmack auf die Prinzipien zu geben. Ich denke, Clojure hat derzeit die beste Antwort auf die knifflige Frage "Wie sollten Sie den gemeinsamen, gleichzeitigen und veränderlichen Zustand in einer funktionierenden Programmiersprache verwalten?".

  • Sprachdesign - Clojure ist IMO ein sehr gut durchdachtes Sprachdesign. Beispiele sind Vektor [] - und Map {} -Literale zusätzlich zu den regulären LISP-Klammern, die Verwendung unveränderlicher persistenter Datenstrukturen, die Unterstützung der Faulheit in der gesamten Sprache über die Sequenzabstraktion und die Bereitstellung einer Vielzahl orthogonaler Funktionen für den Programmierer zur Lösung verschiedener Probleme . Siehe die Kunst der Abstraktion und einfach gemacht leicht .

  • 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 "Dinge erledigen", was möglicherweise die Tatsache widerspiegelt, dass viele Clojure-Leute (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 das Risiko eingehen würde, in einer "Nische" stecken zu bleiben.

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

  • Dynamische Typisierung - oft ist dies ein Vorteil in Bezug auf die Produktivität, aber im Durchschnitt würde ich dies gegen eine stärkere Typprüfung und Inferenz eintauschen. Meistens wird dies durch eine gute automatisierte Testsuite gemildert. Wenn Sie jedoch möchten, dass Ihre Typen vom Compiler statisch validiert werden, ist Haskell oder Scala möglicherweise eher Ihre Sache.

  • Cutting Edge - Clojure entwickelt sich sehr schnell und es gibt viele Innovationen - der Nachteil ist, dass es viele Experimente gibt, einige Bibliotheken Die Tools sind noch nicht ausgereift, und es gibt gelegentlich Änderungen zwischen den Hauptversionen von Clojure, die Sie im Auge behalten müssen.

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

9
mikera

Es sieht so aus, als hätten Sie Ihre Hausaufgaben gemacht, also wissen Sie das wahrscheinlich bereits, aber Scheme ist ein Dialekt von LISP, genau wie Common LISP. Wenn Sie viele Dinge an Scheme mögen, aber dessen akademischen Charakter nicht mögen, versuchen Sie es mit Common LISP. Laut TIOBE-Index ist es die 13. beliebteste Sprache im Vergleich zum Schema auf Position 26.

Einige der Sprachen, die Sie erwähnt haben, erscheinen in den Stellenbeschreibungen, die ich kürzlich gesehen habe, obwohl dies möglicherweise nur mein kleines Beispielset 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 Programmdesigns wertvoller als die direkte Vermarktbarkeit der Sprache selbst.

6
Zeke