Auswahl einer funktionalen Programmiersprache [geschlossen]

geschlossen. Diese Frage ist nicht zum Thema . Derzeit werden keine Antworten akzeptiert.

Kommentare

  • Was auch immer Sie wählen, schreiben Sie eine Menge Code, den Sie für etwas darin verwenden.
  • Didn ' Denken Sie nicht über Scala nach?
  • @ykombinator: Ich ' ve davon gehört, aber ich habe nicht weiter gesucht. Ich ' weiß nicht, ob es etwas zu den von mir aufgelisteten zu bieten hat, oder es würde eine Kombination interessanter Optionen aus jedem von ihnen bringen … Don ' weiß es nicht. Klingt für mich nach einer ziemlich unauffälligen Sprache, obwohl sie immer beliebter zu werden scheint.
  • Ich ' weiß nicht, wo Sie gehört haben, dass die Java-Welt " am Rande " – ' erlebt derzeit eine große Renaissance, vor allem danke a) OpenJDK wird zur Standardimplementierung b) neue JVM-Sprachen wie Scala und Clojure und c) die Tatsache, dass die Big Data / Cloud-Projekte zunehmen, wählen die JVM als Zielplattform und d) Android. Ab Anfang 2012 ist es ' wahrscheinlich die aufregendste Plattform auf …..
  • @mikera: Einverstanden. Dies ist über ein Jahr alt, kurz nachdem Oracle Sun Microsystems übernommen hatte, und es gab all die Sorgen und Spekulationen darüber, dass die Zukunft von Java von einem kontrollierenden Unternehmen kompromittiert werden könnte, das die Kontrolle übernimmt … Die JVM scheint im Moment zum Glück ziemlich sicher zu sein!

Antwort

Da Sie eine praktische   Sprache:

Alternativtext

Beachten Sie, dass Haskell und Lisp in der Industrie häufiger verwendet werden als die anderen, obwohl dort vorhanden In letzter Zeit gab es einige Interessen an Clojure und F #.

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

alt text

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

Eigentlich ist das obige Diagramm wahrscheinlich eine Lüge; das Wort „Schema“ kann in der Hilfe erscheinen wollte Anzeigen in anderen Kontexten als Programmiersprachen. 🙂

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

Alternativtext

Wenn Sie einen wirklich umwerfenden Dialekt des Schemas erkunden möchten, schauen Sie sich Schläger.

Kommentare

  • Wow, schöner Beitrag. Schläger ist genau das, was ich ' benutze … PLT-Schema war sein 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 verwendet werden könnte. Und Clojure scheint sicher abzuheben. Hmm …
  • @M. Joanis: Nehmen Sie die letzten beiden Diagramme mit einem Körnchen Salz; Der Treppenblick und die Volatilität des letzten Diagramms deuten darauf hin, 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, was vom zweiten zum dritten Diagramm geändert?
  • @Geoffrey: Sehen Sie sich die Bildunterschriften an. Ich habe das Wort " Entwickler " zu den Suchbegriffen hinzugefügt.
  • Beachten Sie, dass Haskell und Lisp auch Homonyme und sind dass die Daten von ' nicht auf den Rest der Welt übertragen werden. ITJobsWatch listet 79 Scala-Jobs, 55 F # -, 47 Haskell-, 30 Lisp- und 7 Clojure-Jobs auf.

Antwort

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 lernen, sie ermöglichen jedoch weiterhin zwingenden 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.

Nach dem Schreiben Ihres Haskell-Programms verfügen Sie über Tools wie Monaden und Techniken wie punktfreie Codierung, um sie in die Sprache Ihrer Wahl zu bringen. Die Konzepte scheinen besonders gut auf das Schema abzustimmen.

Kommentare

  • Ich denke, Sie ' hat Recht, zuerst eine reine funktionale Sprache auszuwählen. Ich wäre sehr daran interessiert, eine Reihenfolge der funktionalen Sprachen nach Reinheit zu sehen.
  • @M. Joanis: of Bei den in Ihrer Frage aufgeführten Sprachen würde ich sagen, dass Haskell die reinste ist, gefolgt von Clojure, F # und Lisp.

