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.
Odpowiedzi:
Ponieważ chcesz praktycznego języka:
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:
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:
Jeśli chcesz poznać naprawdę odważny dialekt Schematu, spójrz na Rakieta.
źródło
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.
źródło
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.
źródło
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
źródło
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!
źródło
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.
źródło