Wydział Matematyki, Informatyki i Mechaniki
Magisterskie Studia Uzupełniające
na kierunku informatyka
Program zajęć - ROK I
Rodzaj: wykład (20) z ćwiczeniami (20), egzamin, I trymestr
Autorzy programu: P. Urzyczyn, I. Walukiewicz
Sylabus:
- Zbiory, relacje, funkcje:
- operacje na zbiorach,
- rodzaje relacji,
- relacja równoważności, zasada abstrakcji,
- funkcje, obrazy, przeciwobrazy
- pojęcie porządku, elementy wyróżnione,
- ograniczenia i kresy,
- lemat Kuratowskiego-Zorna,
- twierdzenie Tarskiego o punkcie stałym.
- aksjomaty Peano,
- liczby von Neumeanna,
- zbiory przeliczalne i nieprzeliczalne,
- rozumowanie przekątniowe na przykładzie twierdzenia Cantora,
- uporządkowanie dobre i częściowe dobre (dobre ufundowanie),
- indukcja w zbiorach dobrze ufundowanych.
- sygnatura algebraiczna,
- pojęcie podalgebry, homomorfizmu, kongruencji,
- pierwsze twierdzenie o homomorfiźmie.
- algebry słów i drzew binarnych,
- pojęcie termu i równania,
- definiowanie równościowe klas algebr,
- indukcja strukturalna.
- algorytm unifikacji,
- poprawność,
- złożoność,
- zastosowania unifikacji.
- algebra Boole'a,
- funkcjonalna zupełność,
- analogia z algebrą zbiorów, wartościowania w ciałach zbiorów.
- operacje na słowach i językach,
- języki regularne jako rozwiązania równań (punkty stałe),
- algebra wyrażeń regularnych,
- charakteryzacja regularności przez ilorazy.
- jezyki bezkontekstowe jako punkty stałe,
- gramatyki bezkontekstowe.
- J. Tiuryn, "Wstęp do teorii mnogości i logiki", skrypt dla studentów UW, 1997.
- J. Hopcroft, J. Ullman, "Wprowadzenie do teorii automatów, języków i obliczeń", PWN, 1994.
D. Kozen, "Automata and Computability", Springer, 1997.
Rodzaj: wykład (20) z ćwiczeniami (20), egzamin, II trymestr
Autorzy programu: P. Urzyczyn, I. Walukiewicz
Sylabus:
- Automaty skończone:
- automaty deterministyczne i niedeterministyczne,
- charakteryzacja języków regularnych przez automaty,
- lemat o pompowaniu.
- charakteryzacja języków bezkontekstowych przez automaty,
- lemat o pompowaniu,
- języki kontekstowe - przykłady.
- definicja i przykłady,
- klasy LR(k), zastosowania w kompilatorach,
- własności domknięcia języków bezkontekstowych.
- gramatyki typu 0,
- maszyny Turinga,
- teza Churcha, inne modele obliczeń.
- zbiory rekurencyjnie przeliczalne (algorytmy częściowe),
- problem stopu,
- problem odpowiedniości Posta,
- rozstrzygalne i nierozstrzygalne problemy z teorii jezyków.
- konkretne (z praktyki matematyczno/informatycznej) problemy rozstrzygalne i nierozstrzygalne, wg. wyboru prowadzącego.
- pojęcie złożoności czasowej i pamięciowej,
- zależności między klasami złożoności,
- złożoność wielomianowa.
- problem spełnialności,
- inne problemy NP-zupełne,
- informacja o klasie co-NP.
- klasa PSPACE, rachunek zdań drugiego rzędu,
- przykłady zadań trudnych dla czasu wykładniczego,
- sieci Boolowskie, klasa NC.
- J. Hopcroft, J. Ullman, "Wprowadzenie do teorii automatów, języków i obliczeń", PWN, 1994.
- D. Kozen, "Automata and Computability", Springer-Verlag, 1997.
- D. Niwiński, Notatki do wykładu "Języki, automaty i obliczenia".
Rodzaj: wykład (20) z ćwiczeniami (20), egzamin, III trymestr
Autorzy programu: P. Urzyczyn, I. Walukiewicz
Sylabus:
- Klasyczny rachunek zdań i rachunek predykatów:
- składnia i formalna semantyka.
- tautologie pierwszego rzędu, przykłady,
- wnioskowanie w rachunku zdań (w stylu Hilberta),
- wnioskowanie w rachunku pierwszego rzędu.
- pojęcie pełności systemu dowodzenia,
- szkic dowodu pełności dla rachunku zdań,
- informacja o pełności rachunku kwantyfikatorów.
- twierdzenie o zwartości, przykładowe konsekwencje,
- pojęcie zupełności, przykłady teorii rozstrzygalnych,
- nierozstrzygalność logiki klasycznej pierwszego rzędu,
- informacja o niezupełności i nierozstrzygalności arytmetyki.
- wnioskowanie w stylu Gentzena,
- informacja o twierdzeniu o eliminacji cięcia.
- dowodzenie klauzul Horna z aksjomatów,
- rezolucja jako wariant eliminacji cięcia,
- informacja o programowaniu w logice.
- naturalna dedukcja,
- analogie między formułami i typami,
- normalizacja.
- logiki Hoare'a,
- logika algorytmiczna i dynamiczna,
- logiki temporalne.
- tematyka do wyboru przez prowadzącego, np. rachunek lambda lub teoria skończonych modeli.
- J. Tiuryn, "Wstęp do teorii mnogości i logiki", skrypt dla studentów UW, 1997.
- H.-D. Ebbinghaus, J. Flum, W. Thomas, "Mathematical Logic", Springer-Verlag, 1984.
- J.H. Gallier, "Logic for Computer Science", Harper and Row, 1986.
- N. Wirth, "Wstęp do programowania systematycznego", WNT, 1978.
Rodzaj: wykład (20) z ćwiczeniami (20), egzamin, I trymestr
Autorzy programu: B. Chlebus, K. Diks
Sylabus:
- Równania rekurencyjne:
- funkcje tworzące,
- liczby harmoniczne, Fibonacciego, Catalana.
- notacje asymptotyczne,
- szacowanie rozwiązań równań typu "dziel i rządź",
- rozkład na cykle,
- inwersje i znak permutacji,
- algorytmy generowania permutacji.
- współczynniki dwumianowe,
- zasada włączania-wyłączania.
- drogi, cykle, drzewa,
- składowe: spójne, silnie spójne, 2-spójne,
- cykle Eulera.
- grafy planarne, wzór Eulera,
- kolorowania grafów, liczba chromatyczna,
- twierdzenie Brooksa i twierdzenie Visinga.
- minimalne drzewa rozpinające, algorytm Kruskala,
- algorytmy zachłanne i matroidy,
- przepływy w sieciach.
- tw. Mengera o rozłącznych drogach w grafach,
- tw. Dilwortha o częściowych porządkach,
- tw. Halla o systemach różnych reprezentantów,
- tw. Koeniga, skojarzenia w grafach dwudzielnych,
- tw. Ramseya,
- cykle Hamiltona i tw. Ore.
- podzielność, NWD, algorytm Euklidesa,
- liczby pierwsze, podstawowe tw. arytmetyki,
- chińskie tw. o resztach,
- małe tw. Fermata i uogólnienie Eulera,
- poprawność metody RSA szyfrowania z kluczem jawnym.
- prawdopodobieństwo warunkowe i niezależność,
- zmienne losowe, wartość oczekiwana, wariancja, nierówność Czebyszewa,
- funkcje tworzące rozkładów prawdopodobieństwa,
- metoda probabilistyczna.
- W. Feller, "Wstęp do rachunku prawdopodobieństwa", PWN, 1987.
- R.L. Graham, D. E. Knuth, O. Patashnik, "Matematyka konkretna", PWN, 1996.
- W. Lipski, "Kombinatoryka dla programistów", WNT, 1982.
- V. Bryant, "Aspekty kombinatoryki", WNT, 1997.
Rodzaj: wykład (20) z ćwiczeniami (20), egzamin, II trymestr
Autorzy programu: B. Chlebus, K. Diks
Sylabus:
- Poprawność i złożoność obliczeniowa algorytmów:
- niezmienniki i częściowa poprawność,
- własność stopu,
- rodzaje złożoności obliczeniowej: czasowa, pamięciowa, pesymistyczna, średnia, amortyzowana.
- haszowanie łańcuchowe,
- adresowanie otwarte: liniowe, kwadratowe, podwójne; algorytm Brenta,
- haszowanie zewnętrzne,
- funkcje haszujące, uniwersalne rodziny funkcji haszujących.
- wyszukiwanie sekwencyjne, listy samoorganizujące się,
- wyszukiwanie binarne w tablicach uporządkowanych,
- wyszukiwanie interpolacyjne,
- drzewa wyszukiwań binarnych.
- 2-3 drzewa,
- drzewa AVL,
- drzewa samoorganizujące się,
- B-drzewa, pliki indeksowe.
- algorytmy selekcji: Hoare'a i "magicznych piątek",
- kopce: drzewa lewicowe, kolejki dwumianowe i kopce Fibonacciego,
- kolejka van Emde-Boasa.
- dolne granice,
- QuickSort, HeapSort, RadixSort,
- sortowanie zewnętrzne: sortowanie wielofazowe, zewnętrzny QuickSort.
- A.V. Aho, J.E. Hopcroft, J.D. Ullman, "Projektowanie i analiza algorytmów komputerowych", PWN, 1983.
- L. Banachowski, K. Diks, W. Rytter, "Algorytmy i struktury danych", WNT, 1996.
- T.H. Cormen, C.E. Leiserson, R.L. Rivest, "Wprowadzenie do algorytmów", WNT, 1997.
Rodzaj: wykład (20) z ćwiczeniami (20), egzamin, III trymestr
Autorzy programu: B. Chlebus, K. Diks
Sylabus:
- Algorytmy grafowe:
- komputerowe reprezentacje grafu,
- algorytm Floyda-Warshalla,
- metody przeszukiwania grafu,
- znajdowanie składowych: spójnych, 2-spójnych, silnie-spójnych.
- wyszukiwanie geometryczne,
- otoczka wypukła,
- problemy bliskości, diagramy Voronoi,
- geometria prostokątów.
- wyszukiwanie wzorca w tekście: algorytmy KMP i BM,
- kompresja tekstów: statyczne i dynamiczne kodowanie Huffmana,
- kompresja Ziv-Lempela.
- dyskretna i szybka transformacja Fouriera,
- algorytmy dla wielomianów,
- szybkie mnożenie Schoenhage-Strassena.
- arytmetyka modularna,
- randomizowane rozpoznawanie liczb pierwszych,
- implementacja i bezpieczeństwo RSA.
- A.V. Aho, J.E. Hopcroft, J.D. Ullman, "Projektowanie i analiza algorytmow komputerowych", PWN, 1983.
- E. Bach, J. Shallit, "Algorithmic Number Theory", MIT Press, 1996.
- L. Banachowski, K. Diks, W. Rytter, "Algorytmy i struktury danych", WNT, 1996.
- T.H. Cormen, C.E. Leiserson, R.L. Rivest, "Wprowadzenie do algorytmów", WNT, 1997.
Rodzaj: wykład (20) z ćwiczeniami (20), egzamin, I trymestr
Autorzy programu: P. Chrząstowski, J. Jabłonowski, A.
Zaroda
Sylabus:
- Wstęp:
- poprawność programów, niezmienniki, warunek stopu,
- składnia i semantyka języków programowania,
- języki programowania:
- historia,
- klasyfikacja (języki niskiego i wysokiego poziomu, paradygmaty programowania),
- realizacja języków programowania: interpreter, kompilator,
- budowa kompilatora,
- czas życia programu.
- gramatyki regularne, wyrażenia regularne, automaty skończone,
- gramatyki bezkontekstowe, BNF, diagramy składniowe, automaty ze stosem.
- program jako ciąg leksemów,
- preprocesor,
- analiza leksykalna,
- składnia konkretna i abstrakcyjna języka, drzewo struktury,
- gramatyki niejednoznaczne,
- analiza składniowa.
- metoda zejść rekurencyjnych,
- edytory strukturalne,
- translacja sterowana składnią,
- gramatyki atrybutywne,
- narzędzia wspomagające budowanie analizatorów leksykalnych i składniowych,
- opis pozostałych elementów języka programowania:
- kontekstowe warunki poprawności programów,
- semantyka języka.
- przykłady budowy maszyn rzeczywistych,
- maszyny abstrakcyjne,
- asembler i postać binarna programów,
- typy proste i reprezentacja ich wartości:
- liczby całkowite i rzeczywiste,
- typy wyliczeniowe,
- wartości logiczne, pełne i skrócone obliczanie,
- wskaźniki (więcej na ich temat przy omawianiu zarządzania pamięcią),
- typy złożone i reprezentacja wartości:
- tablice o statycznych i dynamicznych zakresach,
- rekordy, rekordy z wariantami,
- zbiory,
- napisy.
- wyrażenia,
- podtypy,
- kontrola typów, system typów,
- równoważność typów,
- koercje, przeciążenie operatorów i identyfikacja operacji,
- polimorfizm (typ jako parametr),
- przypisanie i instrukcje złożone (IF, WHILE, CASE itd.) oraz ich tłumaczenie.
- struktura blokowa,
- statyczne i dynamiczne wiązanie deklaracji,
- tablica symboli,
- procedury i funkcje w językach programowania,
- rekordy aktywacji, stos, rekursja,
- protokół wywołania i powrotu z procedury/funkcji,
- sposoby przekazywania parametrów,
- procedury/funkcje jako parametry,
- adresowanie w zagnieżdżonych procedurach/funkcjach, SL, display.
- inne tematy zwiazane z procedurami i funkcjami:
- rozwijanie procedury w miejscu wywołania,
- rekursja końcowa,
- wywołanie procedury wirtualnej,
- współprogramy,
- wyjątki,
- alokacja statyczna i dynamiczna, organizacja pamięci,
- kopiec (heap),
- zarządzanie wolną pamięcią,
- wskaźniki, powiewające odwołania,
- odśmiecanie: przykładowe algorytmy.
- reprezentacje pośrednie programu:
- drzewo struktury,
- ciągi czwórek,
- proste bloki,
- graf przepływu sterowania,
- techniki generacji kodu:
- wybór instrukcji,
- zarządzanie rejestrami,
- cele i możliwości optymalizacja kodu,
- podstawowe techniki optymalizacji:
- optymalizacje lokalne,
- problemy z aliasami,
- optymalizacja pętli,
- inne optymalizacje globalne,
- postoptymalizacja.
- podział programu na moduły,
- niezależna kompilacja,
- biblioteki,
- scalanie,
- narzędzia wspomagające pracę programisty:
- odpluskwianie,
- badanie profilu dynamicznego programu,
- generatory interfejsu użytkownika itp.,
- przegląd języków programowania i dostępnych realizacji, kryteria wyboru.
- R. Sethi, "Programming Languages. Concepts & constructs", 2 wyd, Addison-Wesley, 1996.
- A. Aho, R. Sethi, J.D. Ullman, "Compilers: Principles, Techniques and Tools", Addison-Wesley, 1986.
- C.N. Fisher, R.J. LeBlanc, "Crafting a Compiler", Benjamin Cummings, 1988.
- H.F. Ledgard, "Mała księga programowania obiektowego", WNT, 1998.
Rodzaj: wykład (20) z ćwiczeniami (20), egzamin, II trymestr
Autorzy programu: P. Chrząstowski, J. Jabłonowski, A. Zaroda
Sylabus:
Część pierwsza: programowanie obiektowe
- Wstep: podejście obiektowe:
- co to jest podejście obiektowe,
- obiekty i klasy,
- polimorfizm,
- komunikaty i metody postępowania,
- ukrywanie informacji,
- hierarchie klas i dziedziczenie,
- relacje is-a i has-a,
- zalety programowania obiektowego.
Projektowanie przykładowych hierarchii klas (bez implementacji, ale z deklarowaniem w klasach metod i atrybutów oraz uwzględnianiem dziedziczenia)
- prosty przykład (np. hierarchia klas pojazdów z podziałem na jeżdżące, latające, pływające, silnikowe i bezsilnikowe, przeznaczone do przewozu osob/towarów itp.),
- wyrażenia arytmetyczne.
- obiekty i klasy,
- komunikaty i metody,
- metody obiektowe i klasowe,
- zmienne obiektowe i klasowe,
- operator ^, operacja :=, self,
- dziedziczenie.
Prezentacja Smalltalku (przy komputerach):
- definiowanie klas i podklas,
- pisanie i wykonywanie zestawów instrukcji Smalltalku,
- przyrostowe pisanie i testowanie programu.
- dopasowywanie metody do komunikatu, super,
- liczby, wartości logiczne,
- blok,
- metoda perform,
- realizacja instrukcji sterujących w Smalltalku (klasy Boolean, Context, Number).
Implementacja hierarchii wyrażeń z pierwszych ćwiczeń,
- klasa Collection,
- hierarchia klas kolekcji,
- komunikaty rozumiane przez wszystkie kolekcje, konwersje,
- klasy Array, OrderedCollection.
Przykłady użycia kolekcji.
- dalsze przykłady kolekcji (klasy Dictionary, Set, Bag, SortedCollection, String),
- strumienie.
Przykładowy większy program w Smalltalku (przy komputerze): klasa Graf (zrealizowana przy pomocy kolekcji) wraz z algorytmem obchodzenia sparametryzowanym strukturą danych
- omówienie realizacji grafu w Smalltalku i zapisanie metod (wspólnie przy tablicy),
- uruchomienie programu tworzącego graf i obchodzącego go z wypisywaniem wierzchołków (indywidualnie na komputerach).
- P. Coad, J. Nicola, "Programowanie obiektowe", Oficyna Wydawnicza README, 1994.
- J. Martin, J.J. Odell, "Podstawy metod obiektowych", WNT, 1998.
- Celem pierwszego wykładu jest przedstawienie obiektowego sposobu myślenia, dlatego (poza ostatnim punktem) nie mówi się w nim o programowaniu obiektowym (temu będą poświecone następne wykłady), lecz o podejściu obiektowym.
- Komputery będą wykorzystywane tylko na dwóch zajęciach (ze względu na małą liczbę zajęć).
- Piąte ćwiczenia wymagają przygotowania dla studentów gotowych klas Stos i Kolejka.
- Wprowadzenie, podstawowe pojęcia:
- współbieżność w sprzęcie i systemach operacyjnych, procesy,
- systemy z podziałem czasu procesora, systemy wieloprocesorowe, sieci komputerowe,
- programy współbieżne: synchronizacja i komunikacja procesów,
- poprawność programów współbieżnych (zapewnianie, żywotność) i jej brak (zagłodzenie, blokada), dowodzenie (pojęcie przeplotu),
- kryteria dobrego rozwiązania problemu współbieżnego,
- dzielenie zasobów: problem jedzących filozofów, przykład blokady,
- pamięć dzielona, konflikty przy dostępie,
- rozwiązanie problemu sekcji krytycznej algorytmem Dekkera (na ćwiczeniach).
- potrzeba istnienia mechanizmów wspierających programowanie współbieżne,
- definiacje semaforów, semafory binarne, inne typy semaforów,
- realizacja semafora,
- rozwiązanie problemu producentów i konsumentów,
- rozwiązanie problemu jedzących filozofów,
- rozwiązanie problemu czytelników i pisarzy (na ćwiczeniach).
- semafory i pamięć dzielona w Unixie,
- niestrukturalność semaforów,
- monitory: przykład definicji, związki z abstrakcyjnymi typami danych i jądrem systemu operacyjnego,
- rozwiązanie problemu producentów i konsumentów przy pomocy monitorów,
- odpowiedniki monitorów w Adzie 95,
- realizacja semaforów przy pomocy monitorów i odwrotnie (na ćwiczeniach),
- rozwiązanie problemu czytelników i pisarzy przy pomocy monitorów (na ćwiczeniach).
- systemy bez dzielonej pamięci,
- synchronizacja przez spotkanie (na przykładzie języka Ada),
- rozwiązanie problemu czytelników i pisarzy,
- rozwiązanie problemu producentów i konsumentów (na ćwiczeniach).
- inne mechanizmy programowania rozproszonego (CSP/occam, Linda, PVM, MPI),
- programowanie rozproszone w systemie Unix,
- porównanie mechanizmów programowania współbieżnego i podsumowanie.
- M. Ben-Ari, "Podstawy programowania współbieżnego i rozproszonego", WNT, 1996
- Z. Weiss, T. Gruźlewski, "Programowanie współbieżne i rozproszone w przykładach i zadaniach", WNT, 1993.
- Przykładowe programy będziemy pisać w Adzie.
Rodzaj: wykład (20) z ćwiczeniami (20), egzamin, III trymestr
Autorzy programu: P. Chrząstowski, J. Jabłonowski, A. Zaroda
Sylabus:
Część pierwsza: programowanie funkcyjne
- Wstęp: podstawowe konstrukcje:
- literały (liczbowe, znakowe, napisowe, logiczne), wyrażenia, arytmetyka, if,
- let - deklaracje nazw lokalnych dla wartości prostych i dla funkcji,
- rekurencja (rec), wzajemna rekurencja, wywołanie ogonowe.
- proste wyrażenia logiczne i arytmetyczne,
- przykłady let z zasłanianiem (struktura blokowa),
- funkcje arytmetyczne: dodawanie, wyliczanie pierwiastków wielomianów 2 stopnia, silnia, funkcja Fibonacciego (w wersji naiwnej i w wersji z akumulatorem jako przykład definicji funkcji lokalnej), NWD, potęgowanie przez połowienia, sprawdzanie pierwszości liczby, liczenie odstępu między danymi datami (podanymi w postaci trójek liczb).
- dopasowywanie wzorcOw (match),
- listy - konstruktory, listy liczb,
- przykłady: generacja listy liczb pierwszych, względnie pierwszych.
- silnia i funkcja Fibonacciego zapisane z użyciem dopasowywania wzorców,
- listy liczb: długość (z akumulatorem i bez), sumowanie elementow listy, wymnażanie elementów listy,
- operacje na dużych liczbach zapisanych jako listy cyfr (dodawanie i odejmowanie, może także mnożenie i najprostsze dzielenie)
- reprezentacja macierzy prostokątnych w postaci listy list i operacje macierzowe (dodawanie i mnożenie macierzy, transpozycja),
- quicksort i mergesort listy.
- typy bazowe i typy funkcyjne (monomorficzne),
- function, proste funkcje anonimowe (inc, dec, odd, even),
- deklaracja funkcji postaci let id=function ...,
- dalsze przykłady: testowanie pierwszości liczby,
- funkcja iteracji (powtarzanie aplikacji funkcji do spełnienia warunku) i przykładowe zastosowanie (np. sumowanie szeregów arytmetycznych),
- definicje funkcji w postaci Curry'ego.
- zastosowanie funkcji iteracji z wykładu: aproksymowanie miejsc zerowych funkcji rzeczywistych, całkowanie numeryczne,
- funkcja fold i zapisanie przy jej użyciu typowych operacji listowych,
- realizacja słownika w postaci funkcji wyższego rzędu ze zmiennymi lokalnymi.
- algebraiczne typy danych
- przykłady: własna definicja list liczb, drzewa binarne i operacje na nich, (wyszukiwanie elementu, spłaszczanie drzewa, wyliczanie wysokości, odbicie lustrzane),
- drzewa o dowolnym stopniu wierzchołka (i operacje jak dla drzew binarnych),
- wyjątki - głowa listy pustej, brak elementu w liście lub drzewie, wyjątki standardowe.
- drzewa BST (bez operacji usuwania elementow), obchodzenie drzewa w typowych porządkach, sortowanie przez spłaszczanie,
- symboliczna reprezentacja wyrażeń algebraicznych, wyliczanie wartości, różniczkowanie symboliczne.
- typy polimorficzne,
- przykłady: listy polimorficzne (i operacje member, map itp.),
- drzewa polimorficzne,
- słowniki z powtórzeniami elementów (i operacjami wstawiania, usunięcia, wyszukania, wyszukania wszystkich).
- implementacja słownika w oparciu o drzewa BST,
- rekursory dla drzew i przykłady ich wykorzystania (wyliczanie wartości drzewa, wyszukiwanie elementu).
- wejście-wyjście, znaki specjalne (np. \n), strumienie stdin, stdout, stderr, operacje plikowe,
- tablice,
- referencje,
- modyfikowalne struktury danych.
- liczenie słów w pliku, kopiowanie plików, histogram częstości występowania słów w pliku (z wykorzystaniem tablic),
- prosta arytmetyka macierzy - tym razem na tablicach,
- rozwiązywanie układów równań liniowych (np. eliminacja Gaussa).
- moduły - struktury, sygnatury, (porządek, równość, liczby zespolone),
- funktory - sortowanie.
- struktury dla stosów i kolejek z różnymi implementacjami (np. przy użyciu list, tablic).
- J. D. Ullman, "Elements of ML Programming", Prentice Hall, 1994.
- L. C. Paulson, "ML for the Working Programmer", 2 wyd., Cambridge University Press, 1996.
Proponowanym językiem programowania na te zajęcia jest Objective Caml.Część druga: programowanie w logice
- Wstęp, teoretyczne podstawy programowania w logice:
- deklaratywność: program jako specyfikacja problemu (program = logika + sterowanie),
- zastosowania (ogólnie),
- przypomnienie logiki pierwszego rzędu,
- reguły wnioskowania, reguła rezolucji,
- programy w logice (klauzule Horna),
- algorytm uzgadniania,
- SLD-rezolucja, tw. o poprawności i pełności,
- przykład: program slow_sort.
- semantyka deklaratywna i operacyjna programów w logice,
- przestrzeń poszukiwań (SLD-drzewo),
- mechanizm przeszukiwania i nawracania
- wielofunkcyjność programów w logice (klasyczny przykład append),
- zmienne logiczne (przykład: kolorowanie mapy),
- programowanie deklaratywne w Prologu,
- mechanizmy sterowania (odcięcie - zielone i czerwone).
- reprezentacje struktur danych (termy, klauzule),
- przykłady obu sposobów reprezentacji (binarne drzewa wyszukiwan, grafy),
- techniki programowania w Prologu, technika "generuj i testuj" (przykład: problem n hetmanów),
- dynamiczne modyfikowanie programu i programy uczące się,
- wejście/wyjście i arytmetyka w Prologu (na ćwiczeniach),
- listy różnicowe (na ćwiczeniach).
- U. Nilsson, J. Małuszyński, "Logic, Programming and Prolog", 2 wyd., John Wiley, 1995.
- L. Sterling, E. Shapiro, "The Art of Prolog", 2 wyd., MIT, 1994.
- F.Kluźniak, S.Szpakowicz, "Prolog for Programmers", Academic Press,1985.
Rodzaj: laboratorium (40), zaliczenie na ocenę, I trymestr
Autorzy programu: P. Chrząstowski, J. Jabłonowski, A. Zaroda
Sylabus:
- Wstęp, niektóre konstrukcje C++:
- powtórzenie C,
- przeciążanie funkcji,
- argumenty domyślne,
- referencje,
- uwagi o stylu, komentowanie i dokumentowanie programów,
- do zrealizowania przez studentów: prosty program ilustrujący poznane, mechanizmy (podobnie przez trzy następne tygodnie).
- klasa jako połączenie danych i operacji,
- konstruktory i destruktory,
- zarządzanie pamięcią,
- publiczne i prywatne składowe klasy.
- przeciążanie operatorów,
- przypisanie i konstruktor kopiujący,
- funkcje i klasy zaprzyjaźnione,
- składowe statyczne,
- operatory konwersji.
- wejście-wyjście programu, strumienie,
- szablony,
- kolekcje i iteratory.
- wyróżnienie interfejsu i implementacji,
- pliki nagłówkowe i programy "wieloplikowe",
- omówienie treści zadania zaliczeniowego i początek prac nad nim (do końca trymestru część każdych zajęć będzie przeznaczona na prace nad tym zadaniem).
- niezależna kompilacja, łączenie,
- program "make",
- tworzenie bibliotek,
- praca zespołowa, "programming by contract".
- przykład: LEX (w zakresie potrzebnym do realizacji zadania zaliczeniowego),
- wykorzystanie narzędzia przy tworzeniu programu zaliczeniowego.
- przykład: YACC (w zakresie potrzebnym do realizacji zadania zaliczeniowego),
- podstawy analizy składniowej metodą LR.
- zakończenie prac nad programem zaliczeniowym,
- podsumowanie.
- B. Stroustrup, "Jezyk C++", WNT, 1995.
- Zadanie zaliczeniowe powinno uwzględniać podział na moduły oraz implementację abstrakcyjnej struktury danych. Każdy student będzie pracował indywidualnie nad modułem według specyfikacji przygotowanej przez prowadzącego zajęcia, który przygotuje także moduł, z którym będą łączone programy studenckie. Cześć zadania wymagająca użycia programów LEX i YACC nie powinna być kluczowa, tzn. program powinien dać się uruchomić także bez niej, gdyż pozwoli to studentom na wczesne testowanie swoich modułów.
- Zajęcia mają się składać z dwóch części. Pierwsza zawiera omówienie tematu danych zajęć (przez prowadzącego), połączone z uruchomieniem małych przykładów na komputerze (przez studentów). Druga jest przeznaczona na realizację przez studentów zadania semestralnego oraz na konsultacje. Podział czasu między te dwie części jest płynny, w szczególności początkowo (dopóki nie zostanie sformulowane zadanie semestralne) cześć druga będzie pusta, zaś pod koniec semestru ta cześć będzie zajmowała wiekszość czasu zajęć (w szczególności całe przedostatnie zajęcia). Podobne zasady pracy będą obowiazywaly na zajęciach laboratoryjnych w pozostalych dwóch trymestrach.
Rodzaj: laboratorium (40), zaliczenie na ocenę, II trymestr
Autorzy programu: P. Chrząstowski, J. Jabłonowski, A. Zaroda
Sylabus:
- Wstęp, dokumenty HTML
- udostępnianie informacji w Internecie,
- struktura dokumentu w HTML, nagłówki, paragrafy,
- formatowanie tekstu,
- listy, tabele,
- ilustracje,
- połączenia z innymi zasobami,
- pierwsze zadanie zaliczeniowe: prosta strona HTML.
- ramki,
- inne elementy HTML,
- dobry styl dokumentów w HTML,
- przykład edytora stron HTML,
- zakończenie pracy nad pierwszym zadaniem zaliczeniowym.
- realizacja Javy, uruchamianie programów, przenośność,
- różnice w stosunku do C++ (których konstrukcji w Javie nie ma),
- podstawy jezyka:
- zmienne i typy proste, operatory, wyrażenia
- instrukcje strukturalne,
- tablice i napisy,
- klasy i ich instancje, konstruktory,
- wywołanie metody,
- prezentacja wybranego środowiska zintegrowanego dla Javy,
- na tych oraz następnych ćwiczeniach wprowadzane pojęcia ilustrujemy prostymi programami zaliczeniowymi.
- zarządzanie pamięcią,
- finalizacja obiektu,
- kontrola dostępu do elementów klas,
- dziedziczenie,
- odwołania do metod nadklasy,
- klasy i metody abstrakcyjne,
- zmienne i metody klasowe.
- klasy i metody finalne,
- zagnieżdżanie klas,
- interfejsy,
- pakiety, deklaracje importu,
- wyjątki,
- początek pracy nad dużym zadaniem zaliczeniowym, na razie bez interfejsu użytkownika.
- wejście-wyjście,
- kolekcje,
- inne klasy standardowe,
- budowa programu z interfejsem użytkownika,
- podstawowe komponenty interfejsu użytkownika.
- programy sterowane zdarzeniami,
- komponenty interfejsu użytkownika, cd.
- do zadania zaliczeniowego dodajemy interfejs użytkownika.
- połączenie ze stronami HTML,
- czas życia apletu,
- standardowe elementy interfejsu użytkownika,
- prosty aplet jako zadanie dla studentów.
- tworzenie wątków,
- synchronizacja,
- dodajemy (o ile będzie to możliwe) wielowątkowość do zadania zaliczeniowego.
- inne tematy związane z Javą (programowanie sieciowe, JavaScript, JavaBeans itd.)
- zakończenie prac nad programem zaliczeniowym.
- K. Arnold, J. Gossling, "The Java Programming Language", WNT, 1998.
- Naszym celem jest przedstawienie problematyki zwiazanej z "programowanie
Internetu", czyli tworzeniem stron WWW z wykorzystaniem HTML i apletów
w Javie. Chcemy także przedstawić Javę jako język umożliwiający pisanie
dużych aplikacji, ze szczególnym uwzględnieniem programowania obiektowego.
Przy omawianiu każdej konstrukcji związanej z programowaniem obiektowym
w Javie będziemy podawać jej odpowiednik (o ile taki istnieje) w C++, ale
bez jego dłuższego omawiania.
Rodzaj: laboratorium (40), zaliczenie na ocenę, III trymestr
Autorzy programu: P. Chrząstowski, J. Jabłonowski, A. Zaroda
Sylabus:
- Programowanie wizualne:
- co to jest,
- dlaczego wiąże się z programowaniem obiektowym,
- dlaczego nie zastępuje zwykłego programowania,
- co to jest komponent, jakie ma cechy, czy musi byc widoczny,
- jak powinien wyglądać dobry interfejs programu,
- przegląd kompenentow w Delphi (tzn. ogólne omowienie grup komponentów oraz szczegółowe omówienie kilku wybranych).
- deklarowanie klas (pola, metody, własności),
- rodzaje składowych (published, public, protected, private),
- rodzaje metod (statyczne, wirtualne, dynamiczne, metody abstrakcyjne),
- konstruktory i destruktory,
- self,
- struktura programu w Delphi.
- dziedziczenie,
- operatory is i as,
- obsługa komunikatów (w stylu Windows),
- metody klasowe,
- klasy TObject i TClass.
- przedstawienie rodzajów struktur danych,
- dokładne omówienie kilku przykładów,
- przedstawienie zadania semestralnego.
- struktura komponentu,
- etapy tworzenia komponentu i włączania go do środowiska.
- biblioteki DLL.
- komponenty realizujące DDE/OLE,
- uwagi o architekturze klient/serwer.
- wyjątki,
- typ Variant,
- typ Pchar.
- podsumowanie,
- odbiór prac semestralnych.
- Program semestralny ma być realizowany w zespołach (najlepiej 3-osobowych). Przeznaczenie stosunkowo dużej części zajęć na realizację zadania semstralnego jest podyktowane tym, że będzie to największy program uruchamiany przez studentów w trakcie studiów.
- Tematem tej pracowni jest programowanie wizualne. W tym projekcie jako przykładu użyto Delphi. Oczywiście może to być inne środowisko (i inny system operacyjny, np. UNIX). Większość przedstawionych tu tematów będzie miała swoje odpowiedniki w jakimkolwiek innym środowisku programowania wizualnego. Dotyczy to także tych zagadnień, które nie sa bezpośrednio związane z programowaniem wizualnym (np. biblioteki DLL). W projekcie świadomie nie omówiono wszystkich własności środowiska Delphi (np. obsługi baz danych), gdyż wykraczałyby one tematycznie poza ramy tych zajęć.
Rodzaj: wykład (20), egzamin, I trymestr
Autorzy programu: T. Fornalik, G. Grudziński, J. Mincer (S.
Kurpiewski, J. Deminet)
Sylabus:
- Unix:
- historia i wersje systemu,
- architektura systemu,
- budowa i zasada działania jądra.
- struktury danych do obsługi procesów,
- stany procesów,
- kontekst, przełączanie kontekstu,
- szeregowanie procesów,
- funkcje systemowe do obsługi procesów (tworzenie, niszczenie, wykonywanie procesów),
- wątki.
- wprowadzenie: pamięć wirtualna,
- struktury danych do obsługi pamięci
- stronicowanie na żądanie,
- wymiana (ang. swapping),
- zarządzanie pamięcią jądra.
- zarządzanie pamięcią podręczną,
- struktury danych do obsługi operacji wejścia-wyjścia,
- programy sterujące urządzeń,
- obsługa urządzeń blokowych i znakowych.
- struktury danych do obsługi plików,
- funkcje systemowe systemu plików,
- wirtualny system plików,
- montowanie plików,
- obsługa katalogów i plików specjalnych.
- wprowadzenie (koncepcja ogólna, podstawowe cechy, budowa warstwowa i jej związek z wielopoziomową strukturą ochrony dostępu),
- przełączanie kontekstu i szeregowanie,
- zarządzanie pamięcią (stronicowanie, realizacja pamięci podręcznej).
- ochrona dostępu (mechanizmy sprzętowe i programowe),
- wielopoziomowy mechanizm przerwań,
- struktura dysku,
- mechanizmy synchronizacji.
- architektura systemu: mikrojądro i procesy systemowe,
- budowa i funkcje mikrojądra,
- przesyłanie komunikatów,
- szeregowanie procesów,
- zarządzanie siecią i komunikacja w sieci,
- zdalny dostęp do zasobów sieciowych,
- udogodnienia na potrzeby zadań czasu rzeczywistego.
- A. Silberschatz, J. Peterson, P. Galvin, "Podstawy systemów operacyjnych", WNT, 1993.
- M. Bach , "Budowa systemu operacyjnego Unix", WNT, 1995.
- B. Goodheart, J. Cox, "The Magic Garden Explained: The Internals of Unix System V Release 4. An Open System Design." oraz, pod tym samym tytulem, "Solutions Manual", 1994. (Ukaże się nakładem WNT.)
- K. Sacha, "QNX - system operacyjny", X-serwis, Warszawa 1995.
- W. Lerch, "System operacyjny QNX", Quantum Corp., 1994.
- QNX Software Systems, "QNX Operating System. System Architecture", 1997.
- D. Miller, "VAX/VMS. Operating System Concepts", Digital Press.
- Projekt Linux: http://rainbow.mimuw.edu.pl/SO/Linux i projekt LabLinux: http://rainbow.mimuw.edu.pl/LabLinux.
- F. Soltis, "Inside the AS/400", Duke Comm. Int. 1995.
- H. Custer, "Inside Windows NT", Microsoft Press 1993.
- Wymienione systemy należy traktować jako propozycje systemów, które w danym czasie dominują na rynku lub są znane ze względu na ciekawe rozwiązania projektowe. Wykładowca powinien uaktualniać tę listę przykładów. Inni kandydaci: MVS, Windows/NT.
- Część wykładu poświęcona systemowi Unix powinna dotyczyć jednej z następujących wersji systemu:
(a) Unix System V Wersja 4,
(b) Unix BSD (najnowsza wersja),
(c) Linux.
Za wyborem (a) przemawia b. dobry podrecznik ([3]), który wkrótce będzie dostępny po polsku, za wyborem (b) i (c) - dostępność źródeł systemu, za wyborem (c) dodatkowo dostępność tego systemu w SLK
Rodzaj: wykład (20), egzamin, I trymestr
Autorzy programu: T. Fornalik, G. Grudziński, J. Mincer (S.
Kurpiewski, J. Deminet)
Sylabus:
- System komputerowy i jego główne składowe:
- model von Neumanna
- cykl pracy procesora, sposoby adresacji, repertuar instrukcji, rejestry,
- system przerwań,
- struktura połączeń, szyny,
- pamięć, RAM, ROM, adresacja, pojemność, cykl pracy pamięci,
- urządzenia wejścia-wyjścia,
- ocena wydajności.
- składowe procesora, ALU, rejestry uniwersalne i specjalne,
- tory przesyłania danych, komunikacja z pamięcią,
- mikroprogramowanie,
- przetwarzanie potokowe,
- architektura superskalarna.
- CISC vs RISC,
- przewidywanie skoków, data forwarding, data bypassing,
- kolejkowanie instrukcji,
- procesory z długim słowem instrukcji,
- pamięć podręczna (cache) procesora (wielopoziomowość, strategie zarządzania).
- architektura połączeń,
- porty, przerwania, DMA,
- transmisja równoległa i szeregowa,
- zdarzenia: synchroniczne, asynchroniczne (bus timing),
- zarządzanie dostępem do szyny,
- SSA, ISA, EISA, VESA, PCI, FutureBus+.
- programowanie wejścia-wyjścia,
- DMA,
- sterowniki dysków, np. IDE, SCSI,
- technologia RAID,
- dyski optyczne,
- taśmy, streamery,
- dyskietki.
- tryby pracy,
- pamięć wirtualna (translacja adresów, pamięć asocjacyjna).
- systemy wieloprocesorowe,
- silnie powiązane,
- luźno powiązane,
- klastering,
- Lisp-maszyna,
- dataflow.
- B.S. Chalk, "Computer Organisation and Architecture", ukaże się nakładem WNT.
- W. Stallings, "Computer Organization and Architecture", 4th ed., ukaże się nakładem WNT.
- Ostatnie wykłady należy poświęcić na omówienie przykładowych architektur. Powinny być to architektury systemów komputerowych dostępnych w Polsce i w miarę nowoczesnych. Przykładowo: najnowszy model IBM PC, AS/400, HP/SUN/DEC Alpha, Cray (por. ICM).
Rodzaj: wykład (20), egzamin, II trymestr
Autorzy programu: T. Fornalik, G. Grudziński, J. Mincer (S.
Kurpiewski, J. Deminet)
Sylabus:
- Zasadnicze idee i pojęcia związane z sieciami komputerowymi (sieci lokalne i rozległe, różne rodzaje technologii sieci fizycznych: Ethernet, łącza szeregowe, intersieci i niezależność od technologii fizycznych itd.). Model warstwowy ISO/OSI. Przeznaczenie urządzeń sieciowych takich jak most, ruter, brama.
- Technologie fizyczne - sieci Ethernet (rodzaje Ethernetu, mechanizm detekcji kolizji itd.). Modemy. ISDN.
- Intersieci - miejsce poszczególnych protokołów w modelu warstwowym. Omówienie architektury sieci TCP/IP. Protokół IP i protokoły pomocnicze (ARP, RARP, ICMP, IGMP). Adresy IP, maska sieci, tworzenie podsieci i nadsieci. Zagadnienia ustalania trasy pakietu.
- Protokoly transportowe (TCP, UDP). Automat skończony TCP.
- DNS, DHCP, BOOTP, SNMP.
- Protokoły pocztowe (SMTP, POP2, POP3, IMAP).
- Protokoły użytkowe (TELNET, SSH, RPC).
- Protokoły użytkowe (FTP, TFTP, NFS, HTTP).
- D.E. Comer: tom1: "Sieci komputerowe TCP/IP. Zasady, protokoły i architektura", WNT, 1997.
- W. Stallings, "Data and Computer Communications" (5th ed.), Prentice-Hall, 1997 (ukaże się nakładem WNT).
Rodzaj: laboratorium (20), zaliczenie na ocenę, II trymestr
Autorzy programu: T. Fornalik, G. Grudziński, J. Mincer (S.
Kurpiewski, J. Deminet)
Sylabus:
- Usługi zdalne w środowisku Unixa:
- telnet, ftp, tftp, rlogin, ssh, rsh, rexec, finger,
- poczta elektroniczna,
- porty, sprawdzanie zajętości portów, port-mapper,
- adresy sieciowe,
- zagrożenia i podstawowe zabezpieczenia,
- różne standardy programowania sieciowego:
- warstwa łącza (DLPI),
- warstwa transportowa (gniazda, XTI),
- warstwa sesji (RPC).
- model klient-serwer,
- protokoły połączeniowe i bezpołączeniowe, cechy, różnice,
- struktury danych do obsługi gniazd,
- funkcje do obsługi gniazd - podstawowe, pomocnicze,
- serwer iteracyjny pracujący na bazie protokołu połączeniowego.
- serwer współbieżny, kiedy stosować, problem "zombie", problem dostępu do wspólnej struktury danych,
- użycie select.
- gniazda UDP,
- gniazda a sygnały.
- implementacja gniazd w Linuxie,
- surowe gniazda.
- omówienie mechanizmu RPC, semantyka RPC,
- identyfikacja zdalnie wołanych procedur,
- podstawowe funkcje,
- użyteczne polecenia (np. rpcinfo),
- format XDR, podstawowe funkcje, definowanie własnych filtrów.
- RPC niskopoziomowe,
- sprawdzanie tożsamości,
- obsługa błędów,
- rozgłaszanie.
- tworzenie klienta i serwera przy użyciu rpcgen.
- architektura systemu,
- konfigurowanie maszyny wirtualnej,
- interfejs użytkownika,
- modele przetwarzania rozproszonego.
- obsługa błędów,
- przykłady aplikacji.
- W. Richard Stevens:
- "Advanced Programming in the Unix Environment", Prentice-Hall, 1992.
- "Programowanie zastosowań sieciowych w systemie Unix", WNT, 1995.
- "Unix Network Programming. Networking APIs: Sockets and XTI", Prentice-Hall, 1998 (ukaże się nakładem WNT).
- "Unix Network Programming. IPC: Interprocess Communication", Prentice-Hall, ukaże się wkrótce.
- "Unix Network Programming. Applications", Prentice-Hall, ukaże się wkrótce.
- "TCP/IP Illustrated, Volume 1", Prentice-Hall, 1994.
- "TCP/IP Illustrated, Volume 2" (wspolnie z Wrightem), Prentice-Hall, 1995.
- "TCP/IP Illustrated, Volume 3", Prentice-Hall, 1996.
- tom1: "Sieci komputerowe TCP/IP. Zasady, protokoły i architektura",
- tom2: "Sieci komputerowe TCP/IP. Projektowanie i realizacja protokołów",
- tom3: "Sieci komputerowe TCP/IP. Programowanie w trybie klient-serwer. Wersja BSD." WNT, 1997.
Rodzaj: wykład (20), egzamin, III trymestr
Autorzy programu:
Sylabus:
Literatura:
- J. D. Ullman, "Wprowadzenie do baz danych", WNT, Warszawa ???.
- J. D. Ullman, J. Widom, "A First Course in Database Systems", Prentice Hall 1997.
- Date ???
Rodzaj: laboratorium (20), zaliczenie na ocenę, III trymestr
Autorzy programu:
Sylabus:
Literatura:

