WriteOnly.pl / Posts by category / Programming / Kolejny język programowania - język wszystkomający

Kolejny język programowania - język wszystkomający

6 minutes to read

Język wszystkomający jest to język w którym można programować imperatywnie, funkcyjnie, obiektowo, proceduralnie oraz strukturalnie. Prawdopodobnie jest to język zły do nauki jako pierwszy język programowania. Może też być złym językiem do nauki pojedynczych paradygmatów programowania, jeśli nie mamy odpowiedniej dyscypliny. Jeśli jednak mamy tę dyscyplinę jest to genialny język do nauki nowych paradygmatów programowania. Po co uczyć się nowych paradygmatów programowania starałem się wyjaśnić w artykule Kolejny język programowania do nauki - paradygmaty programowania.

Pierwszy język wszystkomający

Chyba najpopularniejszym językiem wszystkomającym jest Scala. Jednak to nie ten język programowania chciałbym Tobie polecić. A język będący pierwowzorem Scali.

Istnieje popularna legenda, że Martin Odersky tworząc język Scala połączył świat obiektowy, czyli język Java, ze światem funkcyjnym, czyli z językiem Haskell. Jednak gdyby była to prawda to nie byłyby potrzebne dodatkowe biblioteki jak Scalaz lub Cats robiące z Scali Haskella. Tak naprawdę Martin Odersky dostał zlecenie dodania typów polimorficznych (nazywanych w Javie generykami) umożliwiających metaprogramowanie (nazywane w Javie programowaniem generycznym) do Javy 1.4.

Ponieważ praca nad dodaniem typów generycznych do Javy była trudna, Martin Odersky stworzył nowy język programowania na JVM nazwany przez niego Generic Java. Wzorowany był on na innym do metaprogramowania, czyli funkcyjnym Meta Language. A dokładniej jego obiektowo-funkcyjnej wersji, czyli język OCaml. Później Generic Java dostała nową nazwę i tak powstał język programowania Scala.

Chyba największą zmianą jaką zrobił Martin Odersky była zamiana znaczących wcięć na wąsate nawiasy, dzięki czemu Scala nie wygląda jak Python. Ale podobno co wersje Scali zastanawia się czy postąpił słusznie i czy nie przywrócić znaczących wcięć w miejsce wąsatych nawiasów.

Ale dlaczego nikt o tym nie mówi i powszechnie uważa się, że Scala była pierwszym językiem obiektowo-funkcyjnym? Może dlatego, że z trzech rodzin funkcyjnych języków programowania OCaml jest najmniej znany. Na dowód tego mam przykładowe zapytania do wyszukiwarki google.

  • scheme tutorial - 1 770 000 000 wyników
  • haskell tutorial - 1 220 000 wyników
  • ocaml tutorial -233 000 wyników

OCaml jest tak mało znany, że nie pojawia się nawet w rankingu Tiobe, a Meta Language pojawia się w drugiej 50.

Mimo tego to właśnie język OCaml chciałbym Tobie polecić jako kolejny język do nauki. Zwłaszcza jeśli nie lubisz składni języka Scala lub maszyny wirtualnej JVM.

Ważne jest też to, że składnia języków OCaml powoli zaczyna być doceniana i przeżywa swój renesans pod postacią nowych języków programowania jak:

  • F# - dialekt języka OCaml na platformę .Net
  • ReasonML - dialekt języka OCaml transpiloway do JS
  • Elm - język transpilowany do JS inspirowany składnią języków Meta Language i Haskell

Język funkcyjny a pragmatyczny programista

Dlaczego jednak autorzy książki nie wspomnieli o języku Ocaml powstałym w roku 1996? Nie wspomnieli też o językach LISP (1958), Meta Language (1973), Scheme (1975), Haskell (1990) oraz Racket (1995). Ani nawet o Emacs Lisp używanym do skryptowania w polecanym przez nich edytorze kodu Emacs!

