Programowanie funkcyjne
Programowanie funkcyjne – filozofia i metodyka programowania będąca odmianą programowania deklaratywnego, w której wykorzystuje się to, że funkcje należą do typów pierwszoklasowych. Kładzie się nacisk na obliczanie wartości funkcji (często rekurencyjnych), ich kompozycje oraz funkcje wyższego rzędu.
W czystym programowaniu funkcyjnym, raz zdefiniowana funkcja zwraca zawsze tę samą wartość dla określonych wartości argumentów, tak jak funkcje matematyczne. Duży nacisk kładzie się także na niezmienność danych[1].
Historia
Podstawą teoretyczną programowania funkcyjnego jest rachunek lambda (a dokładnie rachunek lambda z typami). Został on opracowany w latach 30. XX wieku przez Alonzo Churcha.
Nazwa paradygmatu po raz pierwszy pojawiła się w pracy Johna Backusa „Can Programming Be Liberated From the von Neumann Style? A Functional Style and Its Algebra of Programs” w roku 1977, dzięki której Backus dostał nagrodę Turinga, mimo że programowanie funkcyjne było znane już wcześniej[2].
Pierwszym funkcyjnym językiem programowania był Information Processing Language (IPL) opracowany przez Allena Newella, Cliffa Shawa i Herberta Simona w połowie lat 50. XX wieku dla maszyny JOHNNIAC. Jednakże przełom dla programowania funkcyjnego stanowiło opracowanie przez Johna McCarthy pod koniec lat pięćdziesiątych języka LISP dla maszyn IBM 700/7000. LISP wprowadził wiele cech spotykanych we współczesnych językach programowania. Opracowany w latach 70. język Scheme miał za zadanie uproszczenie i poprawienie języka LISP.
W latach 70. powstały dwa kolejne funkcyjne języki programowania: język ML opracowany przez Robina Milnera na Uniwersytecie w Edynburgu oraz język Miranda opracowany przez Davida Turnera na Uniwersytecie w Kent. Język ML dał początek kilku dialektom, z których najpopularniejsze obecnie to Objective Caml oraz Standard ML. Pod koniec lat 80. został opracowany i ustandaryzowany język programowania Haskell, wywodzący się z języka Miranda.
Jednym z najnowszych języków funkcyjnych jest rozwijany przez firmę Microsoft język F#. Jest to przeniesienie języka Objective Caml na platformę .NET.
Podział języków funkcyjnych
Języki funkcyjne można podzielić na dwie grupy:
Języki czysto funkcyjne
Do tej grupy należą języki, w których nie występują zmienne ani efekty uboczne.
Wejście/wyjście w takich językach musi się odbywać jakimś alternatywnym mechanizmem, np. za pomocą monad.
Przedstawiciele tej podgrupy to Haskell oraz Clean.
Języki mieszane
Języki tej grupy są popularniejsze niż języki czysto funkcyjne. Umożliwiają one stosowanie zmiennych, pozwalają na efekty uboczne, tradycyjne wejście/wyjście i mieszanie stylu funkcyjnego z imperatywnym bądź obiektowym. Wartościowanie w nich jest przeważnie zachłanne.
Do grupy tej należą Lisp z wszystkimi pochodnymi (np. Clojure, Scheme), Erlang, Scala, języki grupy ML (Standard ML, OCaml, więc i bazujący na nim F#), tworzony przez polskich studentów język Nemerle. Ponadto elementy programowania funkcyjnego występują również w językach takich jak Java (od wersji 8), Python, Ruby, a nawet do pewnego stopnia Perl, JavaScript, D.
Zobacz też
Przypisy
- ↑ Caya 2019 ↓, s. 168.
- ↑ Backfield 2014 ↓, s. 16.
Bibliografia
- Joshua Backfield: Becoming Functional. O’Reilly Media, 2014. ISBN 978-1-4493-6817-3. (ang.).
- Andrew Caya: Szybsza sieć z językami PHP, MySQL i JavaScript. Gliwice: Grupa Wydawnicza Helion, 2019. ISBN 978-83-283-5521-7.
Linki zewnętrzne
Strony w języku polskim:
- Programowanie funkcyjne (materiały dydaktyczne Uniwersytetu Warszawskiego na studia informatyczne II stopnia)
- Strona prostego funkcyjnego języka programowania
Strony w języku angielskim:
- Strona z informacjami na temat języka Haskell i jego implementacji
- Implementacje języka Scheme oraz środowisko programowania DrScheme
- Britannica: technology/functional-language