Programowanie. Wykład 1 - paradygmaty programowania. Janusz Szwabiński. Plan wykładu:

Podobne dokumenty
Programowanie obiektowe - 1.

Programowanie obiektowe W1 Wprowadzenie. Dr hab. inż. Lucyna Leniowska, prof. UR Zakład Mechatroniki, Automatyki i Optoelektroniki

Modelowanie i Programowanie Obiektowe

Paradygmaty programowania

Wykład V. Rzut okiem na języki programowania. Studia Podyplomowe INFORMATYKA Podstawy Informatyki

Języki i paradygmaty programowania. I. Wprowadzenie

Wykład 1 Informacje Podstawowe

Podstawy Programowania Obiektowego

Paradygmaty i języki programowania. Wprowadzenie. dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 1

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład 1 Informacje Podstawowe

Wykład 1. Projektowanie efektywnych algorytmów przetwarzania danych w sieciowych systemach usług, rzeczy i multimediów.

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Paradygmaty programowania

Wykład 4. Algorytmy i programy. Algorytmy + struktury danych = programy. Niklaus Wirth. Algorytm = logika + sterowanie.

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

Programowanie w języku C++ Podstawowe paradygmaty programowania

Języki programowania deklaratywnego

Programowanie obiektowo zorientowane. Mirosław Głowacki Wykład w języku C++

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Wykład 0 Informacje Podstawowe

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Praktyka Programowania

Programowanie obiektowe

Paradygmaty i języki programowania. Wprowadzenie. dr Robert Kowalczyk, Katedra Analizy Nieliniowej, WMiI UŁ 1

Języki programowania imperatywnego

1 Wprowadzenie do algorytmiki

Języki programowania deklaratywnego

Technologie i usługi internetowe cz. 2

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Programowanie obiektowe

Język programowania PASCAL

Programowanie Obiektowe i C++

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Wstęp do programowania

Podstawy programowania w języku C

Programowanie Obiektowe i C++ Marcin Benke

Wstęp do programowania

Język programowania. Andrzej Bobyk

Wstęp do Informatyki dla bioinformatyków

Programowanie obiektowe Wykład 1. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

Podstawy programowania. Wprowadzenie

Programowanie I. Wprowadzenie. Proces programowania

Technologie cyfrowe semestr letni 2018/2019

Historia modeli programowania

Języki i metodyka programowania

Algorytm. a programowanie -

Informatyka II stopień (I stopień / II stopień) Ogólnoakademicki (ogólno akademicki / praktyczny) Kierunkowy (podstawowy / kierunkowy / inny HES)

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Wykład 1 Wiadomości wstępne

Przyszłość programowania Języki funkcyjne na przykładzie Clojure

Rok akademicki: 2012/2013 Kod: ZIE s Punkty ECTS: 3. Poziom studiów: Studia I stopnia Forma i tryb studiów: -

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

hierarchie klas i wielodziedziczenie

Komputer nie myśli. On tylko wykonuje nasze polecenia. Nauczmy się więc wydawać mu rozkazy

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

WYKŁAD. Jednostka prowadząca: Wydział Techniczny. Kierunek studiów: Elektronika i telekomunikacja. Nazwa przedmiotu: Język programowania C++

Technologie informacyjne - wykład 12 -

Style programowania - krótki przeglad

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie. Pascal - język programowania wysokiego poziomu. Klasa 2 Lekcja 9 PASCAL

Technologie cyfrowe semestr letni 2018/2019

Wstęp do informatyki Paradygmaty programowania

Paradygmaty Programowania dr inŝ. Cezary Bolek

Pascal - wprowadzenie

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Wstęp do programowania

Wykład 1 Informacje Podstawowe

Wstęp do Informatyki i Programowania

Podstawy programowania wykład

Programowanie. Projektowanie funkcje programu tworzenie algorytmu i struktur danych. Programowanie implementacja algorytmu kompilacja programu

Style programowania - krótki przeglad

Programowanie obiektowe. Wprowadzenie

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

dr inż. Paweł Myszkowski Wykład nr 5 ( )

2.8. Algorytmy, schematy, programy

Metody Metody, parametry, zwracanie wartości

GUI - projektowanie interfejsów cz. II

Wstęp do Programowania Obiektowego. Wykład 13 Paradygmaty. Składnia i semantyka.

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Wstęp do Programowania potok funkcyjny

Metody Programowania

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

