Wybór funkcjonalnego języka programowania [zamknięty]

48

Ostatnio czytałem wiele wątków na temat funkcjonalnych języków programowania (prawie w ubiegłym roku). Naprawdę chciałbym wybrać jedną i dokładnie się jej nauczyć.

W ostatnim [kursie] semestrze zapoznałem się ze schematem. Kocham to. Uwielbiałem ekstremalną prostotę składni, zasadę homoikoniczności , makra ( higieniczne i niehigieniczne), n-arność procedur itp.

Problem ze schematem polega na tym, że jest to język akademicki. Nie sądzę, że jest tak naprawdę używany w środowiskach produkcyjnych. Nie wierzę też, że szczególnie dobrze jest mieć w naszym CV. Rozglądałem się za alternatywami. Jest ich wiele i wszystkie wydają się mieć podobny poziom popularności.

Kilka przemyśleń na temat innych języków funkcjonalnych, które rozważałem:

  • Clojure: Brzmi świetnie, ponieważ może uzyskać dostęp do świata Java, jest zorientowany na skalowalność i współbieżność, ale czy świat Java nie jest teraz na krawędzi? Znam już całkiem dobrze Javę, ale czy byłoby mądrzej dodać jeszcze więcej energii w zależności od JVM?
  • Haskell: Wygląda na bardzo doceniany język, ale z tego, co przeczytałem, jest to również język akademicki.
  • Lisp: Istnieje od zawsze. Wygląda na to, że ma większość tego, co lubię ze Scheme. Ma dużą społeczność. Z tego, co [myślę, że wiem], jest to prawdopodobnie najczęściej używany funkcjonalny język programowania w przemyśle (?).
  • F #: Naprawdę tego nie rozważałem. Nie jestem wielkim fanem stwardnienia rozsianego. Nie mam pieniędzy, aby zapłacić za ich oprogramowanie (mógłbym uwolnić je od sojuszy uniwersyteckich, ale jestem bardziej skłonny do korzystania z rozwiązań opartych na społeczności). Chociaż ... Myślę, że byłby to najlepszy wybór zorientowany na karierę.

Dzisiaj pochylam się w kierunku Lispa. Tydzień temu był to Haskell. Wcześniej była to Clojure. W ubiegłym roku robiłem trochę Schematu dla zabawy, nie pchając go z tego powodu, o którym wiesz. Teraz chciałbym poważnie potraktować (nauczyć się jednego, robić z nim prawdziwe projekty, być może w końcu profesjonalnie z nim pracować). Mój problem polega na tym, że musiałbym nauczyć się ich wszystkich dogłębnie, zanim będę mógł wybrać jeden.

Joanis
źródło
5
Cokolwiek wybierzesz, napisz dużo kodu, którego używasz do czegoś.
8
Nie zastanawiałeś się nad Scalą ?
ykombinator
@ykombinator: Słyszałem o tym, ale nie szukałem dalej. Nie wiem, czy miałoby coś do zaoferowania w stosunku do tych, które wymieniłem, a może przyniosłoby kombinację ciekawych opcji z każdej z nich ... Nie wiem. Brzmi dla mnie jak dość niski profil, choć wydaje się, że zyskuje na popularności.
Joanis,
1
Nie wiem, gdzie słyszałeś, że świat Java jest „na krawędzi” - obecnie przechodzi wielki renesans, głównie dzięki a) OpenJDK staje się standardową implementacją b) nowych języków JVM, takich jak Scala i Clojure oraz c) fakt, że projekty Big Data / Cloud coraz częściej wybierają JVM jako platformę docelową oraz d) Android. Na początku 2012 roku jest to prawdopodobnie najbardziej ekscytująca platforma na .....
mikera
1
@mikera: Uzgodniony. Ma to ponad rok, tuż po przejęciu firmy Sun Microsystems przez Oracle. Było wiele niepokoju i spekulacji na temat przyszłości Java, która została naruszona przez bardziej kontrolującą korporację przejmującą kontrolę ... JVM wydaje się w tej chwili dość bezpieczny, na szczęście!
Joanis

