Języki funkcjonalne: czym one są i dokąd zmierzają

Nawet jeśli niektórzy dokładnie argumentują, co to jest, programowanie funkcjonalne wciąż przyciąga programistów. Trzy najpopularniejsze języki funkcjonalne - Clojure, F # i Scala - są gotowe do wprowadzenia ulepszeń.

Programowanie funkcjonalne ma kluczowe znaczenie dla niektórych programistów, mówi założyciel firmy Scala, Martin Odersky: „Programiści w tym segmencie lubią programowanie funkcjonalne, ponieważ sprawia, że ​​kod jest bardziej przejrzysty, ma lepszą strukturę i zapobiega wielu klasom błędów”. Jednak niektórzy twierdzą, że programowanie funkcjonalne prowadzi do mniej wydajnego oprogramowania.

Programowanie funkcjonalne wymaga również myślenia o programowaniu w nowy sposób - mówi David Stephens, menedżer programu Microsoft ds. .Net i rzecznik F #. Abstrakcje mogą stanowić problem: „Kiedy uczysz kod bardziej abstrakcyjnym, gdy oddalasz się od manipulowania bitami i jawnego przechodzenia przez pętle, zrozumienie tych abstrakcji może zająć więcej czasu”.

Czym właściwie jest język funkcjonalny?

Mówiąc najprościej, programowanie funkcyjne polega na traktowaniu obliczeń jako funkcji matematycznych. Oprócz języków uznawanych od samego początku za funkcjonalne, Java i C # stały się bardziej funkcjonalne dzięki dodaniu obsługi wyrażeń lambda.

Ale precyzyjna definicja programowania funkcjonalnego może być trudna do ustalenia. Blog Clojurefun cytuje kilka definicji, które uważa za niepoprawne, w tym definiowanie programowania funkcjonalnego jako umożliwiającego styl funkcjonalny z funkcjami wyższego rzędu lub język obsługujący lambdy. Mówi, że poprawna definicja to język kładący nacisk na funkcje i niezmienne dane.

Inni twierdzą, że preferowana definicja bloga Clojure niekoniecznie jest poprawna. „Autor wybiera taki, który przypadkiem najlepiej pasuje do Clojure - nic dziwnego, to blog Clojure” - mówi Odersky Scali. „Mam interpretację, która jest bliska jego, ale nie taka sama”.

Funkcja, mówi Odersky, to fragment kodu, który odwzorowuje dane wejściowe na dane wyjściowe i nie ma innych efektów poza tym. „To jest matematyczna definicja funkcji, której tutaj używamy. Czasami te funkcje nazywa się„ czystymi ”, aby odróżnić je od, powiedzmy, funkcji w C.” Język funkcjonalny koncentruje się na programowaniu za pomocą czystych funkcji, dzięki czemu jest to łatwe i wydajne, mówi Odersky, który założył Typesafe, dostawcę platformy do tworzenia aplikacji Typesafe JVM.

Jak zauważa, programowanie funkcjonalne można łączyć z innymi paradygmatami. „Na przykład funkcjonalność bardzo dobrze pasuje do obiektu zorientowanego obiektowo. Scala jest językiem funkcjonalnym w tym sensie. Zgadzam się, że samo posiadanie lambd nie powoduje, że język jest funkcjonalny; jest konieczny, ale niewystarczający”

Deweloper Clojure Rich Hickey, który jest również dyrektorem technicznym w firmie Cognitect zajmującej się programowaniem systemów, zgadza się z główną tezą bloga Clojure. „Artykuł słusznie wskazuje, że programowanie funkcyjne nie polega na funkcjach pierwszej klasy lub wyższego rzędu. Programowanie funkcjonalne polega na upodobnianiu programowania do matematyki” - mówi. To oznacza, że ​​wciąż istnieje spektrum definicji programowania funkcjonalnego, mówi Hickey.

Microsoft Stephens widzi możliwości funkcjonalne wykraczające poza same języki. „Najpopularniejszym funkcjonalnym językiem programowania na świecie jest Excel” - mówi. Prosty arkusz programu Excel może zawierać kolumnę z wieloma wartościami, na przykład A1 X 2. „To czysta funkcja na A1, a A1 nie zmienia się, więc obliczasz wartości na podstawie istniejących danych”.

Technologia zapytań zintegrowanych z językiem (Linq) firmy Microsoft zapewnia również programowanie funkcjonalne - mówi. „Niemal każdy język programowania przyjmuje obecnie cechy z języków funkcjonalnych”.

Stephens cytuje niezmienne dane jako krytyczne dla programowania funkcjonalnego. Współbieżność - programy z wieloma wątkami operującymi na danych jednocześnie - również czerpią korzyści z niezmiennych danych, zauważa. „Nazywamy [F #] językiem funkcjonalnym, ponieważ wywodzi się z dziedzictwa innych języków”. Obsługuje również programowanie obiektowe i działa w językach C # i Visual Basic, mówi.

Clojure's Hickey postrzega przyjęcie języków funkcjonalnych jako odpowiedź na rosnącą presję, z jaką zmagają się programiści, którzy w dzisiejszych czasach muszą mierzyć się z większymi problemami. „Aby to zrobić, muszą zredukować przypadkową złożoność swoich programów. Obecnie powszechnie uznaje się, że wszechobecny stan i skutki uboczne są głównym źródłem złożoności i błędów w programach” - mówi Hickey. „Chociaż możliwe jest zmniejszenie ilości stanów w programach napisanych w niefunkcjonalnych językach, jest to znacznie łatwiejsze i szybsze w przypadku języka, który sprawia, że ​​programowanie funkcjonalne jest idiomatyczne i domyślne”.

Co dalej z trzema najpopularniejszymi językami funkcjonalnymi

13-letni Scala jest podstawowym językiem w nauce o danych - mówi założyciel Scali Odersky. Obsługiwany przez JVM, ma około 400 000 do 500 000 użytkowników. Plany krótkoterminowe przewidują optymalizację dla Java 8, w której instrukcje kodu bajtowego z najnowszej standardowej aktualizacji Java umożliwiłyby Scali generowanie bardziej wydajnego kodu.

W dłuższej perspektywie Scala otrzyma oczyszczony system typów, bezpieczniejsze makra i większą obsługę platform, z rozważanym zapleczem kompilatora LLVM. Planowane są dalsze ulepszenia mające na celu poprawę użyteczności Scala.js do kompilowania Scali do JavaScript.

Dziewięcioletni Clojure, również oparty na JVM, był używany w finansach, handlu detalicznym, oprogramowaniu i rozrywce, mówi Hickey. „Został zastosowany w różnych obszarach zastosowań, takich jak przetwarzanie i analiza transakcji, duże zbiory danych, operacje sieciowe, analizy predykcyjne, wyszukiwanie, bezpieczeństwo i oferty konsumenckie”.

11-letni F # został założony przez firmę Microsoft Research przez Don Syme i jest nadzorowany przez F # Foundation. Jest używany w szerokiej gamie aplikacji i działa w systemach Linux, OS X, Android, iOS, Windows i przeglądarkach. „Teraz pracujemy nad tym, by działało z .Net Core” - otwartą, wieloplatformową, modułową wersją .Net Framework - mówi Stephens. Na desce kreślarskiej znajduje się interpolacja strun, ułatwiająca pisanie napisów.