**Cel zajęć**
Celem wykładu jest zapoznanie studentów z problematyką tworzenia
oprogramowania, ze szczególnym uwzględnieniem struktury języków programowania,
kompilacji programów i zaawansowanych konstrukcji językowych wspierających
tworzenie programów. Zasadniczo jako języka programowania ilustrującego
omawiane zagadnienia używa się C++. Dlatego zakłada się, że studenci posiedli
umiejętność programowania w języku ANSI C na poziomie podstawowym. Konstrukcje
języka C++ nie występujące w języku C są omawiane na wykładzie. Niektóre
mechanizmy, nie występujące w języku C++ lub trudne do opisania w tym języku
omawia się na przykładzie języków Ada 95 (modularyzacja programów,
programowanie współbieżne), Standard ML (programowanie funkcjonalne) i Prolog
(programowanie logiczne). Zakłada się, że po zakończeniu zajęć studenci będą
posiadać elementarną zdolność programowania w tych trzech językach. W
porównaniu z przedmiotem o tej samej nazwie wykładanym na studiach
magisterskich, większy nacisk jest położony na praktyczną stronę omawianych
zagadnień, natomiast problemy matematycznej teorii języków programowania są
ograniczone do niezbędnego minimum.
**Program:**
1. Składnia (6 godz.). Opis składni języków. Opis składni języka C. Notacja EBNF. Drzewa rozbioru. Automatyczna analiza składniowa. Konstruowanie parserów dla prostych języków (wyrażenia itp). Wyrażenia: operatory, priorytety, kierunki łączności. Odwrotna notacja polska. Algorytm przekładu wyrażeń na odwrotną notację polską z użyciem stosu. Automaty skończone i wyrażenia regularne. Wyszukiwanie wzorca w tekście z użyciem automatu skończonego.
2. Programowanie niskopoziomowe (6 godz.). Język maszynowy, asembler i język wysokiego poziomu. Budowa kompilatorów: schematy przekładu instrukcji, generowanie kodu wynikowego.
3. Konstruowanie oprogramowania metodą systematyczną (1 godz.). Projektowanie oprogramowania metodą wstępującą i zstępującą. Strukturalna, proceduralna i obiektowa technika programowania. Projektowanie, programowanie i kodowanie strukturalne.
4. Programowanie imperatywne (4 godz.). Dane i typy danych. Przydział pamięci dla typów złożonych. Instrukcje sterujące. Diagramy przepływu. Wyjątki. Bloki i procedury. Przekazywanie parametrów. Zarządzanie pamięcią. Stos wywołań i pamięć dynamiczna. Rekursja, rekursja ogonowa.
5. Specyfikacja i weryfikacja programów (4 godz.). Asercje. Reguły wnioskowania. Dowodzenie własności programów. Wyprowadzanie programów z niezmienników.
6. Parametryzacja i modularyzacja programów (6 godz.). Polimorfizm. Wzorce w C++. Moduły i rozdzielna kompilacja. Pliki nagłówkowe w C++. Pakiety w Adzie. Abstrakcyjne i konkretne typy danych.
7. Problemy inżynierii oprogramowania (4 godz.). Proces tworzenia oprogramowania. Specyfikacja problemu. Projektowanie rozwiązania: metoda wstępująca, zstępująca i mieszana. Strategie: "dziel i rządź", "programowanie z nawrotami", "metoda kolejnych ulepszeń", algorytmy zachłanne. Implementacja: oprogramowanie przyjazne, prototypowanie, efektywność. Testowanie (przygotowywanie danych testowych). Pielęgnacja oprogramowania. Dokumentacja: dokumentacja wewnętrzna programisty). Dokumentacja zewnętrzna (podręcznik użytkownika).
8. Programowanie obiektowe (6 godz.). Obiekty. Ukrywanie danych. Dziedziczenie. Obiekty w języku C++.
9. Programowanie funkcjonalne (7 godz.). Podstawy programowania w języku Standard ML. Trwałe i ulotne struktury danych. Skutki uboczne. Przetwarzanie list. Algorytmy rekurencyjne.
10. Programowanie współbieżne (8 godz.). Zadania w Adzie. Mechanizm spotkań. Problem pięciu filozofów.
11. Programowanie logiczne (8 godz.). Podstawy programowania w języku Prolog.
**Wymagania:**
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ą.