Odpowiedzi:

35

Ponieważ chcesz praktycznego  języka:

alternatywny tekst

Zauważ, że Haskell i Lisp są częściej używane w przemyśle, chociaż ostatnio pojawiło się zainteresowanie Clojure i F #.

Ale spójrz, co się stanie, gdy dodamy Scheme do miksu:

alternatywny tekst

Hmm, nie wygląda teraz tak bardzo na język akademicki, prawda?

W rzeczywistości powyższy wykres jest prawdopodobnie kłamstwem; słowo „schemat” może pojawić się w potrzebnych reklamach w innych kontekstach oprócz języków programowania. :)

Oto kolejny wykres, który jest prawdopodobnie (trochę) bardziej reprezentatywny:

alternatywny tekst

Jeśli chcesz poznać naprawdę odważny dialekt Schematu, spójrz na Rakieta.

Robert Harvey
źródło
Wow, niezły post. Rakieta jest dokładnie tym, czego używam ... Schemat PLT był jej nazwą, kiedy zacząłem się jej uczyć. Martwi mnie ta czerwona linia na ostatniej grafice. Nigdy nie myślałem, że Scheme można tak często wykorzystać. I Clojure z pewnością zdaje się startować. Hmm ...
Joanis,
@M. Joanis: Zrób dwa ostatnie wykresy ziarenkiem soli; wygląd schodów i zmienność ostatniego wykresu sugerują, że na wykresie nie ma wielu punktów danych, chociaż wskazuje to, że ktoś uważa, że ​​za języki warto zapłacić.
Robert Harvey
@Robert Harvey, co zmieniło się z drugiego na trzeci wykres?
systemovich,
@Geoffrey: Spójrz na podpisy; Do wyszukiwanych haseł dodałem słowo „programista”.
Robert Harvey,
Należy pamiętać, że Haskell i Lisp są również homonimami, a dane Indeed nie uogólniają się na resztę świata. ITJobsWatch wymienia 79 zadań Scala, 55 F #, 47 Haskell, 30 Lisp i 7 Clojure.
Jon Harrop,
17

Jeśli chcesz nauczyć się programowania funkcjonalnego, lepiej najpierw naucz się języka Haskell, a następnie użyj dowolnego języka. Możesz nauczyć się programowania funkcjonalnego przy użyciu innych języków, ale nadal pozwalają one na kod imperatywny i obiektowy. Jeśli napiszesz prawdziwy program w Haskell, nauczysz się programowania funkcjonalnego szybciej, ponieważ inne paradygmaty nie będą dostępne.

Po napisaniu programu Haskell będziesz mieć narzędzia takie jak monady i techniki, takie jak kodowanie bezcelowe, aby wprowadzić wybrany język. Koncepcje wydają się szczególnie dobrze odwzorowywać w Scheme.

Larry Coleman
źródło
Myślę, że masz rację, wybierając najpierw funkcjonalny język. Byłbym bardzo zainteresowany widząc porządek języków funkcjonalnych według czystości.
Joanis,
@M. Joanis: spośród języków wymienionych w twoim pytaniu powiedziałbym, że Haskell jest najczystszy, a za nim Clojure, F # i Lisp.
Larry Coleman,
15

W rzeczywistości, jeśli byłbyś w stanie wdrożyć dość skomplikowany system w Scheme, byłbyś dość pożądany w firmach, w których prawdopodobnie chciałbyś pracować. Na początku mojej kariery spotkałem studentów, którzy wykonali sporo pracy w programie, a jedyną wadą było to, że nie byli w stanie wyjaśnić swojej pracy lub nie rozumieli jej wystarczająco dobrze, aby wdrożyć podstawowe dane struktury i algorytmy w rozsądnym czasie. Zawsze pozwalam kandydatom odpowiadać na takie pytania w preferowanym języku; Natknąłem się na ludzi, którzy myśleli, że są najlepsi w Scheme, którym udało się dość mocno zmagać z rzeczami, które powinny być łatwe, jak dodawanie elementu do połączonej listy, co mnie zaskoczyło.

