Frage

Ich habe in letzter Zeit viele Themen über funktionale Programmiersprachen gelesen (fast im vergangenen Jahr). Ich möchte wirklich eine auswählen und es gründlich lernen.

Letzte [Kurs] Semester wurde ich in das Programm eingeführt. Ich liebte es. Liebte die extreme Einfachheit der Syntax, die Homoikonizität Prinzip, die Makros (hygienisch und nicht-hygienisch), die N-Arity von Verfahren usw.

Das Problem mit dem Schema ist eine akademische Sprache. Ich glaube nicht, dass es in Produktionsumgebungen wirklich verwendet wird. Ich glaube auch nicht, dass es besonders gut ist, unseren Lebenslauf zu haben. Also habe ich mich nach Alternativen umgesehen. Es gibt viele von ihnen und sie scheinen irgendwie eine ähnliche Beliebtheit zu haben.

Einige Gedanken über einige andere funktionale 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 ist die Java -Welt momentan nicht die Java -Welt? Ich kenne Java schon ziemlich gut, aber wäre es ratsam, je nach 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 für immer. Es scheint das meiste zu haben, was mir aus dem Schema gefällt. Es hat eine große Gemeinschaft. Für das, was ich [denke], ist es wahrscheinlich die am weitesten verbreitete funktionelle Programmiersprache in der Industrie (?).
  • F#: Es hat es nicht wirklich nachgedacht. Ich bin kein großer Fan von MS -Sachen. Ich habe nicht das Geld, um ihre Software zu bezahlen (ich könnte sie frei von Universitätsbündeln haben, aber ich bin eher geneigt, mit gemeindenahen Lösungen zu gehen). Obwohl ... ich denke, es wäre die beste karriereorientierte Wahl.

Heute Abend lehne ich mich in Richtung Lisp. Vor einer Woche war es Haskell. Davor war es Clojure. Im vergangenen Jahr habe ich ein Schema zum Spaß gemacht und es nicht vorangetrieben, weil Sie es wissen. Jetzt möchte ich ernst werden (über das Erlernen eines, darüber, echte Projekte damit zu machen, vielleicht, vielleicht professionell damit zu arbeiten). Mein Problem ist, dass ich sie alle ausführlich lernen müsste, bevor ich eine auswählen kann.

War es hilfreich?

Lösung

Da willst du a praktisch Sprache:

alt text

Beachten Sie, dass Haskell und Lisp mehr als die anderen in der Industrie verwendet werden, obwohl in jüngster 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 eine akademische Sprache nicht so sehr aus, oder?

Eigentlich ist die obige Grafik wahrscheinlich eine Lüge; Das Wort "Schema" kann neben Programmiersprachen in Help Wut -Anzeigen in anderen Kontexten erscheinen. :)

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

alt text

Wenn Sie einen wirklich Kick-Ass-Dialekt des Schemas erkunden möchten, schauen Sie sich einen Blick auf Schläger.

Andere Tipps

Wenn Sie funktionale Programmierung lernen möchten, können Sie zuerst besser Haskell lernen, und verwenden Sie dann die gewünschte Sprache. Sie können funktionale Programmierung mithilfe der anderen Sprachen lernen, ermöglichen jedoch immer noch einen imperativen und objektorientierten Code. Wenn Sie ein echtes Programm in Haskell schreiben, lernen Sie die funktionale Programmierung schneller kennen, da die anderen Paradigmen nicht zur Verfügung stehen, um zurückzukehren.

Nachdem Sie Ihr Haskell-Programm geschrieben haben, verfügen Sie über Tools wie Monaden und Techniken wie punktfreie Codierung, die Sie in die Sprache Ihrer Wahl bringen können. Die Konzepte scheinen besonders gut dem Schema zu kartieren.

Wenn Sie in der Lage wären, ein einigermaßen komplexes System im Schema 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 eine Menge Arbeit im Programm geleistet hatten, und es war nur 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 einer angemessenen Zeit. Ich lasse Kandidaten immer in ihrer bevorzugten Sprache solche Fragen beantworten. Ich bin auf einige Leute gestoßen, die dachten, dass sie am besten in Schema sind, die es geschafft haben, einiges mit Dingen zu kämpfen, die einfach sein sollten, wie ein Element zu einer verknüpften Liste, die mich mystifizierte.

