w12
Transkrypt
w12
Programy pomocnicze: diff, make, systemy rcs i cvs, debugger. Zarz¡dzanie wersjami. wer. 8 z drobnymi mody kacjami Wojciech Myszka 2014-02-09 16:32:37 +0100 Co jest potrzebne programi±cie? 1. Umiej¦tno±¢ logicznego my±lenia. 2. Uko«czone kursy doksztaªcaj¡ce. 3. Motywacja do pracy. 4. Komputer. 5. Zadanie. 6. Kompilator (program, który kod ¹ródªowy przetªumaczy na na kod maszynowy). 7. Jaki± edytor (program pozwalaj¡cy na wygodne wpisywanie kodu ¹ródªowego). Jak to robiono kiedy±? 1. Czas komputera byª drogi a dost¦p do niego limitowany. 2. Gdy algorytm byª gotowy rozpoczynaªo si¦ jego kodowanie (na papierze). 3. Nast¦pnie przenoszono kod na no±nik maszynowy (ta±ma papierowa, karty perforowane, ta±ma magnetyczna). 4. No±nik z kodem ¹ródªowym byª czytany przez kompilator, który tªumaczyª na posta¢ maszynow¡; w razie bª¦dów byªy one zaznaczane na wydruku. 5. W przypadku bª¦dów formalnych koder poprawiaª je i zaczynaª cykl od pocz¡tku. 6. Gdy bª¦dów nie byªo nast¦powaªo uruchomienie programu (na dostarczonych danych). 7. Wyniki otrzymywaª programista i sprawdzaª czy s¡ zgodne z oczekiwaniami. Je»eli nie rozpoczynaªa si¦ »mudna analiza algorytmu. Program byª uruchamiany po raz kolejny na danych testowych. ›eby uªatwi¢ sobie prac¦ dodawano wydruki kontrolne . 8. I tak do skutku. Praca w ±rodowisku interaktywnym 1. Najpierw odpadªy no±niki maszynowe (cho¢ w okresie przej±ciowym znacznie taniej byªo wpisa¢ kod na prymitywnym urz¡dzeniu na kartach lub tasiemce papierowej ni» blokowa¢ dost¦p do de cytowego terminala komputera i linii telekomunikacyjnej. 2. Pojawiªy si¦ ±rodowiska uªatwiaj¡ce uruchamianie programów w trybie interaktywnym. 3. Pojawiªy si¦ j¦zyki konwersacyjne. Jak jest dzi±? Ci z Pa«stwa, którzy programuj¡ wiedz¡ doskonale. Inni. . . Jak jest tworzony du»y program? 1. Podzielony jest na kawaªki (moduªy obejmuj¡ce pewne dobrze zde niowane caªo±ci ). 2. Grupy moduªów tworz¡ce pewne caªo±ci w biblioteki . grupowane s¡ 3. Wspólne de nicje grupowane s¡ w plikach nagªówkowych . Kompilacja Tworzenie programu jest procesem wieloetapowym. 1. Fragmenty programu mog¡ by¢ pisane w jakim± metaj¦zyku, który tªumaczony jest na kod ¹ródªowy. 2. Program w kodzie ¹ródªowym tªumaczony jest na posta¢ wynikow¡ (zazwyczaj nazywa si¦ to object). 3. Niektóre moduªy wynikowe grupowane s¡ w biblioteki. 4. Moduªy wynikowe i biblioteki u»ywane s¡ do budowy programu wykonywalnego. Schemat metajęzyk1 --> + | + pliki nagł---+ kod kod kod kod źródłowy1 źródłowy2 źródłowy3 źródłowy4 --> --> --> --> object1 object2 object3 object4 + +--> biblioteka1 + + --->exe --------------> + Program make Jakakolwiek zmiana w plikach z kodem metaj¦zyka, plikach nagªówkowych lub z kodem ¹ródªowym wymaga przekompilowania cz¦±ci lub wszystkich plików. Gdy projekt jest bardzo du»y problem jest bardzo powa»ny. Wymy±lono program make pozwalaj¡cy uªatwiaj¡cy programi±cie »ycie. Program korzysta ze specjalnego pliku (tradycyjnie nazywa si¦ on Make le) który opisuje struktur¦ projektu. Make le Plik Make le de niuje czynno±ci jakie nale»y wykona¢ aby z pliku jednego typu uzyska¢ plik wynikowy oraz zale»no±ci pomi¦dzy plikami. metajęzyk1 --> + | + pliki nagł---+ kod kod kod kod źródłowy1 źródłowy2 źródłowy3 źródłowy4 --> --> --> --> object1 object2 object3 object4 + +--> biblioteka1 + + --->exe --------------> + W naszym przypadku exe zale»y od biblioteka1 i object4. biblioteka1 zale»y od object1, object2, object3. object1 zale»y od kod ¹ródªowy1. kod ¹ródªowy1 zale»y od metaj¦zyk1. object2 zale»y od kod ¹ródªowy2 object3 zale»y od kod ¹ródªowy3 kod ¹ródªowy2 zale»y plik nagª Przykªadowy plik Make le albo raczej jego idea exe : b i b l i o t e k a 1 , object4 l i n k −o exe object4 −L b i b l i o t e k a 1 biblioteka1 : object1 , object2 , object3 ar −o b i b l i o t e k a 1 object1 object2 object3 object1 : kod ¹ r ód ª owy1 kompiluj kod ¹ r ód ª owy1 object2 : kod ¹ r ód ª owy2 , p l i k nag ª kompiluj kod ¹ r ód ª owy2 object3 : kod ¹ r ód ª owy3 , p l i k nag ª kompiluj kod ¹ r ód ª owy3 object4 : kod ¹ r ód ª owy4 , p l i k nag ª kompiluj kod ¹ r ód ª owy4 kod ¹ r ód ª owy1 : all : metaj¦ zyk1 metakompiluj metaj¦ zyk1 −o kod ¹ r ód ª owy1 exe clea n : k a s u j o b j e c t ∗ b i b l i o t e k a 1 exe p l i k ¹ r ód ª owy1 Metaj¦zyki 1. Metaj¦zyki to j¦zyki jeszcze wy»szego poziomu ni» j¦zyki typu C, Pascal, Fortan. 2. Pozwalaj¡ one za pomoc¡ stosunkowo prostych zale»no±ci (i bez przejmowania si¦ szczegóªami) stworzy¢ kod ¹ródªowy programu . 3. Przykªad. Chcemy napisa¢ program, który b¦dzie rozró»niaª liczby od sªów. I I Najpierw precyzyjnie musimy zde niowa¢ co to jest liczba. Liczba to jedna lub wi¦cej cyfr z zakresu od 0 do 9. W kategoriach wyra»e« regularnych mo»na to zapisa¢ tak: [0123456789]+ lub [0-9]+ (plus oznacza tu jedno lub wi¦cej powtórze«). Natomiast sªowo to jeden lub wi¦cej znaków, z których pierwszy jest liter¡ i który nie zawiera odst¦pów i innych znaków specjalnych. Zapisujemy to tak: [a-zA-Z][a-zA-Z0-9]* (gwiazdka oznacza tu zero lub wi¦cej powtórze«. Metaj¦zyki ex Idea programu jest nast¦puj¡ca: %% [0123456789]+ [ a−zA−Z ] [ a−zA−Z0 −9]∗ %% p r i n t f ( " NUMBER \ n " ) ; p r i n t f ( "WORD\ n " ) ; i sprowadza si¦ do nast¦puj¡cego: jak zobaczysz liczb¦ wypisz liczba, jak zobaczysz wyraz wypisz wyraz A sam program niewiele bardziej skomplikowany: %{ # include < s t d i o . h> %} %% [0123456789]+ [ a−zA−Z ] [ a−zA−Z0 −9]∗ %% p r i n t f ( " NUMBER \ n " ) ; p r i n t f ( "WORD\ n " ) ; Kompilacja: f l e x −o t e s t . c t e s t . l ~/ c$ l s −l t e s t . c −rw−r−−r−− 1 myszka myszka 41749 2008−05−26 15:50 t e s t . c gcc t e s t . c −o t e s t − l l Uruchomienie ~/c$ ./test ala ma 3 koty WORD WORD NUMBER WORD Bardziej skomplikowany przykªad: kalkulator 1. Chodzi mi o pokazanie jednie pewnej idei, a nie wnikanie w gª¦bokie szczegóªy. 2. Kalkulator skªada si¦ z dwu cz¦±ci: 2.1 wprowadzanie danych 2.2 przetwarzanie danych 3. Do zbudowania analizatora danych wykorzystamy program lex (lub jego darmowy odpowiednik ex) 4. Do zbudowania cz¦±ci przetwarzaj¡cej dane wykorzystamy program yacc (lub jego darmowy odpowiednik bison) Kalkulator I Wprowadzanie danych /∗ c a l c u l a t o r #1 ∗/ %{ # i n c l u d e " y . tab . h " # i n c l u d e < s t d l i b . h> void y y e r r o r ( char ∗ ) ; %} %% [0 −9]+ { y yl va l = atoi ( yytext ) ; return INTEGER ; } Kalkulator II Wprowadzanie danych [ −+\n ] { return ∗ y y t e x t ; } [ \t] ; . y y e r r o r ( " Unknown c h a r a c t e r " ) ; %% i n t yywrap ( void ) { return 1 ; } /∗ s k i p whitespace ∗/ Kalkulator I Przetwarzanie %{ # i n c l u d e < s t d i o . h> i n t y y l e x ( void ) ; void y y e r r o r ( char ∗ ) ; %} %token INTEGER %% program : program expr ' \ n ' | { p r i n t f ( " %d \ n " , Kalkulator II Przetwarzanie ; expr : INTEGER | expr ' + ' expr | expr '−' expr ; %% void y y e r r o r ( char ∗ s ) { f p r i n t f ( s t d e r r , " %s \ n " , s ) ; } { $$ = $1 + $3 ; } { $$ = $1 − $3 ; } Kalkulator III Przetwarzanie i n t main ( void ) { yyparse ( ) ; return 0 ; } Czterodziaªaniowy kalkulator z nawiasami I Dane %{ # include < s t d l i b . h> # include < s t d i o . h> # include " c a l c 1 . h " void y y e r r o r ( char ∗ ) ; extern i n t y y l v a l ; %} %% [ \ t ]+ ; [0 −9]+ { y yl va l = atoi ( yytext ) ; return INTEGER ; } [ −+∗/] { return ∗ y y t e x t ; } "(" { return ∗ y y t e x t ; } Czterodziaªaniowy kalkulator z nawiasami II Dane ")" \n . { return ∗ y y t e x t ; } { return ∗ y y t e x t ; } { char msg [ 2 5 ] ; s p r i n t f ( msg , " %s <%s > " , " i n v a l i d c h a r a c t e y y e r r o r ( msg ) ; } Czterodziaªaniowy kalkulator z nawiasami I Przetwarzanie %{ # include < s t d l i b . h> # include < s t d i o . h> i n t y y l e x ( void ) ; # include " c a l c 1 . h " %} %token INTEGER %% program : l i n e program | line line : Czterodziaªaniowy kalkulator z nawiasami II Przetwarzanie expr ' \ n ' { p r i n t f ( " %d \ n " , $1 ) ; } | ' \n' expr : expr ' + ' mulex { $$ = $1 + $3 ; } | expr '−' mulex { $$ = $1 − $3 ; } | mulex { $$ = $1 ; } mulex : mulex ' ∗ ' term { $$ = $1 ∗ $3 ; } | mulex ' / ' term { $$ = $1 / $3 ; } | term { $$ = $1 ; } Czterodziaªaniowy kalkulator z nawiasami III Przetwarzanie term : ' ( ' expr ' ) ' { $$ = $2 ; } | INTEGER { $$ = $1 ; } %% void y y e r r o r ( char ∗ s ) { f p r i n t f ( s t d e r r , " %s \ n " , s ) ; return ; } i n t main ( void ) { /∗ yydebug =1; ∗/ yy parse ( ) ; Czterodziaªaniowy kalkulator z nawiasami IV Przetwarzanie return 0 ; } Narzedzia pomocnicze 1. diff program pozwalaj¡cy porównywa¢ dwa pliki ¹ródªowe 2. patch program pozwalaj¡cy na podstawie ró»nic (raportowanych przez diff) wprowadzi¢ poprawki do plików ¹ródªowych. Pozwala to rozpowszechnia¢ znacznie mniejsze pliki. 3. rcs, cvs, svn, bazaar, . . . wersjami. systemy zarz¡dzania 4. debuger program pozwalaj¡cy uruchamia¢ programy krok po kroku, sprawdza¢ zawarto±¢ zmiennych,. . . con gure I I I I Pliki dla programu make mog¡ by¢ przygotowywane r¦cznie. Gdy tworzymy wersj¦ programu która powinna by¢ zbudowana w (nieomal) dowolnym ±rodowisku, mo»e si¦ okaza¢, »e budowa programu wymaga speªnienia pewnych dodatkowych zale»no±ci (które nie musz¡ by¢ speªnione standardowo). W takim przypadku warto skorzysta¢ z dodatkowych narz¦dzi pomocniczych. Jednym z nich jest Autotools. Narz¦dzie to skªada si¦ z szeregu skryptów, które po uruchomieniu sprawdzaj¡ w jakim ±rodowisku budowane jest oprogramowanie, staraj¡ si¦ zidenty kowa¢ zale»no±ci od dodatkowych pakietów oprogramowania (bibliotek) i tworz¡ skrypt (program), który uruchomiony na systemie docelowych sprawdza czy wszystkie zale»no±ci s¡ speªnione.