Ale gdybyś był w stanie „uzyskać” program wystarczająco dobry, aby napisać nawet przeciętną aplikację internetową, byłby to całkiem dobry punkt sprzedaży dla większości poważnych firm programistycznych.

Jeśli przeprowadzałeś wywiad w sklepie „blub”, a programiści myśleli, że jesteś dziwny z powodu swojej biegłości w Scheme, Haskell lub F #, prawdopodobnie nie chciałbyś tam pracować. W większości przypadków kompetentni programiści wybierają koncerty, więc nie przejmuj się „praktycznością”, chyba że jedynymi opcjami, jakie możesz sobie wyobrazić w przyszłości, są korporacyjne. Pracuj nad byciem kompetentnym, elastycznym i rozwiązywaniem problemów.

W college'u nie chodzi o praktyczność. Chodzi o stworzenie bezpiecznego środowiska do eksploracji i nauki. Jest to w rzeczywistości przydatne, nawet jeśli skończysz pisać zwykłe oprogramowanie do końca swojej kariery.

Biorąc to pod uwagę, nie rozumiem, dlaczego tak szybko chcesz ograniczyć się do jednej z tych opcji. Możesz łatwo zrozumieć wszystkie cztery języki w ciągu około 4 tygodni, a następnie wybrać jeden, aby skoncentrować się na tych siatkach, które najlepiej pasują do twoich obecnych zachcianek. Następnie wróć do innej opcji i spróbuj zastosować coś podobnego. Przejdź do czegoś bardziej złożonego i ponownie rozważ opcje. Eksperymentowanie jest dobre. Jeśli nie będziesz zarabiał na życie w przyszłym miesiącu, nie musisz jeszcze zostać specjalistą.

Napisałem trochę w Scheme, F #, Emacs Lisp i Common Lisp, i czytałem przynajmniej trochę Haskell, przynajmniej od czasu do czasu w ciągu ostatnich kilku lat. Nie mogę powiedzieć, że jestem ekspertem w każdym z nich, ale każda wycieczka na te języki przyniosła mi korzyści we wszystkich innych językach, w których pracuję zawodowo (C #, Java, Ruby, a czasami Boo, Perl i Python). Ciekawość zbuduje ci bardziej trwałą, satysfakcjonującą karierę niż cokolwiek innego.

JasonTrue
źródło
2
„Ciekawość zbuduje ci bardziej trwałą, satysfakcjonującą karierę niż cokolwiek innego.” To stwierdzenie jest bardzo inspirujące. Masz rację. Jestem zbyt spieszony. Zawsze mam wrażenie, że nauka zajmie zbyt wiele czasu ... Gdybym mógł cofnąć się o 12 lat, kiedy zacząłem, wiedziałbym, żeby nie marnować całego mojego czasu na VB i C ++. Czuję, że te lata były bardzo źle zmarnowane. Nie byłem wystarczająco ciekawy. Chciałem zakodować różne rzeczy. Wystarczyło użyć języków, które znałem. Myślałem wtedy, że znam sporo, ale tak okropnie wcale tak nie było.
Joanis,
10

Wpadłem na chwilę do Haskell, ale doszedłem do wniosku, że było to trochę zbyt akademickie. Bardzo trudno było zrobić coś praktycznego. W czysto funkcjonalnym języku rzeczy takie jak IO po prostu nie pasują do modelu, więc musisz radzić sobie z monadami. Zdecydowałem, że będę musiał poświęcić ogromną ilość czasu, by być ledwo kompetentnym, więc ruszyłem dalej.

Zrobiłem Scheme na studiach. Może brzmi to trywialnie, ale wszystkie pareny naprawdę rozpraszają / denerwują. Trudno wrócić do tego po użyciu języków takich jak Python.

Ostatnio badam F #. Jest funkcjonalny, ale może być również konieczny i zorientowany obiektowo, kiedy chcesz. To, wraz z możliwością korzystania z dowolnych bibliotek .NET, umożliwia łatwe mieszanie czysto funkcjonalnych części z bardziej praktycznymi rzeczami, takimi jak GUI, IO i praca w sieci. Możesz uzyskać samodzielną wersję F #.

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