Antwort

Wenn Sie tatsächlich ein einigermaßen komplexes System in Schema implementieren könnten, wären Sie es ziemlich wünschenswert in Unternehmen, in denen Sie wahrscheinlich arbeiten möchten. 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 habe Kandidaten immer solche Fragen in ihrer bevorzugten Sprache beantworten lassen. 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. Als würde man ein Element zu einer verknüpften Liste hinzufügen, was mich verwirrte.

Aber wenn Sie das Schema gut genug „bekommen“ könnten, um selbst eine durchschnittliche Web-App zu schreiben, wäre das höchstens ein ziemlich gutes Verkaufsargument seriöse Softwareunternehmen.

Wenn Sie in einem „blub“ -Laden interviewen würden und die Entwickler aufgrund Ihrer Kenntnisse in Scheme oder Haskell oder F # nur dachten, Sie wären komisch, würden Sie wahrscheinlich nicht dort arbeiten wollen. In den meisten Fällen haben kompetente Entwickler die Wahl zwischen Auftritten. Schwitzen Sie also nicht an der Praktikabilität, es sei denn, die einzigen Optionen, die Sie sich in Ihrer Zukunft vorstellen können, sind Unternehmen. Arbeiten Sie daran, kompetent, flexibel und problematisch zu sein.

m 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 tue ich das nicht. “ Ich verstehe nicht, warum Sie sich so schnell auf eine dieser Optionen beschränken möchten. Sie könnten in etwa vier 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. Dann Kehren Sie 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 erneut. Das Experimentieren ist gut. Wenn Sie nicht versuchen, nächsten Monat Ihren Lebensunterhalt zu verdienen, müssen Sie dies nicht tun Werden Sie noch Spezialist.

Ich habe einige in Scheme, F #, Emacs Lisp und Common Lisp geschrieben und zumindest gelegentlich in den letzten Jahren mindestens 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.

Kommentare

  • " Neugier Sie werden eine dauerhaftere und erfüllendere Karriere als alles andere aufbauen. " Diese Aussage ist sehr inspirierend. Sie ' haben Recht. Ich ' bin zu eilig. Ich habe immer das Gefühl, dass das Lernen zu viel Zeit in Anspruch nehmen wird … Wenn ich 12 Jahre zurückgehen könnte, als ich anfing, würde ich ' wissen, dass ich nicht alles verschwenden soll Zeit auf VB und C ++. Ich habe das Gefühl, dass diese Jahre ziemlich verschwendet waren. Ich war nicht ' nicht neugierig genug. Ich wollte Sachen codieren. Es war genug, die Sprachen zu benutzen, die ich kannte. Ich dachte damals, dass ich eine ganze Menge wüsste, aber das war so schrecklich, dass ' überhaupt nicht der Fall war.

Antwort

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 kaum kompetent zu sein, also ging ich weiter

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

Vor kurzem habe ich Ich habe F # untersucht. 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, E / A und Netzwerk. Sie können eine eigenständige Version von F # erhalten.

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