Wenn Sie jedoch in der Lage wären, das Schema gut genug zu machen, um selbst eine durchschnittliche Web -App zu schreiben, wäre dies bei den ernsthaften Softwareunternehmen ein ziemlich gutes Verkaufsargument.

Wenn Sie in einem "Blub" -D -Laden interviewt würden und die Entwickler nur dachten, Sie wären wegen Ihrer Fähigkeiten in Schema, Haskell oder F#seltsam, möchten Sie dort wahrscheinlich nicht arbeiten. In den meisten Fällen erhalten kompetente Entwickler ihre Auswahl an Auftritten. Schwitzen Sie also nicht "praktisch", es sei denn, die einzigen Optionen, die Sie sich in Ihrer Zukunft vorstellen können, sind Unternehmen. Arbeiten Sie daran, kompetent, flexibel zu sein und Probleme abzubauen.

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

Davon abgesehen verstehe ich nicht, warum Sie so bald auf eine dieser Entscheidungen einschränken möchten. Sie könnten in etwa 4 Wochen leicht ein Gefühl für alle vier Sprachen bekommen und sich dann auf diese aussuchen, um sich mit Ihren aktuellen Launen auf diese Netze zu konzentrieren. Gehen Sie dann zu einem anderen Ihrer Optionen zurück und versuchen Sie, etwas Ähnliches zu implementieren. Übergehen Sie zu etwas Komplexerem und berücksichtigen Sie Ihre Optionen erneut. 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 Schema, F#, EMACS Lisp und Common Lisp geschrieben und zumindest gelegentlich in den letzten Jahren zumindest 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 all den anderen Sprachen zugute gekommen, in denen ich professionell arbeite (C#, Java, Ruby und gelegentlich Boo, Perl und Python). Neugier wird Ihnen eine anhaltendere, erfüllende Karriere aufbauen als alles andere.

Ich tauchte eine Weile in Haskell ein, aber die Schlussfolgerung, zu der ich gekommen bin, war, dass es ein bisschen 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 müssen Sie sich mit Monaden auseinandersetzen. Ich stellte fest, dass ich eine enorme Zeit investieren müsste, um gerade kaum kompetent zu sein, also ging ich weiter.

Ich habe im College Schema gemacht. Könnte trivial klingen, aber alle Parens sind wirklich ablenkend/nervig. Es ist schwer, darauf zurückzukehren, nachdem sie Sprachen wie Python verwendet hat.

Vor kurzem habe ich F#erforscht. Es ist funktional, kann aber auch unerlässlich und objektorientiert sein, wenn Sie möchten. Dies ermöglicht es, sowie mit den .NET -Bibliotheken in der Lage zu sein, Ihre reinen funktionalen Teile einfach mit praktischeren Dingen wie GUIs, IO und Networking zu mischen. 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

Ich habe alle wichtigen funktionalen Sprachen ein oder zwei Jahre zurück bewertet, aus Sicht, eine praktische, allgemeine funktionale Programmiersprache zu wünschen.