Erik
źródło
Fakt, że F # i Clojure nie są czysto funkcjonalne, odgrywa ważną rolę na ich korzyść. Może kiedyś F # może być moim punktem wejścia w rodzinie .Net ...
Joanis,
1
@Mojois, podałeś koszt jako punkt przeciwko F #, ale jak zauważa Erik, możesz uzyskać go całkowicie za darmo.
Benjol,
Jeśli dobrze przeczytam warunki, w zasadzie otrzymasz je za darmo pod warunkiem, że go nie użyjesz (lub nie kupisz licencji). Ale rozumiem, że nadal warto uczyć się na wypadek, gdy skończę w firmie korzystającej z Visual Studio. Prawdopodobnie spróbuję, kiedy będę funkcjonować z bardziej wolnym funkcjonalnym językiem programowania.
Joanis,
1
@M. Joanis: Nie, F # jest nawet open source i możesz spróbować uruchomić Mono na innych platformach.
Jon Harrop,
Może czasy się zmieniły od 2010 roku, ale ponieważ ktoś, kto zaczął uczyć się haskell w ciągu ostatnich kilku miesięcy, nie sądzę, aby wykonywanie IO w haskell było w ogóle trudne. Aby uzyskać podstawowe informacje, musisz tylko nauczyć się nowej składni do. ​​Uzyskanie prawdziwego fundamentalnego zrozumienia zajmuje kilka tygodni, ale tak naprawdę nie rozumiem, o co chodzi z monadami. Nie sądzę, by trudniej ich było się uczyć niż klasy, instancje, członkowie statyczni i wszystkie inne związane z państwem jazz w OOP.
sara
9

Oceniłem wszystkie główne języki funkcjonalne rok lub dwa lata temu, z perspektywy poszukiwania praktycznego, funkcjonalnego języka programowania ogólnego przeznaczenia.

Ostatecznie wybrałem Clojure , który okazał się doskonałym wyborem.

Ogólnie rzecz biorąc, głównymi przyczynami były:

  • Ekosystem bibliotek - aby język był użyteczny, potrzebujesz dostępu do dobrych bibliotek. Bycie na JVM oznacza, że ​​masz łatwy dostęp do największej biblioteki open source i ekosystemu narzędzi, więc wybór języka JVM nie był łatwym zadaniem z pragmatycznego punktu widzenia. Scala również wysoko tu zdobył.

  • Makropaprogramowanie - Ten aspekt Lisp zawsze mi się podobał, zwłaszcza, że ​​spodziewałem się sporo wygenerowania kodu. Bardzo doceniam argumenty zawarte w krótkim eseju Paula Grahama „ Beating The Averages ”. Poszczególne Lisps mocno zdobyły tutaj punkty.

  • Wydajność była „wystarczająco dobra” - Clojure jest zawsze kompilowany i czerpie korzyści z optymalizatora JVM JIT i doskonałej GC. Jak zawsze, używanie języka funkcjonalnego wiąże się z pewnymi narzutami, ale dzięki Clojure stało się jasne, że każdy z nich może trochę przyśpieszyć Java (Clojure obsługuje prymitywy Java i opcjonalne pisanie statyczne w sytuacjach, gdy jest to potrzebne). Szacuję, że Clojure jest ballpark 2-5x wolniejszy niż to, co można osiągnąć dzięki zoptymalizowanemu kodowi Java lub C ++, co jest spójne z tym, co widać w wadliwych testach porównawczych , i z czasem spodziewam się, że ta luka się zmniejszy. Ponadto wystarczy napisać kod szczególnie wrażliwy na wydajność w czystej Javie i wywołać go z Clojure.

  • Współbieżność - Clojure ma dość unikalne i potężne podejście do współbieżności, szczególnie w przypadku współbieżności wielordzeniowej. Trochę trudno to wytłumaczyć, ale ten film jest świetny, aby poznać zasady. Myślę, że Clojure ma obecnie najlepszą odpowiedź na trudne pytanie „jak zarządzać stanem współdzielonym, współbieżnym i zmiennym w funkcjonalnym języku programowania?”.

  • Projekt językowy - Clojure to IMO bardzo dobrze przemyślany projekt językowy. Przykładami są literały wektor [] i mapa {} oprócz zwykłych nawiasów Lisp, użycie niezmiennych trwałych struktur danych, wspieranie lenistwa w całym języku poprzez abstrakcję sekwencji oraz zapewnienie programiście różnych funkcji ortogonalnych w celu rozwiązania różnych problemów . Zobacz sztukę abstrakcji i proste proste .

  • Społeczność - zawsze subiektywna, ale podobało mi się to, co widziałem w społeczności Clojure. Ta postawa była bardzo pomocna, konstruktywna i pragmatyczna. Nacisk kładziony jest na „załatwienie rzeczy”, prawdopodobnie odzwierciedlając fakt, że wielu ludzi z Clojure (w tym sam Rich Hickey) wywodzi się z budowania złożonych systemów dla przedsiębiorstw. Fakt, że społeczność Clojure ma również silne powiązania ze społecznością Java, był ważny w przekonaniu mnie, że Clojure nie ryzykowałby utknięcia w „niszy”.