Książka Pragmatyczny programista powstała w 2000 roku. Świat informatyki i języków programowania wyglądał wtedy inaczej. Istniały trzy główne grupy języków programowania (przynajmniej według autorów książki Pragmatyczny programista):

  1. Niskopoziomowe, rozwlekłe języki korporacyjne i języki natywne - ciężko się w nich pisało, były rozwlekłe i wszystkie były podobne do siebie.
  2. Wysokopoziomowe, dynamicznie typowane języki skryptowe - TCL, Perl, Python. Ruby był jeszcze nieznany poza Japonią.
  3. Języki eksperymentalne w których pokładano przyszłość, czyli:
    • Smalltalk i jego implementacja Squeak. Język totalnie obiektowy (zwany reflektywnym) w którym można było wszystko przedefiniować. Odbijało się to jednak negatywnie na jego szybkości.
    • Eiffel oraz wzorujący się na nim Sather, promujące programowanie kontraktowe.

Żaden z języków eksperymentalnych nie przebił się do mainstreamu. Jednocześnie autorzy nie zająkneli się na temat programowania funkcyjnego wierząc, że języki dynamicznie typowane i totalnie obiektowe (reflektywne) oraz programowanie kontraktowe rozwiążą wszystkie nasze problemy. Dziś wiadomo że nie rozwiązały.

Część winy za to ponoszą naukowcy, tworzący języki funkcyjne, siedzący w swoich wysokich wieżach i z góry spoglądający na zwykłych programistów aplikacji biznesowych.

Postscriptum

Jeśli jednak chcesz uczyć się języka, który jest używany w celach biznesowych, polecam Scalę. Jeśli jednak nie chcesz uczyć się Scali polecam małe porównanie języków programowania na JVM i które paradygmaty można osiągnąć w nich przy użyciu zewnętrznych bibliotek.

Paradygmat Java Scala Kotlin Clojure
Programowanie imperatywne/proceduralne/obiektowe z listami mutowalnymi Java Sclava, ale nie ma imperatywnej pętli for Kotlin, ale nie ma imperatywnej pętli for Nie można, listy w Clojure z założenia są niemutowalne
Programowanie obiektowo-funkcyjne, jak w języku OCaml, plus niemutowalne listy Java + Vavr Scala Scotlin, czyli Kotlin + Vavr-kotlin Clojure
Programowanie czysto funkcyjne jak w języku Haskell z typami wyższych rzędów Java + Functional Java Scala + Scalaz lub Scala + Cats Kotlin + ARROW Nie można, Clojure jest dynamicznie typowany. Ale trwają prace nad @TypedClojure
Programowanie Aktorowe z ciężkimi aktorami Java + Akka Scala + Akka Kotlin + Akka Nie widziałem. Autor języka Clojure ceni wyżej pamięć transakcyjną niż model aktorów
Programowanie z włóknami (ang. fiber), kanałami (ang. channel) i lekkimi aktorami prawdopodobnie można użyć bibliotek ZIO lub Quasar Scala + ZIO Kotlin + Quasar Clojure + Pulsar

Tu należy się małe wyjaśnienie:

  • Sclava jest to określenie imperatywnego kodu napisanego w Scali przez programistę Javy 6, który tylko zerknął na dokumentację składni Scali i swoje imperatywne przyzwyczajenia do nowopoznanego języka.
  • Scotlin lub Skotlin jest to określenie tego czym powoli staje się język Kotlin, który początkowo miał być pragmatycznym i prostym do nauki językiem ogólnego przeznaczenia. A powoli zbiera wszystkie pomysły ze Scali. Aktualnie trwają dyskusje nad wprowadzeniem Type Classes do tego pragmatycznego i prostego języka programowania.

Z książek polecam Java. Programowanie funkcyjne. Nawet jeśli nie programujesz w Javie warto przeczytać tę książkę. Ponieważ pokazuje ona jak niesamowicie elastyczne są języki obiektowe. Dzięki czemu można w łatwy sposób zaimplementować bibliotekę, która umożliwia programować funkcyjnie w języku obiektowym.