Oprogramowanie i wykorzystanie stacji roboczych Wykład 2
Transkrypt
Oprogramowanie i wykorzystanie stacji roboczych Wykład 2
Oprogramowanie i wykorzystanie stacji roboczych Wykład 2 Dr inż. Tomasz Olas [email protected] Instytut Informatyki Teoretycznej i Stosowanej Politechnika Cz˛estochowska Wykład 2 – p. 1/3 Kontrola wersji Kod ewoluuje. W czasie gdy projekt zmienia sie˛ z prototypu w wersje˛ ostateczna˛ przechodzi przez wiele cykli, w których programiści badaja˛ nowe trendy, usuwaja˛ błedy ˛ i stabilizuja˛ swoje osiagni ˛ ecia. ˛ Ewolucja kodu powoduje wiele problemów, które moga˛ być źródłem konfliktów i dodatkowej pracy, zmniejszajac ˛ w ten sposób efektywność. Jednym z ważniejszych problemów jest możliwość powrotu do starej wersji. Równie ważna jest możliwość rejestracji zmian. Kolejnym problemem jest śledzenie błedów. ˛ Cz˛esto otrzymywany jest raport o błedzie ˛ w konkretnej wersji programu, podczas gdy jego kod uległ już zmianie. Czasem można rozpoznać, że bład ˛ został już usuniety, ˛ ale znacznie cz˛eściej nie ma takiej możliwości. Wykład 2 – p. 2/3 Systemy kontroli wersji Reczna ˛ kontrola wersji - polega na okresowym tworzeniu kopii bezpieczeństwa całego projektu. Do plików źródłowych dopisywane sa˛ komentarze z historia˛ zmian. Automatyczna kontrola wersji - polega na stosowaniu systemu kontroli wersji (ang. version control system - VCS). SCCS (CSSC) - powstał w 1980 roku i w chwili obecnej jest już przestarzały. RCS - obecnie najszerzej stosowany. Doskonale nadaje sie˛ dla pojedynczych programistów i małych grup projektowych. Operuje na pojedynczych plikach. CVS - powstał na poczatku ˛ lat 90 jako front end systemu RCS, ale stosowany przez niego model kontroli wersji kwalifikował go jako zupełnie odrebny ˛ projekt. Nowe implementacje nie korzystaja˛ już z RCS. Operuje w przeciwieństwie do RCS na katalogach, czy też całych projektach. Subversion - rozwiazuje ˛ problemy zwiazane ˛ z systemem CVS i ma najwieksze ˛ szanse na jego zastapienie. ˛ Wykład 2 – p. 3/3 Mechanizm automatycznej kontroli wersji Prace˛ z systemem kontroli wersji rozpoczyna sie˛ od rejestracji zbioru plików źródłowych, to znaczy nakazania systemowi rozpocz˛ecia ich archiwizacji wraz z historia˛ zmian. Nastepnie ˛ chcac ˛ wprowadzić zmiany do któregoś z plików projektu należy go wymeldować (ang. check out). Po zakończeniu pracy należy plik z powrotem zameldować (ang. check in), co powoduje dokonanie zmian w archiwum. Wykład 2 – p. 4/3 CVS W przypadku CVS archiwum nazywa sie˛ repozytorium (ang. repository). Projekt znajdujacy ˛ sie˛ w repozytorium to moduł (ang. module). Każdy plik w repozytorium ma przypisany numer wersji (ang. revision number ). Za każdym razem, kiedy plik jest modyfikowany (czyli zatwierdzane sa˛ zmiany), CVS zmienia (zwieksza) ˛ numer jego wersji. Podczas dodawania pliku do repozytorium nadawany jest mu numer 1.1. Pierwsze zatwierdzenie modyfikacji to numer 1.2, kolejne to 1.3 itd. Numery rewizji ida˛ niezależnie dla każdego pliku. Istnieje możliwość zaznaczenia, że zbiór plików w konkretnych rewizjach stanowi wersje˛ pakietu jako całości poprzez symboliczne nazwy zwane znacznikami (ang. tag). Podstawowym programem systemu CVS jest program o nazwie cvs. Wykład 2 – p. 5/3 CVS - tworzenie repozytorium Aby utworzyć repozytorium należy: Ustawić zmienna˛ CVSROOT na odpowiednia˛ wartość: export CVSROOT=katalog Zainicjować cvs: cvs init W katalogu, który podaliśmy zostanie utworzony katalog CVSROOT zawierajacy ˛ pliki niezbedne ˛ do prawidłowego funkcjonowania repozytorium. Utworzenie modułu: cvs import modulename vendorname release Wykład 2 – p. 6/3 CVS - przykładowa sesja Pobranie kopii modułu first: cvs checkout first Dokonanie zmian w plikach Zatwierdzenie zamian komenda˛ comit: cvs commit -R first Wykład 2 – p. 7/3 Generowanie dokumentacji Istnieje szereg narz˛edzi wspierajacych ˛ proces tworzenia dokumentacji na podstawie komentarzy umieszczonych bezpośrednio w plikach źródłowych: javadoc doc++ doxygen Doxygen jest systemem dokumentowania kodu dla jezyków ˛ C++, C, Java, IDL (Corba, Microsoft i KDE-DCOP), PHP. Doxygen został utworzony dla systemu Linux, ale jest dostepny ˛ również na inne systemy Unix, jak również dla systemów Windows 9x/NT i Mac OS. Wykład 2 – p. 8/3 Doxygen Doxygen wspiera tworzenie dokumentów poprzez: Bezpośrednie generowanie dokumentacji z plików źródłowych. Dzieki ˛ temu łatwiejsze jest utrzymywanie spójności dokumentacji z plikami źródłowymi. Umożliwia generowanie dokumentacji „on-line” (HTML), jak również plików w formacie L A T E X ze zbioru udokumentowanych plików źródłowych. Umożliwia również generowanie plików z dokumentacja˛ w formatach RTF, (MS-Word), PostScript, PDF, oraz plików pomocy systemu Unix (man pages). Doxygen może zostać tak skonfigurowany, że jest możliwe tworzenie struktury z nieudokumentowanych plików źródłowych. Relacje pomiedzy ˛ poszczególnymi elementami projektu moga˛ być automatycznie tworzone i wyświetlane w postaci grafu zależności oraz diagramu dziedziczenia. Doxygen może zostać również użyty do tworzenia „normalnych” dokumentów. Wykład 2 – p. 9/3 Doxygen - użycie Doxygen używa pliku konfiguracyjnego do określenia swoich ustawień. Każdy projekt powinien posiadać swój własny plik konfiguracyjny. Generowanie pliku konfiguracyjnego: doxygen -g <config-file> Format pliku konfiguracyjnego: TAGNAME = VALUE or TAGNAME = VALUE1 VALUE2 ... Plik konfiguracyjny może być edytowany „recznie”, ˛ lub poprzez graficzne narz˛edzie doxywizard. Uruchamianie programu Doxygen: doxygen <config-file> Wykład 2 – p. 10/3 Doxygen - opcje pliku konfiguracyjnego PROJECT NAME - nazwa projektu dla którego generowana jest dokumentacja, INPUT - katalogi gdzie znajduja˛ sie˛ pliki źródłowe i nagłówkowe dla których bedzie ˛ generowana dokumentacja, OUTPUT LANGUAGE - jezyk ˛ w jakim ma być wygenerowana dokumentacja (polski - Polish). OUTPUT DIRECTORY - katalog w którym zostanie umieszczona dokumentacja, HTML OUTPUT - generowana bedzie ˛ dokumentacja w formacie HTML oraz analogiczne opcje - RTF OUTPUT, LATEX OUTPUT oraz MAN OUTPUT. Wykład 2 – p. 11/3 Doxygen - dokumentowanie kodu Blok dokumentacji jest komentarzem w stylu jezyka ˛ C lub C++ z dodatkowymi znacznikami. Rozróżnia sie˛ dwa rodzaje opisów: opis skrócony (brief description) opis szczegółowy (detailed description) Komentarz umieszczamy zazwyczaj przed opisywana˛ funkcja, struktura˛ danych itp. Pierwsze zdanie (do kropki), służacy ˛ jako krótki ogólny opis. Potem można umieścić troche˛ szczegółów (jeżeli potrzeba). Dobrym zwyczajem jest opisanie wszystkich parametrów np. funkcji używajac ˛ konstrukcji @param, a zwracana˛ wartość poprzez @return: @param nazwa opis_parametru @return opis Wykład 2 – p. 12/3 Doxygen - opisy szczegółowe Formaty opisów szczegółowych: /** * ... opis szczegółowy ... */ /*! * ... opis szczegółowy ... */ /*! ... opis szczegółowy ... */ /// /// ... opis szczegółowy ... /// //! //!... opis szczegółowy ... //! ///////////////////////////////////////////////// /// ... opis szczegółowy ... ///////////////////////////////////////////////// Wykład 2 – p. 13/3 Doxygen - opisy skrócone Format opisu skróconego może być jednym z poniższych: /*! \brief opis skrócony * kontynuacja opisu skróconego * * opis szczegółowy * kontynuacja opisu szczegółowego */ /// opis skrócony /** opis szczegółowy */ Wykład 2 – p. 14/3 Doxygen - opis zmiennych Opis do zmiennych może być umieszczony za deklaracja˛ zmiennej: int var; /*!< opis szczegółowy */ int var; /**< opis szczegółowy */ int var; //!< opis szczegółowy //!< int var; ///< opis szczegółowy ///< int var; //!< opis skrócony int var; ///< opis skrócony Wykład 2 – p. 15/3 Doxygen - przykład opisu funkcji Przykład: /** * Funkcja nic nie robi (opis ogólny). Ta funkcja naprawd˛ e nic nie robi * (opis szczegółowy). * @param par1 naprawd˛ e wszystko jedno, co podasz * @param par2 też nie ma znaczenia * @return zawsze -18 * @see coś_robi */ int nic_nie_robi(int par1, char *par2) { return -18; } Opis funkcji może być umieszczony zarówno przy deklaracji, jak również przy definicji funkcji. Wykład 2 – p. 16/3 Doxygen - przykład /// Opis dla pierwszej klasy class First { }; /// Opis skrócony dla Second /** Opis szczegółowy dla Second */ class Second: public First { public: /// Opis zmiennej wartosc. double wartosc; Second(); }; /// Opis metody przy definicji. Second::Second() { } Wykład 2 – p. 17/3 Koszty błedów ˛ Szacunkowe koszty błedu ˛ w różnych fazach projektu: Faza Koszt Analiza $1 Projekt $5 Kodowanie $10 Testy jednostkowe $15 Testy integracyjne $22 Testy systemowe $50 Po wdrożeniu $100+ Wykład 2 – p. 18/3 Testy jednostkowe Wyrażenie „test jednostkowy” należy rozumieć jako test pojedynczej jednostki, poprzez która˛ bedziemy ˛ rozumieli: funkcje, ˛ metode˛ lub klase. ˛ Zadaniem takiego testu jest sprawdzenie czy dana jednostka działa poprawnie. Testy jednostkowe pozwalaja˛ na wykrycie błedów ˛ (a przynajmniej ich cz˛eści) „u źródła”, cz˛esto w bardzo prostym kodzie, a wiec ˛ ich poprawienie może być znacznie szybsze i mniej kosztowne. Testy jednostkowe powinny być wykonywane „cały czas” wraz ze zmiana˛ kodu programu aby sprawdzić, czy zmiany wynikajace, ˛ np. z poprawienia wykrytych błedów ˛ nie wprowadziły nowych usterek. Aby było to możliwe, to testy powinny być łatwe do wykonania czyli zautomatyzowane (może być dodatkowo zintegrowany z innymi narz˛edziami programistycznymi). Wykład 2 – p. 19/3 CppUnit - tworzenie testu Dla każdej jednostki, która˛ chcemy testować budujemy tzw. TestCase, czyli oddzielna˛ klase˛ grupujac ˛ a˛ wszystkie testy zwiazane ˛ z dana˛ jednostka. ˛ Testy tworzymy wykorzystujac ˛ makra CPPUNIT_ASSERT_.... Stworzenie pojedynczego testu polega na umieszczeniu w tej klasie nowej metody. Jej nazw˛e rozpoczynamy fraza˛ test, np. testOblicz. Z utworzonych metod budujemy jest zestaw testów - makra CPPUNIT_TEST_.... Nastepnie ˛ uruchamiamy proces testowania. Wykonanie każdego testu poprzedzone jest automatycznym wykonaniem standardowej metody inicjalizujacej ˛ setUp, a po zakończeniu testu wykonywana jest metoda tearDown. Wykład 2 – p. 20/3 Debuger Debugowanie jest procesem lokalizacji tych fragmentów programu, które powoduja˛ jego nieprawidłowe działanie. Najcz˛eściej w procesie tym wykorzystywane jest specjalne narz˛edzie zwane debugerem. W wiekszości ˛ przypadków debuger pozwala na: uruchomienie programu, określajac ˛ warunki, które moga˛ wpłynać ˛ na jego działanie, zatrzymanie programu w określonych okolicznościach (poprzez ustawienie tzw. pułapek (breakpoints), krokowe wykonanie programu (linia po linii), sprawdzenie co sie˛ stało, w momencie zatrzymania (poprzez wyświetlenie wartości poszczególnych zmiennych), dokonywanie zmian w programie w czasie jego trwania. Wykład 2 – p. 21/3 GDB GNU Debuger (GDB) - debuger bed ˛ acy ˛ cz˛eścia˛ projektu GNU. Został utworzony w 1988 r. przez Richarda Stallmana. GDB działa w trybie tekstowym. Zdecydowana wiekszość ˛ zintegrowanych środowisk programistycznych posiadajacych ˛ interfejs graficzny potrafi prezentować wyniki działania GDB. stnieja˛ nakładki na GDB (front-end) pozwalajace ˛ wykorzystywać jego funkcjonalność przy użyciu graficznego interfejsu użytkownika (GNU Visual Debugger, Data Display Debugger). Przy użyciu gdb możemy debugować: program w czasie działania, na podstawie zrzutu pamieci ˛ (plik core), aktualnie działajacy ˛ proces (przez podanie PID). Wykład 2 – p. 22/3 GDB - przykładowa sesja (I) Kompilujemy program (lub debugowane pliki źródłowe) z opcja˛ kompilatora -g: g++ -g -o test test.cpp Uruchamiamy debuger z parametrem określajacym ˛ debugowany program: gdb test Ustawiamy breakpoint (pułapk˛e) w funkcji main: (gdb) break main Uruchamiamy program: (gdb) run Wyświetlamy linie˛ kodu otaczajacej ˛ miejsce zatrzymania: (gdb) list Wykład 2 – p. 23/3 GDB - przykładowa sesja (II) Wykonujemy kolejna˛ linie˛ programu (bez rozwijania funkcji): (gdb) next Wyświetlamy wartość zmiennej a: (gdb) print a Wymuszamy śledzenie wartości zmiennej result: (gdb) watch result Wykonujemy kolejna˛ linie˛ programu (rozwijajac ˛ funkcje): ˛ (gdb) step Ustawiamy wartość zmiennej result: (gdb) set result = 1 Kończymy prace˛ z debugerem: (gdb) quit Wykład 2 – p. 24/3 DDD Wykład 2 – p. 25/3 Eclipse Eclipse to udostepniona ˛ na zasadzie open source platforma służaca ˛ do integracji różego typu narz˛edzi (głównie programistycznych, ale nie tylko). Działaja˛ one w ramach jednego środowiska, co sprawia, że użytkownik przekonany jest, że ma doczynienia z zaawansowanym, ale pojedynczym programem. W prosty sposób środowisko Eclipse może być dostosowywane do potrzeb użytkownika poprzez konfiguracje˛ polegajac ˛ a˛ w głównej mierze na dodawaniu modułów (pluginów) dostosowanych do realizacji poszczególnych zadań. Pierwsza wersja środowiska Eclipse została zaprezentowana w listopadzie 2001 roku przez IBM oraz Object Technology International (OTI). Wykład 2 – p. 26/3 Środowisko Eclipse Po uruchomieniu Eclipse pojawia sie˛ okno bed ˛ ace ˛ obszarem roboczym składajacym ˛ sie˛ z kilku paneli. Służa˛ one do edycji poszczególnych plików projektu oraz do prezentacji struktury projektu i jego elementów. Projekty znajduja˛ sie˛ w tzw. przestrzeni projektów. Podstawowymi elementami środowiska eclipse sa: ˛ edytor, widok, perspektywa. Wykład 2 – p. 27/3 Edytor Edytor (Editor ) jest to cz˛eść środowiska, która pozwala na edycje˛ zasobów (plików) określonego typu. Wykład 2 – p. 28/3 Widok Widok (View) służy zazwyczaj do nawigacji w ramach projektu badź ˛ do wyświetlania informacji o strukturze jego elementów lub różnych komunikatów. Wykład 2 – p. 29/3 Perspektywa Perspektywa (Perspective) oznacza odpowiednia˛ zapamietan ˛ a˛ konfiguracje˛ edytorów i widoków, przywołana˛ w momencie, gdy ma zostać wykonane określonego typu zadanie. Wykład 2 – p. 30/3 Standardowe perspektywy Bezpośrednio po zainstalowaniu środowiska Eclipse do dyspozycji użytkownika sa˛ nastepuj ˛ ace ˛ perspektywy: Java, Debug, Java Browsing, Java Type Hierarchy, CVS REpository Exploring, Plug-in Development, Resource, Team Synchronizing. Wykład 2 – p. 31/3 Projekty Projekt jest podstawowa˛ jednostka˛ organizacyjna˛ w Eclipse w stosunku do zawartych w nim elementów (plików). Projekt odpowiada najcz˛eściej pojedynczej aplikacji. Wszystkie pliki tworzace ˛ aplikacje musza˛ być zawarte w projekcie. Projekt może składać sie˛ z jednego lub wielu folderów, które moga˛ być zagnieżdzone. Projekt opisany jest zestawem parametrów, które dotycza˛ sposobu kompilacji, dołaczonych ˛ bibliotek, ścieżek, itp. Projekty zgrupowane sa˛ w tzw. przestrzeni projektów (workspace). Wykład 2 – p. 32/3 Instalacja Eclipse Instalacja Eclipse polega na rozkompresowaniu pojedynczego pliku, który można pobrać ze strony www.eclipse.org (np. eclipse-SDK-3.1.2-linux-gtk.tar.gz). W powstałym katalogu eclipse bedzie ˛ znajdował sie˛ plik eclipse, który należy uruchomić. Do uruchomienia środowiska Eclipse niezbedna ˛ jest maszyna wirtualna javy (JRE). JRE firmy IBM można również pobrać ze strony Eclipse (np. IBMJava2-SDK-142.tgz) - po rozkompresowaniu należy do ścieżki przeszukiwań dla plików wykonywalnych dodać podkatalog jre/bin. Wykład 2 – p. 33/3