Gdybym musiał wymienić kilka drobnych wad Clojure, byłyby to:

  • Pisanie dynamiczne - często jest to zaleta pod względem wydajności, ale średnio myślę, że zamieniłbym to na silniejsze sprawdzanie i wnioskowanie. Przeważnie jest to złagodzone dzięki dobremu zautomatyzowanemu zestawowi testów, ale jeśli podoba ci się twój typ statycznie sprawdzony przez kompilator, to Haskell lub Scala mogą być bardziej filiżanką herbaty.

  • Najnowocześniejsze - Clojure rozwija się bardzo szybko i dzieje się wiele innowacji - wadą tego jest to, że istnieje wiele eksperymentów, niektóre biblioteki i narzędzia są nadal niedojrzałe, a czasami zdarzają się przełomowe zmiany między głównymi wersjami Clojure, które ty trzeba mieć na oku.

Ogólnie rzecz biorąc, nie sądzę, że możesz pomylić się z Clojure, jeśli chcesz doskonałego i pragmatycznego nowoczesnego języka funkcjonalnego!

mikera
źródło
1
Dzięki! Wspaniały post! Właśnie zastanawiałem się nad wykorzystaniem go do wewnętrznego projektu firmy, który będzie w dużej mierze oparty na drzewach i rekurencyjności. Dodatkowo mamy tutaj całkiem sporo kodu Java, który możemy wykorzystać ponownie z Clojure.
Joanis,
6

Wygląda na to, że odrobiłeś lekcje, więc prawdopodobnie już o tym wiesz, ale Schemat to dialekt Lisp, podobnie jak Common Lisp. Jeśli lubisz wiele rzeczy związanych ze Schematem, ale nie podoba ci się jego akademicki charakter, wypróbuj Common Lisp. Według indeksu TIOBE jest to 13. najpopularniejszy język w porównaniu do schematu na pozycji 26.

Kilka z wymienionych przez ciebie języków pojawia się w opisach stanowisk, które ostatnio widziałem, choć może to być tylko mój mały zestaw próbek. Osobiście będę uczył się języka Haskell, chociaż nie oczekuję, że będę używać tego języka bezpośrednio w mojej pracy. Koncepcje programowania funkcjonalnego są dla mnie cenniejsze dla przyszłych projektów programów niż bezpośrednia sprzedaż samego języka.

Zeke
źródło
Dzięki za link TIOBE, to interesujące źródło informacji. Chyba wybrałeś Haskell ze względu na jego czystość pod względem programowania funkcjonalnego?
Joanis,
1
@ M.Joanis: Prawie, choć myślę o późniejszym podniesieniu Lisp. Zobacz programmers.stackexchange.com/questions/18838/...
Zeke
Wybrana odpowiedź ma wiele sensu. Wydaje się, że czystość jest właściwą drogą, dopóki naprawdę nie zrozumiem całego paradygmatu funkcjonalnego.
Joanis,