Celem zajęć jest przedstawienie studentom możliwie szerokiego kręgu zagadnień
związanych z programowaniem komputerów, ze szczególnym uwzględnieniem
podstawowych konstrukcji występujących w językach programowania i związanych z
nimi technik tworzenia programów.
**Program:**
1. Podstawy inżynierii oprogramowania. (3 godz.)
2. Definicje indukcyjne, rekursja i dowody przez indukcję strukturalną. (1 godz.)
3. Gramatyki regularne i bezkontekstowe. Analiza leksykalna i składniowa. Lekser. Parser. Konkretne i abstrakcyjne drzewa rozbioru. (3 godz.; Teoria informatyki)
4. Metody opisu semantyki języków programowania. Strukturalna semantyka operacyjna. Semantyka denotacyjna. Definicje rekurencyjne i funkcje częściowe. (5 godz.; Wstęp do semantyki języków programowania)
5. Logika Hoare'a i dowodzenie poprawności programów. Metoda niezmienników. Synteza programów metodą wstępującą i zstępującą. (5 godz.; Wstęp do semantyki języków programowania)
6. Struktura współczesnych języków programowania. Nazwy, komórki i wartości, struktury sterujące, funkcje i procedury, dynamiczne struktury danych, wyjątki. Typy danych, mocna typizacja, rekonstrukcja typów. (7 godz.)
7. Pojęcie translatora. Zasięg zmiennych, wywoływanie funkcji i zarządzanie pamięcią. Języki o strukturze blokowej, rekordy aktywacji, metody przydziału pamięci dla zmiennych lokalnych i globalnych. Funkcje wyższego rzędu, funarg problem. Automatyczne zarządzanie pamięcią i odśmiecanie. (6 godz.; Translatory)
8. Algebraiczne specyfikacje typów danych. Typy definiowane indukcyjnie (listy, drzewa, stosy, kolejki itd.) Indukcyjne dowody ich własności. (4 godz.; Algorytmy i struktury danych)
9. Moduły, rodzajowość i abstrakcja danych. Ukrywanie (encapsulation) danych. Rozwiązania w konkretnych językach (moduły, pakiety w Adzie, klastery w Clu). Rodzajowość (funktory, pakiety rodzajowe, wzorce (templates) w C++). (6 godz.; Algorytmy i struktury danych)
10. Programowanie funkcjonalne. Programowanie deklaratywne a imperatywne. Skutki uboczne. Porządek wartościowania. (4 godz.; Programowanie funkcjonalne)
11. Programowanie obiektowe, metodologia OO, obiekty i klasy, abstrakcyjne typy danych a klasy, podtypowanie a dziedziczenie, języki bezklasowe, Smalltalk. Obiektowy styl programowania w C++. Java. (6 godz.; Programowanie obiektowe)
12. Współbieżność. Elementarne metody synchronizacji: semafory, monitory, rejony krytyczne. CSP. CCS. Model asynchroniczny. Programowanie rozproszone. Kanały, wątki, coroutines. Mechanizmy współbieżności w Adzie i innych językach programowania. Pięciu filozofów itp. Obliczenia sterowane przepływem danych. (6 godz.; Obliczenia równoległe i rozproszone, Systemy operacyjne)
13. Programowanie w logice. Prolog. (4 godz.; Programowanie logiczne)
**Wymagania:** Logika dla informatyków Kurs Pascala lub C
sem. letni 2023/24: piątki, godz. 12.30-13.30, pokój 311, a także konsultacje zdalne za pośrednictwem MSTeams, w piątki, godz. 19.15 - 19.30 i dłużej, jeżeli będą zainteresowani.
Zapraszam też na konsultacje zdalne lub w Instytucie w terminach uzgodnionych ze stosownym wyprzedzeniem np. pocztą elektroniczną.