(Średnio)zaawansowane programowanie w C++ Wykład 1 - wstęp Robert Nowak 2019L (Średnio)zaawansowane programowanie w C++ 1/36
Programowanie Programowanie umiejętność zapisu algorytmów w danym języku programowania umiejętność rozwiązywania problemów umiejętność rozwiązania problemów przy pomocy komputera Czy problem może być rozwiązany przez komputer? Czy problem powinien być rozwiązany przez komputer? (Średnio)zaawansowane programowanie w C++ 2/36
Cel i zakres przedmiotu zapoznanie słuchaczy z zagadnieniami tworzenia oprogramowania efektywne wykorzystanie języka C++ współcześnie stosowane techniki i biblioteki wykorzystywanie różnych języków programowania w tej samej aplikacji, na przykładzie C++ i Pythona Zakładana znajomość: programowania strukturalnego i obiektowego języka C++ (Średnio)zaawansowane programowanie w C++ 3/36
Podstawowe dane o przedmiocie Miejsce spotkań: (wtorek 18 15 20 00 ), sala 162 Prowadzący: dr hab. inż. Robert Nowak Zakład Sztucznej Inteligencji, Instytut Informatyki e-mail: r.m.nowak@elka.pw.edu.pl Konsultacje: wtorek 17 18, środy 11 12 pok. 23 Strona przedmiotu: http://studia.elka.pw.edu.pl/pub/zpr.a http://staff.elka.pw.edu.pl/ rnowak2/zpr2019l (Średnio)zaawansowane programowanie w C++ 4/36
Tematyka wykładów Programowanie obiektowe w C++, wzorce projektowe Obsługa błędów, mechanizm wyjątków, sprytne wskaźniki Aplikacje współbieżne (wielowątkowe), synchronizacja Szablony, programowanie generyczne Biblioteka standardowa Rozszerzenia biblioteki standardowej - boost (Średnio)zaawansowane programowanie w C++ 5/36
Literatura Gamma et al.,, WNT, 2005. Alexandrescu, Nowoczesne projektowanie w C++, 2005. Alexandrescu, Sutter, Jȩzyk C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk, Helion, 2005. Meyers,50 efektywnych sposobów na udoskonalenie Twoich programów, Helion, 2003. Stroustrup,Programowanie. Teoria i praktyka z wykorzystaniem C++, Helion 2010. Nowak, Pająk,Język C++:mechanizmy, wzorce, biblioteki, BTC, 2010. Hunt, Thomas,Pragmatyczny programista, Helion, 2011 literatura po angielsku: http://www.drdobbs.com/cpp/c-reading-list/240155654 (Średnio)zaawansowane programowanie w C++ 6/36
Zaliczenie przedmiotu kolokwium I (7 wykład) kolokwium II (14 wykład) projekt zadanie dodatkowe 0 25pkt 0 25pkt 0 50pkt 0 10pkt Projekt: propozycje tematów ustalenie składu zespołów, przydział zadań dokumentacja wstępna (max. 3 strony A4) oddanie szkieletu aplikacji dostarczenie implementacji i dokumentacji ostateczny termin oddania projektu 1 Zadanie dodatkowe (nieobowiązkowe) rezerwacja zadania termin oddania 1 po tym terminie projekty nie będą przyjmowane >= 90 pkt. ocena 5 80 89 pkt. ocena 4 1 2 70 79 pkt. ocena 4 60 69 pkt. ocena 3 1 2 50 59 pkt. ocena 3 < 50 pkt. ocena 2 28 lutego 11 i 13 marca 1 kwietnia 1 maja 7 czerwca 11 czerwca 30 kwietnia 31 maja (Średnio)zaawansowane programowanie w C++ 7/36
Wymaganie oprogramowanie kompilatory: the GNU Compiler Collection 5.1 lub nowszy Microsoft Visual Studio 2015 lub nowszy biblioteki: stl boost - http://www.boost.org inne: repozytorium (np. mercurial) edytor tekstu (np. emacs) debugger (np. gdb) narzędzie do automatycznej kompilacji (np. SCons) narzędzie do generowania dokumentacji (np. doxygen) optymalizacja kodu, profiler (np. gprof) narzędzie do wirtualizacji (np. kvm) (Średnio)zaawansowane programowanie w C++ 8/36
Podstawowe zasady dobrego stylu programowania (Średnio)zaawansowane programowanie w C++ 9/36
Czytelny kod KISS (Keep It Simple Software) prosty projekt pojedyncza odpowiedzialność przedkłada się czytelność kodu nad jego optymalność Standardy kodowania: pliki źródłowe, nazewnictwo, formatowanie kodu źródłowego, stosować konsekwentnie ten sam styl kodowania. (Średnio)zaawansowane programowanie w C++ 10/36
Stosowanie narzędzi Wykrywanie błędów w programach Wykorzystywać kompilator. Zawsze doprowadzić do czystej kompilacji (bez żadnych ostrzeżeń) na najwyższym poziomie. Rozumieć każde ostrzeżenie. Zarządzanie kodami źródłowymi (stosowanie repozytorium) Systemy do automatycznej kompilacji Optymalizacja oprogramowania nie optymalizować jeżeli nie ma takiej potrzeby skupić się na złożoności obliczeniowej ( O(.) ) używać narzędzi (profiler) do wykrywania czasochłonnych fragmentów kodu (Średnio)zaawansowane programowanie w C++ 11/36
Pewne fakty związane z tworzeniem oprogramowania Najczęstsze przyczyny niepowodzenia projektu: niestabilne wymagania optymistyczna estymacja kosztów (głównie czasu) realizacji projektów niska jakość oprogramowania R. Glass, Frequently Forgotten Facts about Software Engineering, 2001 (Średnio)zaawansowane programowanie w C++ 12/36
Jakość w tworzeniu programowania (Średnio)zaawansowane programowanie w C++ 13/36
Prostota obsługi oprogramowania http://lightsquid.sourceforge.net (Średnio)zaawansowane programowanie w C++ 14/36
Po co prowadzi się projekty zespołowe na studiach Grafika z endlessorigami.com (Średnio)zaawansowane programowanie w C++ 15/36
Popularność języków programowania (Średnio)zaawansowane programowanie w C++ 16/36
Wybór odpowiedniego języka programowania Miara popularności: liczba linii kodu napisanych w danym języku (w oprogramowaniu które jest obecnie wykorzystywane) liczba odwołań do stron opisujących dany język / liczba sprzedanych książek opisujących dany język liczba ofert pracy dla programistów danego języka programowania Wszelkie miary są przybliżone, ponieważ: nie uwzględnia komercyjnego (przemysłowego) kodu źródłowego liczba odwołań do opisu języka może świadczyć o jego złożoności (a nie tylko popularności) może oznaczać mobilność programistów (Średnio)zaawansowane programowanie w C++ 17/36
Liczba linii dla wybranych projektów nazwa LOC 2 języki programowania Linux Kernel 12M C(11M) Assembler (250k) MySql 12.5M C++(7.1M) C(3.8M) Firefox 9M C++(3.7M) C(1.8M) JavaScript (1.4M) Próba oszacowania wielkości oprogramowania biznesowe (Gartner Group, 1997): 310 10 9 LOC (COBOL 60%) szacunki 2008 rok: 10 10 12 LOC Open Source, 2008 rok: 1.2 10 9 LOC 2 Lines of Code, http://www.ohloh.net (Średnio)zaawansowane programowanie w C++ 18/36
Oprogramowanie Open Source przy podziale na języki sourceforge (2007) Google code (2012) GitHub 2015 GitHub 2018 (Średnio)zaawansowane programowanie w C++ 19/36
Zliczanie trafień dla stron internetowych (www.tiobe.com) (Średnio)zaawansowane programowanie w C++ 20/36
Oferty pracy http://www.itjobswatch.co.uk Java C# C++ Python Java Script SQL (Średnio)zaawansowane programowanie w C++ 21/36
Ankiety wśród pracodawców http://blog.codeeval.com (Średnio)zaawansowane programowanie w C++ 22/36
Wydajność shootout.alioth.debian.org Java kontra C++ (GNU g++) Python kontra C++ x64 Ubuntu, Intel Q6600 (quad-core) (Średnio)zaawansowane programowanie w C++ 23/36
Zmiana akcentów w tworzeniu programowania Programiści w ciągu ostatnich 2 lat zaczeli masowo używać więcej niż jednego języka programowania jednocześnie a a The Quiet Revolution in Programming, By Andrew Binstock, April 03, 2013, Dr.Dobb s Journal 2010 2012 (Średnio)zaawansowane programowanie w C++ 24/36
Zalety i wady języka C++ + standard języka jest tworzony przez organizację standaryzacyjną ANSI/ISO (nie przez firmę) - nieco przestarzały standard (ale jest C++11, C++14, C++17) + język kompilowany do kodu maszynowego, możliwość tworzenia bardzo wydajnych aplikacji + wspiera wiele paradygmatów: programowanie strukturalne, obiektowe, generyczne - złożony, wiele poprawnych konstrukcji do rozwiązywania tego samego problemu + duża popularność, dostępność wielu narzędzi dla wielu platform (w tym wbudowanych) + duża stabilność - uboga biblioteka standardowa (Średnio)zaawansowane programowanie w C++ 25/36
Języki programowania Kompromis: jednoznaczny (komputer) pojęcia bliskie programiście (człowiek) Translacja: tłumaczenie z postaci źródłowej (zrozumiała dla człowieka) do wynikowej (zrozumiała dla komputera) kompilacja interpretacja Teza nie istnieje jeden, najlepszy język programowania stosowanie zawsze jednego języka programowania - niezbyt wyrafinowane rozwiązania (Średnio)zaawansowane programowanie w C++ 26/36
Potrzeba użycia różnych języków w aplikacjach System komputerowy zawsze: ma ograniczenia czasowe, więc tworzenie całości powinno być możliwie szybkie posiada pewne elementy, które są wąskim gardłem - powinny być zaimplementowane wydajnie (20% kodu) System komputerowy często: posiada pewne elementy, których autor nie chce udostępniać (kod ukryty przed użytkownikiem) posiada pewne fragmenty, które powinny być dostępne dla użytkownika (aby dostosować aplikację do indywidualnych potrzeb, np. konfiguracja) (Średnio)zaawansowane programowanie w C++ 27/36
Singleton standardowe rozwiązania często pojawiających się problemów projektowych sprawdzone w praktyce najczęściej dotyczą programowania obiektowego znajomość wzorców projektowych pozwala lepiej zrozumieć obiektowe podejście do programowania (Średnio)zaawansowane programowanie w C++ 28/36
Singleton Wzorzec singletona Obiekt globalny (problemy): inicjacja jedna kopia w programie class Singleton { public: static Singleton* getinstance() { //Dostęp do obiektu if(!pinstance_) pinstance_ = new Singleton; return pinstance_; } private: Singleton(); //Prywatny konstruktor Singleton(const Singleton&) = delete; //zabroniony, C++11 Singleton& operator=(const Singleton&) = delete; //zabroniony, C++11 static Singleton* pinstance_; }; //w pliku.cpp Singleton* Singleton::pInstance_ = nullptr; (Średnio)zaawansowane programowanie w C++ 29/36
Singleton Wzorzec singletona w C++ (Meyers) class Singleton { public: static Singleton& getinstance(); //nie można usunąć private: Singleton(); Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; }; //lepiej implementację przenieść do pliku.cpp //metoda inline w msvc może generować wiele instancji //jest bezpieczny w C++11 w aplikacjach współbieżnych Singleton& Singleton::getInstance() { static Singleton instance; //lokalna zmienna statyczna return instance; } Wykorzystuje kod generowany przez kompilator: inicjujący i niszczący lokalne obiekty statyczne, w C++11 dodatkowo w sposób bezpieczy w aplikacjach współbieżnych (Średnio)zaawansowane programowanie w C++ 30/36
Singleton Singleton i wiele wątków Singleton& Singleton::getInstance() { //1 if(!pinstance_) //2 pinstance_ = new Singleton; //3 return *pinstance_; //4 } //5 (Średnio)zaawansowane programowanie w C++ 31/36
Singleton Mutex Mutex(Mutual Exclusive) obiekt synchronizujący (dostęp ma tylko jeden wątek w danym momencie) mutex.lock(); //Sekcja krytyczna mutex.unlock(); struct Lock { //Klasa pomocnicza Lock(Mutex& m) : m_(m) { m_.lock(); } ~Lock() { m_.unlock(); } //Destruktor wychodzi z sekcji Mutex& m_; //Mutex, którym zarządza }; (Średnio)zaawansowane programowanie w C++ 32/36
Singleton Singleton współbieżny //Singleton poprawny, ale nieefektywny Singleton& Singleton::getInstance() { Lock guard(mutex_);//teraz tworzenie w sekcji krytycznej if(!pinstance_) pinstance_ = new Singleton; return *pinstance_; } //Singleton wielowątkowy efektywny Singleton& Singleton::getInstance() { if(!pinstance_) { Lock guard(mutex_);//teraz tworzenie w sekcji krytycznej if(!pinstance_) pinstance_ = new Singleton; } return *pinstance_; } (Średnio)zaawansowane programowanie w C++ 33/36
Singleton Singleton DCLP (Double checked locking pattern) Singleton& Singleton::getInstance() { if(!pinstance_) { Lock guard(mutex_); if(!pinstance_) pinstance_ = new Singleton; } return *pinstance_; } może być niepoprawny (brak sequence point ) próby poprawy mogą być nieskuteczne dodatkowe instrukcje (wstawianie sequence point ) oznaczanie obiektów jako zmienne (volatile) działa w praktyce Wniosek singletony inicjować w tym samym wątku (start aplikacji) (Średnio)zaawansowane programowanie w C++ 34/36
Singleton zalecenia końcowe Czytać kod innych. Programować. (Średnio)zaawansowane programowanie w C++ 35/36
Singleton Dziękuję (Średnio)zaawansowane programowanie w C++ 36/36