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