( rednio)zaawansowane programowanie w C++ Wykªad 1 - wst p Robert Nowak 2015Z ( 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«: (±roda 18 15 20 00 ), sala 04B Prowadz cy: dr hab. in». Robert Nowak Zakªad Sztucznej Inteligencji, ISE e-mail: r.m.nowak@elka.pw.edu.pl Konsultacje: ±rody 13 15 pok. 227 Strona przedmiotu: http://studia.elka.pw.edu.pl/pub/zpr.a http://staff.elka.pw.edu.pl/ rnowak2/zpr2015z ( 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 Wst p Gamma et al.,, WNT, 2005. Alexandrescu, Nowoczesne projektowanie w C++, 2005. Alexandrescu, Sutter, Jezyk 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 Wst p 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 13 pa¹dziernika 20 pa¹dziernika 27 pa¹dziernika 1 grudnia 20 stycznia 26 stycznia 1 grudnia 15 stycznia ( rednio)zaawansowane programowanie w C++ 7/36
Wymaganie oprogramowanie kompilatory: the GNU Compiler Collection 4.9 Microsoft Visual Studio 2013 lub 2015 biblioteki: inne: stl boost - http://www.boost.org 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, proler (np. gprof) ( 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 Wst p 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 (proler) 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 Graka 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) ( rednio)zaawansowane programowanie w C++ 19/36
Zliczanie trae«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 rm ) - nieco przestarzaªy standard (ale obecnie C++11, C++14) + 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 Wst p 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 wyranowane 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. konguracja) ( 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 /* pozostaªe metody */ private: Singleton(); Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; /* skªadowe */ }; //lepiej implementacj przenie± do pliku.cpp //metoda inline w msvc mo»e generowa wiele instancji Singleton& Singleton::getInstance() { static Singleton instance; //lokalna zmienna statyczna return instance; } Wykorzystuje kod generowany przez kompilator: inicjuj cy i niszcz cy lokalne obiekty statyczne ( rednio)zaawansowane programowanie w C++ 30/36
Singleton i wiele w tków Singleton Singleton& Singleton::getInstance() { //1 if(!pinstance_) //2 pinstance_ = new Singleton; //3 return *pinstance_; //4 } //5 ( rednio)zaawansowane programowanie w C++ 31/36
Mutex Wst p Singleton 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 wspóªbie»ny Wst p Singleton //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