Oprogramowanie i wykorzystanie stacji roboczych Wykład 11
Transkrypt
Oprogramowanie i wykorzystanie stacji roboczych Wykład 11
Oprogramowanie i wykorzystanie stacji roboczych Wykład 11 Dr inż. Tomasz Olas [email protected] Instytut Informatyki Teoretycznej i Stosowanej Politechnika Cz˛estochowska Wykład 11 – p. 1/5 Jam Jednym z ciekawszych projektów, które w przyszłości moga˛ zastapić ˛ program make jest Jam. Zalety: Zwiekszenie ˛ projektu nie prowadzi do tak drastycznego zwiekszania ˛ sie˛ pliku konfiguracyjnego jak ma to miejsce w przypadku programu make. Automatycznie generowane sa˛ zależności od plików nagłówkowych. Jam buduje duże projekty rozmieszczone w wielu katalogach za jednym podejściem, bez rekursywnego nawracania jak to robi make, śledzac ˛ wszystkie pliki jednocześnie. Może pracować na wielu procesorach. Jam jest mały (np. 92 kB), praktycznie nie obciaża ˛ procesora, i nie tworzy dodatkowych plików (jak np. nmake, SunOS make). Może być dowolnie konfigurowany poprzez tzw. reguły (Jamrules). Wykład 11 – p. 2/5 Jam kontra Make Plik konfiguracyjny dla programu Make: progam: data.o main.o io.o gcc data.o main.o io.o -o progam data.o: data.c gcc -c data.c main.o: main.c gcc -c main.c io.o: io.c gcc -c io.c io.o: io.h main.o: io.h data.h data.o: data.h io.h Plik konfiguracyjny dla programu Jam: Main progam : data.c main.c io.c ; Wykład 11 – p. 3/5 Apache Ant (I) Apache Ant jest cz˛eścia˛ projektu Apache Jakarta. Opiera sie˛ na podobnym założeniu co make jeżeli chodzi o zależności i reguły, ale nie zakłada że sa˛ to pliki i że głównym celem reguł jest uaktualnienie zadań. Używa jezyka ˛ XML. Jest w pełni niezależny od platformy. Został napisany z myśla˛ o Javie, ale posiada również wsparcie do tworzenia projektu w innych jezykach ˛ programowania (również w C++). Ant jest napisany całkowicie w Javie. Wykład 11 – p. 4/5 Apache Ant (II) Plik konfiguracyjny dla programu Ant jest plikiem w formacie XML. Zazwyczaj nosi nazw˛e build.xml. Składa sie˛ on z różnej ilości różnych tagów, zwanych <target> (cel). Może to być np. kompilacja, utworzenie archiwum, utworzenie dokumentacji czy też wysłanie poczty elektronicznej. Każdy cel składa sie˛ z dowolnej ilości wykonywanych zadań <task>. Jest to prosta czynność, która bedzie ˛ wykonywana, np. tworzenie katalogu, kopiowanie pliku, kompilacja kodu źródłowego. Każde zadanie może posiadać parametry i być zależne od innych zadań. Wykład 11 – p. 5/5 Apache Ant - przykładowy plik build.xml <?xml version="1.0" encoding="iso-8859-2"?> <project name="first" basedir="." default="compile"> <path id="log4jclasspath"> <pathelement location="${basedir}"/> <pathelement location="/../wspolne.jar"/> </path> <target name="compile"> <javac srcdir="." classpathref="classpath" /> </target> <target name="run"> <java classpathref="" classname="org.gridwise.Simple" /> </target> </project> Wykład 11 – p. 6/5 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 11 – p. 7/5 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 11 – p. 8/5 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 11 – p. 9/5 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 11 – p. 10/5 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 11 – p. 11/5 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 11 – p. 12/5 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 11 – p. 13/5 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 11 – p. 14/5 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 11 – p. 15/5 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 11 – p. 16/5 CppUnit - przykład (I) #ifndef OBLICZENIA_H #define OBLICZENIA_H class Obliczenia { public: int oblicz(int a, int b) { return a + b; } }; #endif /* OBLICZENIA_H */ Wykład 11 – p. 17/5 CppUnit - przykład (II) #include "obliczenia.h" #include <cppunit/TestCase.h> #include <cppunit/extensions/HelperMacros.h> class ObliczeniaTest : public CppUnit::TestCase { private: CPPUNIT_TEST_SUITE( ObliczeniaTest ); CPPUNIT_TEST( testOblicz ); CPPUNIT_TEST_SUITE_END(); public: void testOblicz(); }; CPPUNIT_TEST_SUITE_REGISTRATION(ObliczeniaTest); Wykład 11 – p. 18/5 CppUnit - przykład (III) void ObliczeniaTest::testOblicz() { Obliczenia obl; CPPUNIT_ASSERT(obl.oblicz(1, 1) == 2); CPPUNIT_ASSERT(obl.oblicz(0, 0) == 0); CPPUNIT_ASSERT(obl.oblicz(-1, -1) == -2); } Wykład 11 – p. 19/5 CppUnit - przykład (IV) #include #include #include #include #include #include <cppunit/BriefTestProgressListener.h> <cppunit/CompilerOutputter.h> <cppunit/extensions/TestFactoryRegistry.h> <cppunit/TestResult.h> <cppunit/TestResultCollector.h> <cppunit/TestRunner.h> int main( int argc, char* argv[] ) { CPPUNIT_NS::TestResult controller; CPPUNIT_NS::TestResultCollector result; controller.addListener( &result ); CPPUNIT_NS::BriefTestProgressListener progress; controller.addListener( &progress ); CPPUNIT_NS::TestRunner runner; runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); runner.run( controller ); CPPUNIT_NS::CompilerOutputter outputter( &result, std::cerr ); outputter.write(); return result.wasSuccessful() ? 0 : 1; } Wykład 11 – p. 20/5 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 11 – p. 21/5 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 11 – p. 22/5 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 11 – p. 23/5 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 11 – p. 24/5 DDD Wykład 11 – p. 25/5 Valgrind (I) Valgrind może służyć do sprawdzenia, czy program posiada poprawna˛ liczbe˛ odwołań przydzielajacych ˛ i zwalniajacych ˛ pamieć ˛ (new/delete, malloc/free). W tym celu uruchamiamy narz˛edzie Valgrind w nastepuj ˛ acy ˛ sposób: valgrind --tool=memcheck --leak-check=yes przyklad1 Dla przykładu: int main() { char *x = new char[10]; return 0; } Otrzymamy: ==20871== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==20871== at 0x4C214F7: operator new[](unsigned long) (in /usr/lib64/valgrin ==20871== by 0x400629: main (przyklad1.cpp:3) Wykład 11 – p. 26/5 Valgrind (II) Valgrind może służyć również do lokalizacji błednych ˛ odwołań do pamieci. ˛ Dla przykładu: int main() { char *x = new char[10]; x[10] = ’a’; return 0; } Otrzymamy: ==21196== Invalid write of size 1 ==21196== at 0x400676: main (przyklad2.cpp:4) ==21196== Address 0x58f703a is 0 bytes after a block of size 10 alloc’d ==21196== at 0x4C214F7: operator new[](unsigned long) (in /usr/lib64/valgrin ==21196== by 0x400669: main (przyklad2.cpp:3) Wykład 11 – p. 27/5 Valgrind (III) Valgrind może służyć również do wykrywania przypadków użycia niezainicjowanych zmiennych. Dla przykładu: int main() { int x; if(x == 0) std::cout << "x jest rowne zero" << std::endl; return 0; } Otrzymamy: ==21246== Conditional jump or move depends on uninitialised value(s) ==21246== at 0x4008F0: main (przyklad3.cpp:6) Wykład 11 – p. 28/5 Profiler Profilowanie jest w wielu wypadkach bardzo istotnym etapem tworzenia aplikacji. Zadaniem profilera jest zbadanie programu pod katem ˛ cz˛estości i czasu wykonania poszczególnych funkcji, czy też linii kodu. Informacje uzyskane z etapu profilowania pozwalaja˛ na wyodrebnienie ˛ fragmentów kodu programu, które powinny zostać zoptymalizowane. Dzieki ˛ temu moga˛ zostać zlokalizowane i zlikwidowane tzw. waskie ˛ gardła oprogramowania (bottle neck). Wykład 11 – p. 29/5 gprof Jednym z narz˛edzi do profilowania aplikacji w systemach Linux jest narz˛edzie gprof (GNU GProf). W celu wykorzystania narz˛edzia gprof należy: skompilować program w taki sposób, aby dodane zostały informacje dla profilera: g++ -pg -g przyklad.cpp -o przyklad uruchomić wcześniej odpowiednio skompilowany program ˛ informacje (utworzony zostanie plik gmon.out zawierajacy dotyczace ˛ wykonania programu): ./przyklad uruchomić narz˛edzie gprof w celu analizy wygenerowanego wcześniej pliku z profilem: gprof [opcje] ./przyklad Wykład 11 – p. 30/5 gprof - tryby pracy GNU Gprof może pracować w jednym z trzech trybów: profil płaski, graf wywołań, wydruk kodu wraz z „komentarzem” (profilowanie pojedynczych linii). Główne opcje narz˛edzia gprof: -A - włacza ˛ wydruk kodu z komentarzem, -J - wyłacza ˛ wydruk kodu z komentarzem, -p - włacza płaski profil, -P - wyłacza płaski profil, -q - włacza graf wywołań, -Q - wyłacza graf wywołań. Domyślnym zestawem opcji jest -p -q. Wykład 11 – p. 31/5 gprof - przykład double f2(int a, int b) { double r = 0.0; for (int i = 0; i < 10000; ++i) r += b/a + sin(0.5) + cos(0.7); return r; } double f1() { double res = 0.0; for (int i = 1; i <= 100; ++i) for (int j = 1; j <= 10; ++j) res += f2(i, j); return res; } int main() { std::cout << f1() << std::endl; return 0; } Wykład 11 – p. 32/5 gprof - profil płaski Each sample counts as 0.01 seconds. % cumulative self self time seconds seconds calls ms/call 100.83 0.26 0.26 1000 0.26 0.00 0.26 0.00 1 0.00 0.00 0.26 0.00 1 0.00 0.00 0.26 0.00 1 0.00 total ms/call 0.26 0.00 262.15 0.00 name f2(int, int) global constructors keyed to _Z f1() __static_initialization_and_des Wykład 11 – p. 33/5 gprof - graf wywołań index % time self children called name <spontaneous> [1] 100.0 0.00 0.26 main [1] 0.00 0.26 1/1 f1() [3] ----------------------------------------------0.26 0.00 1000/1000 f1() [3] [2] 100.0 0.26 0.00 1000 f2(int, int) [2] ----------------------------------------------0.00 0.26 1/1 main [1] [3] 100.0 0.00 0.26 1 f1() [3] 0.26 0.00 1000/1000 f2(int, int) [2] ----------------------------------------------0.00 0.00 1/1 atexit [6] [8] 0.0 0.00 0.00 1 global constructors keyed to _Z2f2ii [8] 0.00 0.00 1/1 __static_initialization_and_destruct ----------------------------------------------0.00 0.00 1/1 global constructors keyed to _Z2f2ii [9] 0.0 0.00 0.00 1 __static_initialization_and_destruction_ ----------------------------------------------- Wykład 11 – p. 34/5 gprof - wydruk kodu z komentarzem 1000 -> double f2(int a, int b){ double r = 0.0; for (int i = 0; i < 10000; ++i) r += b/a + sin(0.5) + cos(0.7); return r; } 1 -> double f1(){ double res = 0.0; for (int i = 1; i <= 100; ++i) for (int j = 1; j <= 10; ++j) res += f2(i, j); return res; } ##### -> int main(){ std::cout << f1() << std::endl; return 0; 1 -> } Wykład 11 – p. 35/5 KProf Wykład 11 – p. 36/5 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 11 – p. 37/5 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 11 – p. 38/5 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 11 – p. 39/5 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 11 – p. 40/5 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 11 – p. 41/5 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 11 – p. 42/5 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 11 – p. 43/5 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 11 – p. 44/5 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 11 – p. 45/5 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 11 – p. 46/5 Ś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 11 – p. 47/5 Edytor Edytor (Editor ) jest to cz˛eść środowiska, która pozwala na edycje˛ zasobów (plików) określonego typu. Wykład 11 – p. 48/5 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 11 – p. 49/5 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 11 – p. 50/5 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 11 – p. 51/5 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 11 – p. 52/5 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 11 – p. 53/5