Języki i paradygmaty programowania I. Wprowadzenie
O źródłach wykład został przygotowany w ogromnej części w oparciu o serwis http://wazniak.mimuw.edu.pl/ (zgodnie z licencją serwisu) inne źródła: Wikipedia: http://pl.wikipedia.org/, http://en.wikipedia.org/ niektóre przykłady fragmentów programów: http://www.im.pwr.wroc.pl/~przemko/prolog/ http://rudy.mif.pg.gda.pl/~bogdro/dos/ 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-2
O przedmiocie prowadzący: dr Jarosław Bylina email: jmbylina@hektor.umcs.lublin.pl www: http://hektor.umcs.lublin.pl/~jmbylina/ 15 godzin wykładu (brak ćwiczeń) 5 spotkań po 3 godziny lekcyjne na każdym spotkaniu (poza pierwszym) krótki teścik z poprzedniego wykładu wyniki testów stanowią podstawę zaliczenia 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-3
Cel przedmiotu Uświadomienie istotnej różnorodności języków programowania Zrozumienie sposobu działania implementacji języków programowania Nauczenie podejmowania lepszych decyzji co do wyboru języka programowania odpowiedniego do postawionego problemu 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-4
Paradygmat? słowo nadużywane przez filozofów, lingwistów, informatyków... SJP PWN: przyjęty sposób widzenia rzeczywistości w danej dziedzinie, doktrynie itp. zespół form fleksyjnych (deklinacyjnych lub koniugacyjnych), właściwy danemu typowi wyrazów; wzorzec, model deklinacyjny lub koniugacyjny 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-5
Paradygmat? z greckiego: παράδειγμα (parádeigma) wzorzec przykład 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-6
Paradygmat? Nie chodzi o typowy, wzorcowy sposób pisania programów! Chodzi raczej o zbiór mechanizmów, jakich programista używa, pisząc program, i o to, jak ów program jest następnie wykonywany przez komputer Jest to ogół oczekiwań programisty wobec języka programowania i komputera, na którym będzie działał program 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-7
Wielcy John von Neumann Niklaus E. Wirth Donald E. Knuth 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-8
2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-9
Paradygmaty programowania Programowanie imperatywne opisujemy kolejne czynności, które wykonawca (komputer) ma wykonać, by osiągnąć cel w tym rodzaju programowaniu programista opisuje, jak komputer ma działać Programowanie deklaratywne opisujemy cel, który wykonawca (komputer) ma osiągnąć w tym rodzaju programowaniu programista opisuje, co komputer ma osiągnąć 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-10
I. Programowanie imperatywne Najbardziej pierwotny sposób programowania, w którym program postrzegany jest jako ciąg poleceń dla komputera 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 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-11
I. Programowanie imperatywne Ten sposób patrzenia na programy związany jest ś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 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-12
I. Programowanie imperatywne 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-13
I. Programowanie imperatywne Języki wyższego (w stosunku do asemblera i kodu maszynowego) poziomu takie jak Fortran, Algol, Pascal, Ada lub C posługują się pewnymi abstrakcjami, ale wciąż odpowiadają paradygmatowi programowania imperatywnego 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 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-14
2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-15
Ia. Programowanie proceduralne Podział zadania programistycznego na podzadania i ich niezależna (od siebie nawzajem) implementacja w postaci podprogramów (procedur) Niezalecanie korzystania z efektów ubocznych (rozumianych w sensie tradycyjnym, jako zmiana wartości zmiennych globalnych), lecz przekazywanie danych i wyników w parametrach procedur 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-16
Ia. Programowanie proceduralne 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-17
Ia. Programowanie proceduralne metodologia programowania bottom-up 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-18
2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-19
Ib. Programowanie strukturalne używanie prostych, dobrze zdefiniowanych struktur (konstrukcji programistycznych): sekwencja selekcja (instrukcja warunkowa) iteracja (pętla) wywołanie podprogramu unikanie skoków (wręcz ich zakaz!) 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-20
Ib. Programowanie strukturalne 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-21
Ib. Programowanie strukturalne metodologia programowania top-down 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-22
2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-23
Ic./II. Programowanie obiektowe 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 jest do pewnego stopnia rozszerzeniem paradygmatu programowania proceduralnego i strukturalnego 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-24
Ic./II. Programowanie obiektowe Ważną cechą jest tu powiązanie danych (czyli stanu) z operacjami na nich (czyli poleceniami) w całość, stanowiącą odrębną jednostkę obiekt Bardzo ważną cechą jest też mechanizm dziedziczenia, czyli możliwość definiowania nowych, bardziej złożonych obiektów, na bazie obiektów już istniejących 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-25
Ic./II. Programowanie obiektowe Inne ważne cechy programowania obiektowego to: wysoki stopień abstrakcji danych enkapsulacja danych polimorfizm 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-26
Ic./II. Programowanie obiektowe Zwolennicy programowania obiektowego uważają, że ten paradygmat dobrze odzwierciedla sposób, w jaki ludzie myślą o świecie Nawet jeśli pogląd ten uznamy za przejaw pewnej egzaltacji, to niewątpliwie programowanie obiektowe zdobyło ogromną popularność i wypada je uznać za paradygmat obecnie dominujący 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-27
Ic./II. Programowanie obiektowe 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-28
2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-29
III. Programowanie funkcyjne Program to po prostu złożona funkcja (w sensie matematycznym), która otrzymawszy dane wejściowe wylicza pewien wynik 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-30
III. Programowanie funkcyjne Zasadniczą różnicą w stosunku do poprzednich paradygmatów jest brak dostępu do stanu maszyny Nie ma zmiennych A co za tym idzie, nie ma żadnych efektów ubocznych (rozumianych w sensie tradycyjnym, jako zmiana wartości zmiennych) 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-31
III. Programowanie funkcyjne Nie ma tradycyjnie rozumianych pętli (imperatywnych z natury) Tradycyjne pętle wymagają bowiem zwykle (poza przypadkami zdegenerowanymi, jak pętle nieskończone) zmiennych (lub innego dostępu do stanu maszyny) do sterowania ich przebiegiem 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-32
III. Programowanie funkcyjne Konstruowanie programów to składanie funkcji Zazwyczaj z istotnym wykorzystaniem rekurencji (rekursji) (tam, gdzie w programowaniu imperatywnym wykorzystujemy pętle) Charakterystyczne jest również definiowanie funkcji wyższego rzędu, czyli takich, dla których argumentami i których wynikami mogą być funkcje (a nie tylko proste dane jak liczby lub napisy) 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-33
III. Programowanie funkcyjne 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-34
2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-35
IV. Programowanie logiczne Na program składa się zbiór zależności (przesłanek) oraz pewne stwierdzenie/pytanie (cel) 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-36
IV. Programowanie logiczne Wykonanie programu to próba udowodnienia celu w oparciu o podane przesłanki Obliczenia wykonywane są niejako przy okazji dowodzenia celu Podobnie jak w programowaniu funkcyjnym, nie wydajemy rozkazów, a jedynie opisujemy, co wiemy i co chcemy uzyskać 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-37
IV. Programowanie logiczne 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-38
IV. Programowanie logiczne 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-39
IV. Programowanie logiczne 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-40
2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-41
Inne paradygmaty Programowanie na poziomie wartości Programowanie na poziomie funkcji Programowanie skalarne Programowanie wektorowe/macierzowe Programowanie zdarzeniowe Programowanie z własnym wątkiem sterowania Programowanie aspektowe Programowanie uogólnione Programowanie równoległe/współbieżne/rozproszone 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-42
Języki a paradygmaty asemblery, stary BASIC p. imperatywne (proceduralne?) stary Pascal, C, Fortran p. imperatywne, proceduralne, strukturalne C++, Object Pascal, Ada p. imperatywne, proceduralne, strukturalne, obiektowe Smalltalk, C#, Java p. obiektowe Lisp, Scheme, Logo, ML, Haskell p. funkcyjne Planner, Prolog p. logiczne Python p. proceduralne, strukturalne, obiektowe, funkcyjne SQL p. deklaratywne (ani ściśle funkcyjne, ani ściśle logiczne) 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-43
Architektura von Neumanna Na razie wszystkie komputery działają w oparciu o imperatywną architekturę von Neumanna Tak więc każdy program, który chcemy uruchomić, musi być najpierw przetłumaczony do ciągu rozkazów w języku wewnętrznym konkretnej maszyny Różne paradygmaty mogą wymagać skomplikowanych metod tłumaczenia; różna jest też ich efektywność 2008-02-23 Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie I-44