Am Ende habe ich gepflückt Clojure, was sich anschließend 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 auf dem JVM sind, haben Sie einen einfachen Zugriff auf das größte Open-Source-Bibliothek und das Tool-Ökosystem. Daher war es ein Kinderspiel aus pragmatischer Sicht. Scala erzielte auch hier hoch.

  • Makro-Metaprogrammierung - Dieser Aspekt von Lisp hat mich immer angesprochen, zumal ich erwartet hatte, dass ich eine ziemliche Codegenerierung tue. Ich habe die Argumente in Paul Grahams kurzem Aufsatz sehr geschätzt. "Die Durchschnittswerte schlagen"Die verschiedenen LISPs haben hier alle stark gewertet.

  • Leistung War "gut genug" - Clojure wird immer zusammengestellt und nutzt die Vorteile des JVM JIT -Optimierers und der exzellenten GC. Wie immer gibt es einen Aufwand bei der Verwendung einer funktionalen Sprache, aber mit Clojure war klar, dass Sie mit ein wenig Anstrengung jeden Java -Geschwindigkeit nahe kommen können (Clojure unterstützt Java -Primitive und optionales statisches Tippen für die Situationen, in denen Sie es benötigen). Meine Schätzung ist, dass Clojure den Ballpark 2-5x langsamer ist als das, was Sie mit optimiertem Java- oder C ++-Code erreichen können, was mit dem übereinstimmt, was Sie in der sehen fehlerhafte Benchmarks, und im Laufe der Zeit erwarte ich, dass sich diese Lücke weiter verengt. Außerdem ist es einfach genug, einen besonders leistungsempfindlichen Code in Pure Java zu schreiben und ihn von Clojure zu nennen.

  • Parallelität - Clojure hat einen ziemlich einzigartigen und leistungsfähigen Ansatz für die Parallelität, insbesondere für hochkarätige Parallelität. Es ist ein bisschen schwer zu erklären, aber Dieses Video ist ausgezeichnet einen Vorgeschmack auf die Prinzipien geben. Ich denke, Clojure hat derzeit die beste Antwort auf die schwierige Frage: "Wie sollten Sie gemeinsame, gleichzeitige und veränderliche Zustand in einer funktionalen Programmiersprache verwalten?".

  • Sprachdesign - Clojure ist ein sehr gut durchdachtes Sprachdesign. Beispiele sind zusätzlich zu den regulären Lisp -Klammern Vektor [] und MAP {} Literale, die Verwendung unveränderlicher persistierter Datenstrukturen, die Unterstützung von Faulheit in der gesamten Sprache über die Sequenzabstraktion und die Bereitstellung einer Vielzahl von orthogonalen Merkmalen, um unterschiedliche Probleme zu lösen . Sehen Die Kunst der Abstraktion und Einfach gemacht gemacht.

  • Gemeinschaft - Immer subjektiv, aber ich mochte, was ich in der Clojure -Community gesehen habe. Die Haltung war sehr hilfreich, konstruktiv und pragmatisch. Es gibt einen starken Schwerpunkt "Get Dinge", was möglicherweise die Tatsache widerspiegelt, dass viele Clojure -Leute (einschließlich reichhaltiger Hickey selbst) aus einem 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" zu stecken.

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

  • Dynamisches Typing - Oft ist dies ein Vorteil in Bezug auf die Produktivität, aber im Durchschnitt denke ich, dass ich dies gegen eine stärkere Überprüfung und Schlussfolgerung eintauschen würde. Meistens wird dies durch eine gute automatisierte Testsuite gemildert. Wenn Sie jedoch Ihre vom Compiler statisch validierten Typen mögen, ist Haskell oder Scala möglicherweise mehr Ihre Tasse Tee.

  • Innovativ, auf dem neuesten Stand - Clojure entwickelt sich sehr schnell und es gibt viel Innovation - der Nachteil davon ist, dass es viele Experimente gibt, einige Bibliotheken und Werkzeuge immer noch unreif sind und gelegentlich Veränderungen zwischen Clojure -Hauptversionen sind, die Sie brauchen habe ein Auge auf.

Insgesamt glaube ich nicht, dass Sie mit Clojure falsch machen können, wenn Sie eine ausgezeichnete und pragmatische moderne funktionale Sprache wünschen!

Es sieht so aus, als hätten Sie Ihre Hausaufgaben gemacht, also wissen Sie das wahrscheinlich schon, aber Schema ist ein LISP -Dialekt, genau wie das Common Lisp ist. Wenn Sie viele Dinge über das Schema mögen, aber ihre akademische Natur nicht mögen, versuchen Sie es mit Common Lisp. Laut dem Tiobe Index, Es ist die 13. beliebteste Sprache gegen Schema an Position 26.

Nur wenige der Sprachen, die Sie erwähnt haben, erscheinen in den Jobbeschreibungen, die ich in letzter Zeit gesehen habe, obwohl dies möglicherweise mein kleines Beispielset ist. Ich persönlich werde Haskell lernen, obwohl ich diese Sprache nicht direkt in meinem Job verwenden möchte. Die Konzepte der funktionalen Programmierung sind für zukünftige Programmdesigns für mich wertvoller als die direkte Marktfähigkeit der Sprache selbst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
scroll top