Informatyczna Wieża Babel, czyli o różnych językach programowania. Informatyczna Wieża Babel, czyli o różnych językach programowania

Wstęp do Informatyki. Program, proces tworzenia programu Środowisko programistyczne Języki programowania

Wstęp do programowania

Przegląd języka Python. Łukasz Anwajler

Języki programowania wprowadzenie

Języki programowania zasady ich tworzenia

Jerzy Nawrocki, Wprowadzenie do informatyki

Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

wstęp (podstawowe pojęcia związane z programowaniem, przegląd języków programowania, sieci działań, ogólne zasady programowania zorientowanego

Podstawy Programowania

TEST KOŃCOWY DLA KLASY III GIMNAZJUM- POGRAMOWANIE. Szkoła Podstawowa Nr 5. im. Księcia Mazowieckiego Siemowita IV w Gostyninie.

Zofia Kruczkiewicz - Modelowanie i analiza systemów informatycznych 1

Transkrypt:

Programowanie Wykład 1 - paradygmaty programowania Janusz Szwabiński Plan wykładu: 1. Sprawy administracyjne 2. Paradygmaty programowania 3. Paradygmaty programowania w Pythonie file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 1/15

Sprawy administracyjne Kontakt janusz.szwabinski@pwr.edu.pl konsultacje (C-11, pokój 5.16): poniedziałek, 11.00-13.00 czwartek, 9.10-11.10 http://prac.im.pwr.wroc.pl/~szwabin/index (http://prac.im.pwr.wroc.pl/~szwabin/index) Plan kursu 1. Paradygmaty programowania 2. Podstawowe konstrukcje i typy zmiennych w Pythonie 3. Moduły i biblioteki (w tym do obliczeń naukowych) 4. Programowanie obiektowe 5. Graficzne interfejsy użytkownika 6. Zintegrowane środowiska programistyczne 7. Zasady dokumentowania kodu Literatura 1. Dokumentacja Pythona: https://www.python.org/doc/ (https://www.python.org/doc/) 2. M. Pilgrim, "Dive into Python", http://www.diveintopython3.net/ (http://www.diveintopython3.net/) 3. M. Summerfield, "Rapid GUI programming with Python and Qt" 4. D. Beazley and B. K. Jones, "Python Cookbook" Zaliczenie ocena = lab + wyk 2 Średnia X < 65 65 X < 75 70 X < 75 75 X < 85 85 X < 95 95 X < 100 Ocena 2.0 3.0 3.5 4.0 4.5 5.0 file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 2/15

Paradygmaty programowania Wzorzec programowania komputerów przedkładany w danym okresie rozwoju informatyki ponad inne lub ceniony w pewnych okolicznościach lub zastosowaniach. file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 3/15

Programowanie imperatywne proces wykonywania programu opisany jest jako sekwencja instrukcji zmieniających stan programu podobnie jak tryb rozkazujący w lingwistyce wyraża żądania jakichś czynności do wykonania programy imperatywne składają się z ciągu komend do wykonania przez komputer rozszerzeniem (w sensie wbudowanych funkcji) i rodzajem (w sensie paradygmatu) programowania imperatywnego jest programowanie proceduralne prawie każdy sprzęt komputerowy pracuje w sposób imperatywny kod maszynowy pisany jest w stylu imperatywnym ponieważ podstawowe założenia programowania imperatywnego są bardzo podobne lub bezpośrednio odwzorowane w sprzęcie komputerowym, większość dostępnych języków programowania jest imperatywna wspólne elementy języków imperatywnych instrukcje przypisania - wykonują pewne zadanie na zlokalizowanych w pamięci danych i odkładają tam wynik działania na potrzeby późniejszych operacji języki wysokopoziomowe umożliwiają dodatkowo wykonywanie bardziej złożonych wyrażeń składających się z operacji arytmetycznych oraz całych funkcji instrukcje pętli - umożliwiają wielokrotne wykonanie tego samego kodu "wielokrotność" może oznaczać pewną określoną z góry liczbę powtórzeń wykonywanie do czasu spełnienia pewnych warunków instrukcje warunkowe wykonują pewien blok kodu tylko wtedy, kiedy spełniony jest określony warunek języki imperatywne zezwalają na przekazanie sterowania do zupełnie innej części programu bezwarunkowy skok (goto) wywołanie podprogramu (procedury) Historia kody maszynowe pierwszych komputerów proste (prymitywne) zestawy komend łatwe w implementacji po stronie sprzętowej pisanie przy ich pomocy złożonych programów trudne FORTRAN zaprojektowany przez Johna Backusa z IBM w latach 50 poprzedniego stulecia pierwotnie przeznaczony do zapisu programów obliczeniowych usuwał niedogodności płynące z pisania bezpośrednio w kodzie maszynowym język kompilowany umożliwiający stosowanie nazywanych zmiennych, złożonych wyrażeń, procedur i wielu innych struktur typowych dla współczesnego imperatywnego języka programowania file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 4/15

C AREA OF A TRIANGLE - HERON'S FORMULA C INPUT - CARD READER UNIT 5, INTEGER INPUT C OUTPUT - C INTEGER VARIABLES START WITH I,J,K,L,M OR N READ(5,501) IA,IB,IC 501 FORMAT(3I5) IF(IA.EQ.0.OR. IB.EQ.0.OR. IC.EQ.0) STOP 1 S = (IA + IB + IC) / 2.0 AREA = SQRT( S * (S - IA) * (S - IB) * (S - IC) ) WRITE(6,601) IA,IB,IC,AREA 601 FORMAT(4H A=,I5,5H B=,I5,5H C=,I5,8H AREA=,F10.2, $13H SQUARE UNITS) STOP END ALGOL przełom lat 50 i 60 powstał we współpracy międzynarodowej jeszcze łatwiejsze programowanie algorytmów matematycznych de facto standard opisu algorytmów w publikacjach naukowych i podręcznikach instrukcje blokowe przekazywanie parametrów do procedur przez wartość i przez nazwę rekurencja wywoływanie procedur przez siebie tablice dynamiczne ich rozmiar mógł być ustalany w trakcie działania programu. słowa kluczowe symbole użyte jako słowa kluczowe nie mogą być użyte jako identyfikatory w programie typy danych definiowane przez użytkownika użytkownik mógł zdefiniować abstrakcyjne typy danych najlepiej pasujące do konkretnego problemu proc abs max = ([,]real a, ref real y, ref int i, k)real: comment The absolute greatest element of the matrix a, of si ze a by 2 a is transferred to y, and the subscripts of this element to i and k; comment begin real y := 0; i := a; k := 2 a; for p from a to a do for q from 2 a to 2 a do if abs a[p, q] > y then y := abs a[p, q]; i := p; k := q fi od od; y end # abs max # COBOL pierwsza wersja w 1960 język programowania stworzony i używany do tworzenia aplikacji biznesowych powstał jako rozwiązanie tymczasowe, Departament Obrony USA zmusił producentów komputerów do jego stosowania - rozpowszechniony na szeroką skalę file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 5/15

w ostatnich latach obserwuje się spadek znaczenia COBOLa w tworzeniu nowych aplikacji ustandaryzowany w 1968 roku od tego czasu ulepszany cztery razy (rozszerzenia dotyczyły wsparcia programowania obiektowego oraz strukturalnego) Basic Beginner's All-purpose Symbolic Instruction Code opracowany w 1964 przez Johna George'a Kemeny'ego i Thomasa E. Kurtza zainspirowany Fortranem i Algolem język programowania wysokiego poziomu założenia projektantów: łatwość użytkowania wszechstronność zastosowań interaktywność dobra komunikacja z użytkownikiem poprzez jasne komunikaty błędów istnieje ponad 200 różnych dialektów składnia zbliżona do języka naturalnego 10 PRINT "Witaj" 20 INPUT "Liczba gwiazdek do wyświetlenia: "; ile 30 PRINT "*" 40 LET ile = ile -1 50 IF ile > 0 THEN GOTO 30 Pascal język opracowany przez Niklausa Wirtha w 1970 roku szczyt popularności tego języka przypadł na lata 80. i początek 90 XX wieku inspirowany językiem Algol język do tworzenia strukturalnych aplikacji program fibonacci; var i, liczba: word; a, b, c: longint; begin writeln('podaj którą liczbę z ciągu Fibonacciego chcesz zoba czyć: '); readln(liczba); a := 1; b := 1; if liczba <= 2 then writeln('wynik: ', a) else begin for i := 3 to liczba do begin c := a+b; a := b; b := c; end; writeln('wynik: ', c); end; end. file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 6/15

C stworzony na początku lat siedemdziesiątych XX w. przez Dennisa Ritchiego do programowania systemów operacyjnych i innych zadań niskiego poziomu w 1973 r w języku C udało się zaimplementować jądro systemu operacyjnego Unix ostatnia norma została opublikowana w 2011 #include <stdio.h> int main() { int i, n, t1 = 0, t2 = 1, nextterm; printf("enter the number of terms: "); scanf("%d", &n); printf("fibonacci Series: "); for (i = 1; i <= n; ++i) { printf("%d, ", t1); nextterm = t1 + t2; t1 = t2; t2 = nextterm; } return 0; } gwałtowny wzrost zainteresowania językami zorientowanymi obiektowo od lat 80 XX w Smalltalk-80 (1980) file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 7/15

Programowanie proceduralne rozszerzenie (w sensie wbudowanych funkcji) i rodzaj (w sensie paradygmatu) programowania imperatywnego paradygmat programowania zalecający dzielenie kodu na procedury, czyli fragmenty wykonujące ściśle określone operacje procedury nie powinny korzystać ze zmiennych globalnych (w miarę możliwości) procedury powinny pobierać i przekazywać wszystkie dane (czy też wskaźniki do nich) jako parametry wywołania Programowanie strukturalne podział kodu źródłowego programu na procedury i hierarchicznie ułożone bloki wykorzystywanie struktur kontrolnych w postaci instrukcji wyboru i pętli paradygmat rozwijał się w w opozycji do programowania wykorzystującego proste instrukcje warunkowe i skoki zwiększa czytelność i ułatwia analizę programów początki przypadają na lata 60. XX wieku list Edsgera Dijkstry "Goto Statement considered harmful" struktury kontrolne sekwencja wykonanie ciągu kolejnych instrukcji wybór w zależności od wartości predykatu wykonywana jest odpowiednia instrukcja (if..then..else) iteracja wykonywanie instrukcji do momentu, aż jakiś warunek przestaje być spełniony (while, repeat, for lub do..until) podprogramy pozwalają na wydzielenie pewnej grupy instrukcji i traktowania ich jako pojedynczej operacji mechanizm abstrakcji bloki sekwencje instrukcji - blok traktowany jest jak pojedyncza instrukcja przy budowie programu wyróżniane na różne sposoby, np. if...fi (Algol) lub BEGIN...END (Pascal), wcięcia (Python), nawiasy (C/C++) file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 8/15

Programowanie obiektowe programy definiuje się za pomocą obiektów obiekty łączą stan (czyli dane, nazywane najczęściej polami) i zachowanie (czyli procedury, tu: metody) obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów komunikujących się pomiędzy sobą w celu wykonywania zadań ma ułatwić pisanie, konserwację i wielokrotne użycie programów lub ich fragmentów największy atut - zgodność takiego podejścia z rzeczywistością (mózg ludzki jest w naturalny sposób najlepiej przystosowany do takiego podejścia przy przetwarzaniu informacji) Podstawowe założenia abstrakcja każdy obiekt w systemie służy jako model abstrakcyjnego wykonawcy, który może wykonywać pracę, opisywać i zmieniać swój stan oraz komunikować się z innymi obiektami w systemie bez ujawniania, w jaki sposób zaimplementowano dane cechy hermetyzacja ukrywanie implementacji, enkapsulacja obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób tylko własne metody obiektu są uprawnione do zmiany jego stanu każdy typ obiektu prezentuje innym obiektom swój interfejs, który określa dopuszczalne metody współpracy pewne języki osłabiają to założenie, dopuszczając pewien poziom bezpośredniego (kontrolowanego) dostępu do wnętrzności obiektu (np. Python) polimorfizm referencje i kolekcje obiektów mogą dotyczyć obiektów różnego typu wywołanie metody dla referencji spowoduje zachowanie odpowiednie dla pełnego typu obiektu wywoływanego jeśli dzieje się to w czasie działania programu, to nazywa się to późnym wiązaniem lub wiązaniem dynamicznym dziedziczenie porządkuje i wspomaga polimorfizm i enkapsulację umożliwienia definiowanie i tworzenie specjalizowanych obiektów na podstawie bardziej ogólnych dla obiektów specjalizowanych nie trzeba redefiniować całej funkcjonalności, lecz tylko tę, której nie ma obiekt ogólniejszy Historia Simula 67 język do do zastosowań symulacyjnych stworzony przez Ole-Johana Dahla i Kristena Nygaarda z Norsk Regnesentral w Oslo Smalltalk rozwinięty w latach 70. i 80. w laboratoriach firmy Xerox (Xerox Palo Alto Research Center) zaprojektowany tak, aby połączyć dużą czytelność kodu z wszechstronną funkcjonalnością i elastycznością lata 80 XX w języki, które rozszerzono o wsparcie dla OOP C C++ Ada file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 9/15

Basic Lisp Pascal dodanie obiektowości do języków, które pierwotnie nie były do niej przystosowane, zrodziło szereg problemów z kompatybilnością i konserwacją kodu czysto obiektowym językom brakowało cech, z których programiści przyzwyczajeni byli korzystać podejmowano liczne próby stworzenia języków obiektowych dostarczających jednocześnie bezpiecznych elementów proceduralności: Eiffel Bertranda Meyera Java obiektowość rozprzestrzeniła się dość znacznie, jednak zwykle w systemach hybrydowych, w połączeniu z programowaniem niskopoziomowym (asembler), funkcyjnym (OCaml, niektóre dialekty Lispu), sieciowym (Java), skryptowym (Perl, Python, Ruby) systemy czysto obiektowe, jak Smalltalk, nie znalazły zbyt szerokiego zastosowania Programowanie deklaratywne rodzina paradygmatów programowania, które nie są z natury imperatywne programista opisuje warunki, jakie musi spełniać końcowe rozwiązanie (co chcemy osiągnąć) nie opisuje szczegółowej sekwencji kroków, które prowadzą do rozwiązania (jak to zrobić) programy traktowane są często jako pewne hipotezy wyrażone w logice formalnej, a wykonywanie obliczeń jako ich dowodzenie przedmiot zainteresowania naukowców, gdyż dzięki minimalizacji lub eliminacji skutków ubocznych może znacząco uprościć tworzenie programów współbieżnych warunki, jakie musi spełniać program, aby był uznany za deklaratywny (Peter Van Roy oraz Serif Haridi) niezależny wynik końcowy nie zależy od żadnego zewnętrznego stanu bezstanowy nie posiada stanu wewnętrznego, który jest zachowywany między wywołaniami deterministyczny dla takich samych argumentów wejściowych zawsze daje ten sam wynik dwa rodzaje języków deklaratywnych: opisowe opisuje wyłącznie struktury danych i spodziewany rezultat: taki język najczęściej nie jest zupełny w sensie Turinga lub osiąga zupełność w inny sposób deklaratywność służy do zwiększenia czytelności lub łatwiejszego opisu pewnych zjawisk przykłady: HTML (opis wyglądu strony internetowej), SQL (opis komunikacji z bazą danych) programowalne język, którego deklaratywny model obliczeń jest zupełny w sensie Turinga przykłady: Ocaml, XSLT, Prolog Kompletność Turinga cecha maszyny lub języka programowania, polegająca na tym, że można za jego pomocą rozwiązać identyczną klasę problemów obliczeniowych, jak na uproszczonym modelu programowalnego komputera zwanego maszyną Turinga. W praktyce oznacza to, że jeśli dany język lub maszyna potrafi wykonać lub wyrazić każdy algorytm, określany jest mianem zupełnego, przy czym nie jest wymagane, by algorytm ten realizowany był prosto, wydajnie bądź efektywnie. file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 10/15

Programowanie funkcyjne odmiana programowania deklaratywnego funkcje należą do wartości podstawowych nacisk kładzie się na wartościowanie (często rekurencyjnych) funkcji, a nie na wykonywanie poleceń w czystym programowaniu funkcyjnym, raz zdefiniowana funkcja zwraca zawsze tę samą wartość dla danych wartości argumentów (jak funkcje matematyczne) Historia podstawa teoretyczna - rachunek lambda (Alonzo Church, lata 30 XX w.) Information Processing Language (IPL) pierwszy język funkcyjny opracowany przez Allena Newella, Cliffa Shawa i Herberta Simona w połowie lat 50. XX wieku dla maszyny JOHNNIAC LISP przełom dla programowania funkcyjnego opracowany przez Johna McCarthy'ego pod koniec lat pięćdziesiątych stworzony dla maszyn IBM 700/7000 wprowadził wiele cech spotykanych we współczesnych językach programowania Scheme lata 70 XX w. uproszczenie i poprawienie języka LISP ML lata 70 XX w. opracowany przez Robina Milnera na Uniwersytecie w Edynburgu dał początek kilku dialektom, w tym Objective Caml oraz Standard ML Miranda lata 70 XX w. opracowany przez Davida Turnera na Uniwersytecie w Kent dał początek językowi Haskell F# rozwijany przez firmę Microsoft przeniesienie języka Objective Caml na platformę.net Podział języków funkcyjnych języki czysto funkcyjne języki, w których nie występują zmienne ani efekty uboczne, a wartościowanie jest leniwe wejście/wyjście w takich językach musi się odbywać jakimś alternatywnym mechanizmem, np. za pomocą monad przykłady: Haskell oraz Clean języki mieszane popularniejsze niż języki czysto funkcyjne umożliwiają stosowanie zmiennych pozwalają na efekty uboczne tradycyjne wejście/wyjście mieszanie stylu funkcyjnego z imperatywnym bądź obiektowym wartościowanie przeważnie zachłanne file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 11/15

przykłady: Lisp z wszystkimi pochodnymi (np. Clojure, Scheme) Erlang Scala języki grupy ML (Standard ML, OCaml, F#) Nemerle (projekt polskich studentów) elementy programowania funkcyjnego: Java, Python, Ruby, Perl, JavaScript, D Wartościowanie leniwe strategia wyznaczania wartości argumentów funkcji tylko wtedy, kiedy są potrzebne (na żądanie). Wartościowanie zachłanne strategia wyznaczania wartości argumentów funkcji przed jej wywołaniem. Efekty uboczne - w programowaniu dowolny efekt wyrażenia, lub wywołania funkcji, który wykracza poza zwrócenie wartości, np. interakcja z systemem operacyjnym, lub zmiana wartości zmiennej globalnej. Pomimo nazwy wiele funkcji jest wywoływanych właśnie dla uzyskania skutku ubocznego. Monada - rodzaj konstruktora abstrakcyjnego typu danych, używanego do wyrażania zmieniających się stanów obliczeń (operacji) zamiast znanych z modelu dziedzinowego zmieniających się stanów danych. (define hello-world (lambda () (display "Hello, World!") (newline) (hello-world))) (hello-world) file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 12/15

Programowanie logiczne odmiana programowania deklaratywnego program podawany jest jako pewien zestaw zależności obliczenia są dowodem pewnego twierdzenia w oparciu o te zależności umożliwia łatwy zapis wielu algorytmów programy logiczne łatwo jest wykonywać równolegle Prolog stworzony w 1971 roku przez Alaina Colmeraurera i Phillipe'a Roussela (Programmation en Logique) jeden z najpopularniejszych języków programowania logicznego powstał jako język do automatycznej analizy języków naturalnych język ogólnego zastosowania szczególnie dobrze sprawdza się w programach związanych ze sztuczną inteligencją program w Prologu składa się z faktów oraz reguł wnioskowania aby go uruchomić, należy wprowadzić odpowiednie zapytanie opiera się o rachunek predykatowy pierwszego rzędu, jednak ogranicza się tylko do klauzul Horna istnieją jednak wbudowane predykaty wyższego rzędu cat(tom) :- true.?- cat(tom). Yes?- cat(x). X = tom Paradygmaty w Pythonie imperatywny strukturalny/proceduralny funkcjonalny obiektowy Zadanie Chcemy zsumować listę liczb MyList = [1,2,3,4,5] Programowanie funkcyjne file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 13/15

In [2]: import functools MyList = [1,2,3,4,5] def AddIt(X,Y): return X+Y Sum = functools.reduce(addit,mylist) print(sum) 15 To samo z wykorzystaniem funkcji lambda: In [3]: import functools MyList = [1,2,3,4,5] Sum = functools.reduce(lambda x,y: x+y, MyList) print(sum) 15 Programowanie imperatywne In [4]: MyList = [1,2,3,4,5] Sum = 0 for x in MyList: Sum += x print(sum) 15 Programowanie obiektowe file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 14/15

In [5]: class ChangeList: def init (self,mylist): if type(mylist) is list: self.mylist = MyList else: self.mylist = [] def DoAdd(self): self.sum = sum(self.mylist) CreateSum = ChangeList([1,2,3,4,5]) CreateSum.DoAdd() print(createsum.sum) 15 Programowanie strukturalne In [6]: def DoAdd(MyList): Sum = 0 if type(mylist) is list: for x in MyList: Sum += x return Sum MyList = [1,2,3,4,5] print(doadd(mylist)) 15 In [ ]: file:///home/szwabin/dropbox/zajecia/programowanie/lectures/1.html 15/15