Kommentare

  • Die Tatsache, dass F # und Clojure nicht rein funktional sind, spielt eine wichtige Rolle für sie. Vielleicht könnte F # mein Einstiegspunkt in die sein .Net Familie eines Tages …
  • @MJoanis, Sie haben die Kosten als Punkt gegen F # angegeben, aber wie Erik betont, können Sie sie völlig kostenlos erhalten.
  • Wenn ich die Bedingungen richtig lese, erhalten Sie sie grundsätzlich kostenlos unter der Bedingung es nicht zu benutzen (oder Lizenzen zu kaufen). Aber ich verstehe, dass es immer noch sehr gut sein kann, etwas zu lernen, wenn ich mit Visual Studio in einem Unternehmen lande.Ich ' werde es wahrscheinlich versuchen, sobald ich ' mit einer frei funktionierenden Programmiersprache funktionsfähig bin.
  • @M. Joanis: Nein, F # ist sogar Open Source und Sie können versuchen, Mono auf anderen Plattformen zu verwenden.
  • Vielleicht haben sich die Zeiten seit 2010 geändert, aber als jemand, der in den letzten Monaten angefangen hat, Haskell zu lernen, habe ich ' denke nicht, dass es überhaupt schwierig ist, E / A in Haskell auszuführen. Für grundlegende Dinge müssen Sie nur eine neue Do-Syntax lernen. Das Erreichen des grundlegenden Verständnisses dauert einige Wochen, aber ich sehe ' wirklich nicht, worum es bei Monaden geht. Ich glaube nicht, dass sie schwerer zu lernen waren als Klassen, Instanzen, statische Mitglieder und all der andere zustandsbezogene Jazz in OOP.

Antwort

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 zu guten 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 erzielten hier alle starke Ergebnisse.

  • 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 die Java-Geschwindigkeit erreichen können (Clojure unterstützt Java-Grundelemente und optionale statische Typisierung 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 „etwas 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 Status in einer funktionalen 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 Merkmale für den Programmierer, um verschiedene Probleme zu lösen . 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 auf „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 Eingabe – oft ist dies ein Vorteil in Bezug auf die Produktivität, aber im Durchschnitt denke ich, dass ich dies gegen eine stärkere Typprüfung und Inferenz eintauschen würde. Meistens wird dies durch eine gute automatisierte Testsuite gemildert. Wenn Sie jedoch möchten, dass Ihre Typen vom Compiler statisch validiert werden, sind Haskell oder Scala möglicherweise eher Ihre Sache.

  • Schneide – Clojure entwickelt sich sehr schnell und da „sa Es gibt viele Innovationen – der Nachteil dabei ist, dass viel experimentiert wird, einige Bibliotheken und Tools noch nicht ausgereift sind und es gelegentlich zu Änderungen zwischen den Hauptversionen von Clojure kommt, 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 Funktionssprache wollen!

Kommentare

  • Danke! Guter Eintrag! Ich habe heutzutage nur darüber nachgedacht, es für ein unternehmensinternes 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.

Antwort

Es Sieht so aus, als hätten Sie Ihre Hausaufgaben gemacht, also wissen Sie das wahrscheinlich schon, aber Schema ist ein Dialekt von Lisp, genau wie Common Lisp. Wenn Sie viele Dinge an Schema mögen, aber seine akademische Natur nicht mögen, versuchen Sie es mit Common Lispeln. Laut dem TIOBE-Index ist es die 13. beliebteste Sprache im Vergleich zum Schema auf Position 26.

Nur wenige der Sprachen, die Sie haben Die genannten Stellenbeschreibungen erscheinen in den Stellenbeschreibungen, die ich kürzlich gesehen habe, obwohl dies möglicherweise nur meine kleine Stichprobe ist. Ich persönlich werde Haskell lernen, obwohl ich nicht erwarte, diese Sprache direkt in meinem Beruf zu verwenden. Die Konzepte der funktionalen Programmierung sind für zukünftige Programmdesigns für mich wertvoller als die direkte Vermarktbarkeit der Sprache selbst.

Kommentare

  • Vielen Dank für die TIOBE Link, das ist eine interessante Referenz. Ich denke, Sie wählen Haskell wegen seiner Reinheit in Bezug auf die funktionale Programmierung?
  • @ M.Joanis: Ziemlich genau, obwohl ich ' daran denke, es später aufzunehmen Lisp auch. Siehe programmers.stackexchange.com/questions/18838/…
  • Die gewählte Antwort ergibt viel Sinn. Reinheit scheint der richtige Weg zu sein, bis ich das ganze funktionale Paradigma wirklich verstanden habe.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.