Paradygmaty Programowania - Katedra Informatyki > Home
Transkrypt
Paradygmaty Programowania - Katedra Informatyki > Home
Kontakt Paradygmaty Programowania dr inŜ. Cezary Bolek email: [email protected] Katedra Informatyki Wydział Zarządzania Uniwersytet Łódzki konsultacje (p.142): wtorek: 15:00-15:45 czwartek: 11:30-13:00 Cezary Bolek Katedra Informatyki UŁ materiały: http://ki.uni.lodz.pl/cbolek Paradygmaty programowania Czym jest paradygmat Cezary Bolek Paradygmaty programowania Programowanie • Paradygmat to przyjęty sposób widzenia rzeczywistości w danej dziedzinie, doktrynie itp. Imperatywne [Słownika Języka Polskiego PWN] Strukturalne • Paradygmat programowania - wzorzec programowania przedkładany w danym okresie rozwoju Informatyki ponad inne lub szczególnie ceniony w pewnych okolicznościach lub zastosowaniach lub • ogół środków, metod, konwencji stosowany w pewnym sposobie programowania Zdarzeniowe Cezary Bolek Proceduralne Modularne Obiektowe Deklaratywne Logiczne Paradygmaty programowania 2 3 Paradygmaty programowania Cezary Bolek Funkcyjne 4 1 Paradygmat Język programowania • Język programowania – środek do realizacji załoŜeń paradygmatu • Język moŜe: • Co róŜni paradygmaty między sobą? – – – – sposób patrzenia na dane sposób patrzenia na kod sposób wiązania kodu z danymi sposób patrzenia na przepływ sterowania – wspierać paradygmat: zawiera środki pozwalające wyraŜać paradygmat wprost – umoŜliwiać paradygmat: pozwala wyraŜać pewien paradygmat ale kosztem dodatkowej pracy programisty • • • • Program = Kod + Dane Kod = Algorytm + Język programowania Dane = Struktury + Język programowania Programowanie = przejście od nieformalnego opisu problemu do formalnego opisu implementacji rozwiązania • Sposób przejścia narzuca paradygmat Paradygmaty programowania Cezary Bolek • Np.: – język C++ wspiera programowania obiektowe – język C umoŜliwia programowania obiektowe 5 Paradygmaty programowania Cezary Bolek W czym zawiera się wsparcie paradygmatu? W czym zawiera się wsparcie paradygmatu? • Konstrukcje języka – instrukcje wywołania procedury, utworzenia obiektu, aktywacji metody, zdefiniowanie reguły, etc. • Biblioteki standardowe – dostarczają udogodnień zgodnych z paradygmatem: procedur, funkcji, obiektów, reguł • Środowisko programisty – narzędzie ułatwiające realizację paradygmatu np. specjalizowane edytory, debuggery, etc. • Diagnostyka kompilatora – wykrywanie odstępstw od paradygmatu i odrzucanie programów sprzecznych z paradygmatem, np. drogą sprawdzania zgodności typów 6 • Ten sam język programowania moŜe w róŜnym stopniu wspierać i umoŜliwiać bardzo róŜne paradygmaty ! • Diagnostyka czasu wykonania (run-time) – np. poprzez wykrywanie niezaicjowanych obiektów czy teŜ niedozwolonych trybów aktywacji ich metod – np. C++: • wspiera paradygmaty: strukturalny, proceduralny, obiektowy, ... • umoŜliwia: paradygmat zdarzeniowy, funkcyjny Paradygmaty programowania Cezary Bolek 7 Paradygmaty programowania Cezary Bolek 8 2 Paradygmat imperatywny Programowanie imperatywne Programowanie imperatywne • Związany ściśle z budową sprzętu komputerowego o architekturze von Neumanna, w którym poszczególne instrukcje (w kodzie maszynowym) to właśnie polecenia zmieniające ów globalny stan. • Podstawowy i naczelny współczesny paradygmat programowania • Kod jest sekwencją instrukcji • Program moŜna uznać za ciąg zdań rozkazujących (stąd nazwa paradygmatu) • Ściślej, obliczenia rozumiemy tu jako sekwencję poleceń zmieniających krok po kroku stan maszyny, aŜ do uzyskania oczekiwanego wyniku. • Stan maszyny naleŜy z kolei rozumieć jako zawartość całej pamięci oraz rejestrów i znaczników procesora. Paradygmaty programowania Cezary Bolek • Języki wysokiego poziomu — takie jak Fortran, Algol, Pascal, Ada lub C — posługują się pewnymi abstrakcjami, ale wciąŜ odpowiadają paradygmatowi programowania imperatywnego. • Przykładowo, instrukcje podstawienia działają na danych pobranych z pamięci i umieszczają wynik w tejŜe pamięci, zaś abstrakcją komórek pamięci są zmienne. 9 Programowanie imperatywne 10 • „Podparadygmat” programowania imperatywnego. • Tworzenie programów z kilku dobrze zdefiniowanych konstrukcji takich jak instrukcja warunkowa, pętla, za to bez skoków (go to) • UŜycie tylko trzech rodzajów struktur sterujących: • Przykładowy program w języku imperatywnym (Pascal): – Sekwencja (lub konkatenacja) — wykonanie instrukcji w określonej kolejności. – Selekcja — wykonanie jednej z kilku instrukcji zaleŜnie od stanu programu. Przykładem jest if-then-else i switch/case. – Cykl — powtarzanie instrukcji tak długo, jak długo spełniony (lub niespełniony) jest dany warunek. Pętle, np. while, repeat-until, for itp. program pierwszy; var i, n, s: integer; begin read(n); s := 1; for i := 2 to n do s := s * i; write(s) end. Cezary Bolek Cezary Bolek Paradygmat strukturalny • Bardzo wiele współczesnych języków programowania jest silnie imperatywna mimo, Ŝe często wspierają inne paradygmaty ! Paradygmaty programowania Paradygmaty programowania • Cel: sprzyjanie pisaniu programów przejrzystych, łatwych w rozumieniu i utrzymaniu (w rozumieniu imperatywnym 11 Paradygmaty programowania Cezary Bolek 12 3 Paradygmat proceduralny Paradygmat modularny • Najstarsze dziecko paradygmatu imperatywnego • Ciągle jeden z najpowszechniejszych, mimo presji nowszych paradygmatów • Środki wsparcia paradygmatu proceduralnego: • Rozwinięcie paradygmatu proceduralnego, wymuszone przez wzrost złoŜoności i objętości programów • Nieodzowny w przypadku projektów rozproszonych i/lub wieloosobowych – wydzielanie porcji kodu pod postacią procedur, podprogramów, funkcji – istnienie mechanizmu przekazywania parametrów • • • • • • przez kopię (FORTRAN) (zanikł) przez nazwę (Algol) (zanikł) przez wartość (C, Pascal) przez zmienną (Pascal) przez wskazanie/adres (C) przez referencję (C++) • Języki umoŜliwiające paradygmat modularny – C/C++ i pochodne • Języki wspierające paradygmat modularny: Modula2, Ada • Środki wsparcia paradygmatu modularnego: Programowanie Imperatywne Strukturalne Zdarzeniowe Proceduralne Modularne Obiektowe Deklaratywne Logiczne Funkcyjne – istnienie mechanizmu zwracania wartości przez funkcje Paradygmaty programowania Cezary Bolek 13 – deklaracje bytów zdefiniowanych w innych modułach (import i eksport) np. w języku C deklaracje „extern” – deklaracje ukrywające pewne byty przed uŜytkownikami modułu (hermetyzacja modułu) – kontrolowanie hierarchii modułów – np. w pakiety w języku Ada – moŜliwości parametryzowania modułów – np. pakiety rodzajowe (generic) w języku Ada Paradygmaty programowania Paradygmat zdarzeniowy Cezary Bolek Paradygmat zdarzeniowy • Sposób implementacji rozwiązania problemu, w którym istotną rolę odgrywają napływające do systemu zdarzenia • Paradygmat zdarzeniowy moŜe być implementowany we wszystkich paradygmatach imperatywnych, jednak... • Najwygodniej czyni się to środkami obiektowymi. • Opisuje się nie to, jaką ścieŜkę program wybierze w reakcji na zdarzenia, a deklaruje się zestaw czynności, które „coś” wykona, kiedy zajdzie taka konieczność • Prawie nie sposób jest napisać nietrywialną aplikację z GUI (Graphical User Interface) nie stosując paradygmatu zdarzeniowego • Rodzaje zdarzeń napływają do programu: • Nie moŜna w Ŝaden sposób przewidzieć ani kolejności, ani rodzaju zgłaszanych zdarzeń Programowanie • Coś = dyspozytor zdarzeń 14 Imperatywne Strukturalne Zdarzeniowe Proceduralne Modularne Obiektowe – – – – od uŜytkownika od systemu operacyjnego od innych aplikacji ze świata zewnętrznego Deklaratywne Logiczne Paradygmaty programowania Cezary Bolek Funkcyjne 15 Paradygmaty programowania Cezary Bolek 16 4 Paradygmat obiektowy Programowanie obiektowe • W programowaniu obiektowym program to zbiór porozumiewających się ze sobą obiektów, czyli jednostek zawierających pewne dane i umiejących wykonywać na nich pewne operacje • Programowanie obiektowe zdobyło ogromną popularność i wypada je uznać za paradygmat obecnie dominujący. • Przykładowy kod w języku obiektowym (Java): • WaŜną cechą jest powiązanie danych (czyli stanu) z operacjami na nich (czyli poleceniami) w całość, stanowiącą odrębną jednostkę — obiekt. • Mechanizm dziedziczenia, czyli moŜliwość definiowania nowych, bardziej złoŜonych obiektów, na bazie obiektów juŜ istniejących. Programowanie • Imperatywne Zwolennicy programowania obiektowego uwaŜają, Ŝe ten paradygmat dobrze odzwierciedla sposób, w jaki ludzie myślą o świecie Strukturalne Zdarzeniowe Modularne Obiektowe Deklaratywne Logiczne Paradygmaty programowania Proceduralne Funkcyjne Cezary Bolek 17 Paradygmat deklaratywny Pomieszczenie kuchnia = new Pomieszczenie(2, 3, 2); int powierz; int sciany; powierz=pokoj.podloga() + kuchnia.podloga(); sciany =pokoj.sciana() + kuchnia.sciana(); ... Cezary Bolek 18 Imperatywne Strukturalne • Program jest złoŜoną funkcja (w sensie matematycznym), która otrzymawszy dane wejściowe wylicza pewien wynik • kolejność stosowania recept nie jest znana przed wykonaniem problemu • Jak wykonać deklaratywny program na imperatywnym sprzęcie? Programowanie Imperatywne Strukturalne Zdarzeniowe Proceduralne Modularne Obiektowe Deklaratywne Logiczne Cezary Bolek Pomieszczenie pokoj = new Pomieszczenie(3, 4, 2); Programowanie • Innymi słowy, program jest sekwencją zdań oznajmujących Paradygmaty programowania Paradygmaty programowania ... Paradygmat funkcyjny • Program nie jest ciągiem instrukcji, a zbiorem recept, których stosowanie definiuje problem lub sposób rozwiązania – Konieczny interpreter class Pomieszczenie { private int szer, dlug, szer, wys; Pomieszczenie(int s, int d, int w) { szer = s; dlug = d; wys = w; } int podloga() { return szer * dlug; } int sciana() { return 2*(szer*wys + dlug*wys); } } Zdarzeniowe Proceduralne Modularne Obiektowe Deklaratywne Logiczne Funkcyjne • Zasadniczą róŜnicą w stosunku do poprzednich paradygmatów jest brak stanu maszyny: nie ma zmiennych, a co za tym idzie nie ma Ŝadnych efektów ubocznych. Funkcyjne 19 Paradygmaty programowania Cezary Bolek 20 5 Programowanie w logice Programowanie funkcyjne (programowanie logiczne) • Nie ma teŜ imperatywnych z natury, tradycyjnie rozumianych pętli (wymagają zmiennych do sterowania ich przebiegiem). • Konstruowanie programów to składanie funkcji, zazwyczaj z istotnym wykorzystaniem rekurencji. Charakterystyczne jest definiowanie funkcji wyŜszego rzędu, czyli takich, dla których argumentami i których wynikami mogą być funkcje Programowanie • Na program składa się zbiór zaleŜności (przesłanki) i pewne stwierdzenie (cel) 0 ) ) (+ m (suma (+ m 1) n)) Paradygmaty programowania Przykładowy program (definicja funkcji) w języku funkcyjnym (Scheme) Cezary Bolek 21 Programowanie w logice Obiektowe Deklaratywne Logiczne Funkcyjne Paradygmaty programowania Cezary Bolek 22 • Istnieje wiele innych paradygmatów • Często obejmują one tylko niektóre aspekty programowania, więc moŜna je uznać za podzbiór tych wspomnianych wcześniej – Przykładowo: paradygmat programowania proceduralnego jest istotnym składnikiem programowania imperatywnego. • Paradygmaty nawzajem się przenikają: – Przykładowo: programowanie na poziomie wartości (w odróŜnieniu do programowania „wyŜszego rzędu” - na poziomie funkcji) moŜna traktować jako jedną z cech typowych dla programowania imperatywnego, choć jest równieŜ obecna w programowaniu obiektowym i funkcyjnym. • Przykładowy program w języku logicznym: ojciec(jan, jerzy). ojciec(jerzy, janusz). ojciec(jerzy, józef). • Inny przykład to programowanie skalarne i macierzowe - rozróŜnienie odnoszące się do tego, czy działamy na pojedynczych wartościach, czy na całych tablicach dziadek(X, Z) :- ojciec(X, Y), ojciec(Y, Z). ?- dziadek(X, janusz). Cezary Bolek Proceduralne Modularne Inne paradygmaty • Program decyduje, jakich reguł uŜyć i w jakiej kolejności, aby stwierdzić, czy cel jest osiągalny. • Najbardziej znany język programowania logicznego – Prolog – bogactwo odmian i dialektów – podstawowy język w badaniach nad sztuczną inteligencją Paradygmaty programowania Zdarzeniowe • Wykonanie programu to próba udowodnienia celu w oparciu o podane przesłanki. • Wykonanie programu jest poszukiwaniem celu • Podobnie jak w programowaniu funkcyjnym, nie „wydajemy rozkazów”, a jedynie opisujemy, co wiemy i co chcemy uzyskać. (DEFINE (suma m n) (IF (> m n) Imperatywne Strukturalne 23 Paradygmaty programowania Cezary Bolek 24 6 Paradygmaty w językach programowania Podział języków ? • Wieloparadygmatowe • Konkretny język programowania ucieleśnia jeden lub więcej paradygmatów • Fortran, Pascal i C to języki pozwalające stosować paradygmat programowania imperatywnego (języki imperatywne) – Ada • Clojure • Common Lisp • D • Icon • Nemerle • Ruby • Snobol • Python • Ocaml • Imperatywne – ale pozwalają stosować paradygmaty strukturalne, proceduralne, zdarzeniowe – AWK • C • COBOL • Forth • Fortran • Modula-2 • Oberon • Pascal • Perl • REXX • Java, C# to z kolei języki obiektowe, w których typowe programowanie imperatywne zostało mocno ograniczone • Obiektowe – ActionScript • C++ • C# • Delphi • Eiffel • Java • JavaScript • Object Pascal • Objective-C • Oxygene • Smalltalk – ale istnieje • Natomiast C++ jest językiem zarówno obiektowym, jak i imperatywnym. • Do pewnego stopnia moŜna zresztą uznać, Ŝe programowanie imperatywne to szczególny, wynaturzony przypadek programowania obiektowego, gdzie wszystko rozgrywa się wewnątrz jednego „superobiektu”. Paradygmaty programowania Cezary Bolek • Funkcyjne – Clojure • Erlang • F# • Haskell • Lisp • ML • Ocaml • Scheme • Logiczne – Prolog, Goedel 25 Paradygmaty programowania Ranking TIOBE • porównanie popularności języków programowania • Prowadzenie badań w oparciu o róŜne wyszukiwarki i źródła danych (WWW, grupy dyskusyjne, blogi) Nie najlepsza miara powszechności stosowania ale dająca ogólny pogląd. Określa częstość wzmiankowania w Internecie, czyli „popularność” http://www.oreilly.com/news/graphics/prog_lang_poster.pdf Paradygmaty programowania Cezary Bolek 26 Który język jest najpopularniejszy ? http://www.tiobe.com/tpci.htm Mnogość języków Cezary Bolek 27 Paradygmaty programowania Cezary Bolek 28 7 Który język jest najpopularniejszy ? Paradygmaty programowania Cezary Bolek 29 8