Plasterkowanie Leszek Mierzejewski.

Slides:



Advertisements
Podobne prezentacje
Wstęp do strumieni danych
Advertisements

C++ wykład 2 ( ) Klasy i obiekty.
Język C/C++ Funkcje.
Rekurencja 1 Podprogram lub strukturę danych nazywamy rekurencyjną, (recursive subprogram, recursive data structure) jeżeli częściowo składa się z samej.
Jarosław Kuchta Monitory.
Mgr inż.Marcin Borkowski Podstawy Java Część II
Programowanie obiektowe
Klasy i obiekty.
ALGORYTMY GRAFOWE.
Wzorce.
Język ANSI C Funkcje Wykład: Programowanie komputerów
Prowadzący: mgr inż. Elżbieta Majka
Wykład 6 Najkrótsza ścieżka w grafie z jednym źródłem
Minimalne drzewa rozpinające
Programowanie I Rekurencja.
Static, const, volatile.
Generics w .NET 2.0 Łukasz Rzeszot.
PROGRAMOWANIE STRUKTURALNE
Tworzenie i obsługa programów – przykład 3 uwagi cd. Wykorzystując różne klasy biblioteki języka Java należy pamiętać w jakim pakiecie się znajdują. Wszystkie.
Kamil Łącki Dominik Strzelichowski
Implementacja ekstensji klasy
Zrównoleglanie programu sekwencyjnego
Programowanie obiektowe w Javie
ALGORYTMY GEOMETRYCZNE.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Programowanie imperatywne i język C
Programowanie imperatywne i język C Copyright, 2004 © Jerzy R. Nawrocki Wprowadzenie.
Obiektowe metody projektowania systemów Command Pattern.
C++ wykład 2 ( ) Klasy i obiekty.
Wykład 8 Wojciech Pieprzyca
Język ANSI C Operacje we/wy
.NET Remoting Łukasz Zawadzki.
Wstęp do programowania obiektowego
Tablice tablica jest sekwencją elementów tego samego typu (prostego lub obiektowego) w Javie tablice są obiektami, a zmienne tablicowe przechowują referencję
Podstawy C# Grupa .NET PO.
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Java 3 MPDI Programowanie obiektowe W7. import java.io.*; public class X { // kontrukcja throws – określenie jakie wyjątki może dana metoda // sygnalizować
1 Wykład 8 Podprogramy. 2 Pojęcie i istota stosowania dzielenie programu na części (logicznie spójne) - nazwane - niezależne od pozostałych części - z.
Jakub Wołczko W obiektowym świecie… Jakub Wołczko
Programowanie obiektowe – zastosowanie języka Java SE
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
C# Platforma .NET CZ.3 Kuba Ostrowski.
Tworzenie Aplikacji Internetowych dr Wojciech M. Gańcza 8.
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Programowanie obiektowe – język C++
Programowanie obiektowe 2013/2014
ZWIĄZKI MIĘDZY KLASAMI KLASY ABSTRAKCYJNE OGRANICZENIA INTERFEJSY SZABLONY safa Michał Telus.
Programowanie w języku C++
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Programowanie strukturalne i obiektowe C++
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
Programowanie obiektowe Wykład 9 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/15 Dariusz Wardowski.
Paweł Starzyk Obiektowe metody projektowania systemów
PO13-1 / 19 Wykład 13 Wyjątki i ich zgłaszanie Wyłapywanie wyjątków Obsługa wyjątków Wykorzystanie polimorfizmu Filtrowanie wyjątków Błędy w konstruktorach.
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
Partnerstwo dla Przyszłości 1 Lekcja 28 Dziedziczenie i rodzaje dziedziczenia.
Podstawy informatyki Funkcje Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Programowanie Obiektowe – Wykład 6
(według:
Delegaty Delegat to obiekt „wiedzący”, jak wywołać metodę.
Programowanie Obiektowe – Wykład 2
Programowanie obiektowe – zastosowanie języka Java SE
PGO Dziedziczenie Michail Mokkas.
Zapis prezentacji:

Plasterkowanie Leszek Mierzejewski

Cel referatu kilka definicji struktury danych i algorytmy plasterkowania dla programów imperatywnych analiza zależności w programach obiektowych reprezentacja metod, klas i obiektów plasterki spełniające różne kryteria zastosowania

Definicje Plasterkowanie polega na takim okrojeniu analizowanego programu, żeby w zadanym miejscu programu oryginalnego i okrojonego, zadane zmienne miały te same wartości. Zastosowania: debugowanie, testowanie, analiza, zrozumienie programu, porównywanie programów, bezpieczeństwo, zrównoleglanie. Plasterkowanie programu wprowadził Mark Weiser. Publikacja z 1979 roku

Kryterium plasterkowania jest parą <p, V>, gdzie p jest punktem programu, a V zbiorem zmiennych z p. Backward slice stanowi podzbiór programu, który wpływa na p. Forward slice stanowi podzbiór programu, na który wpływa p. Chop, pomiędzy punktami programu p i q, stanowi podzbiór programu zależny od p, i który wpływa na q.

Backward slice void main () { int sum = 0; int i = 1; while (i < 11) { sum = sum + i; i = i + 1; } printf („%d\n”, sum); printf („%d\n”, i); Backward slice dla wyrażenia printf(„%d\n”, i)

Backward slice void main () { int sum = 0; int i = 1; while (i < 11) { sum = sum + i; i = i + 1; } printf („%d\n”, sum); printf („%d\n”, i); Backward slice dla wyrażenia printf(„%d\n”, i)

Forward slice void main () { int sum = 0; int i = 1; while (i < 11) { sum = sum + i; i = i + 1; } printf („%d\n”, sum); printf („%d\n”, i); Forward slice dla wyrażenia sum = 0

Forward slice void main () { int sum = 0; int i = 1; while (i < 11) { sum = sum + i; i = i + 1; } printf („%d\n”, sum); printf („%d\n”, i); Forward slice dla wyrażenia sum = 0

Chop void main () { int sum = 0; int i = 1; while (i < 11) { sum = sum + i; i = i + 1; } printf („%d\n”, sum); printf („%d\n”, i); Chop pomiędzy wyrażeniem sum = 0 i wyrażeniem printf(„%d\n”, i)

Chop void main () { int sum = 0; int i = 1; while (i < 11) { sum = sum + i; i = i + 1; } printf („%d\n”, sum); printf („%d\n”, i); Brak przepływu informacji Chop pomiędzy wyrażeniem sum = 0 i wyrażeniem printf(„%d\n”, i)

Program Dependence Graph graf skierowany, reprezentujący procedurę wierzchołki wierzchołki Control Flow Graph krawędzie zależności kontrolne zależności przepływu danych Backward slice dla punktu p jest podgrafem uzyskanym przez przejście grafu PDG przeciwnie do kierunku, rozpoczynając z wierzchołka p Forward slice dla punktu p jest podgrafem uzyskanym przez przejście grafu PDG z wierzchołka p. Chop dla punktów p i q jest podgrafem PDG zawartym pomiędzy wierzchołkami p i q.

System Dependence Graph PDG dla każdej procedury krawędzie pomiędzy procedurami łączą: wywołania procedur (calls) z wejściami procedur (entries) przekazywane parametry (actual parameters) z otrzymywanymi parametrami (formal parameters) wyniki procedury (results) ze zmiennymi pobierającymi rezultat (call-site return values) wyznaczenie plasterka jest problemem przejścia grafu

Backward slice void main () { int add (int x, int y) { int sum = 0; int i = 1; while (i < 11) { sum = add(sum,i); i = add(i,1); } printf („%d\n”, sum); printf („%d\n”, i); int add (int x, int y) { return x + y; } Backward slice dla wyrażenia printf(„%d\n”, i)

Backward slice void main () { int add (int x, int y) { int sum = 0; int i = 1; while (i < 11) { sum = add(sum,i); i = add(i,1); } printf („%d\n”, sum); printf („%d\n”, i); int add (int x, int y) { return x + y; } Backward slice dla wyrażenia printf(„%d\n”, i)

Plasterkowanie programów obiektowych Class Dependency Graph (ClDG) L.D. Larsen, M.J. Harrold, 1994. rozszerza SDG zawiera wejściowy wierzchołek dla każdej klasy, z którego wychodzą krawędzie do wierzchołków wejściowych metod każdy wierzchołek wejściowy rozrasta się poprzez dodanie wierzchołków reprezentujących parametry i atrybuty Object-Oriented Program Dependency Graph J.L. Chen, F.J. Wang, Y.L. Chen dwa rodzaje plasterków: state slice i behaviour slice. State slice dla obiektu jest zbiorem komunikatów i wyrażeń kontrolnych, które mogą wpływać na stan obiektu. Behaviour slice jest zbiorem atrybutów i metod zdefiniowanych w powiązanych klasach, które mogą wpływać na zachowanie obiektu.

PDG metody Reprezentowana przez control flow graph (CFG) CFG=<S, E, Sentry, Sexit> E={<s1, s2> | s1,s2  S i po wykonaniu s1 można wykonać s2}. Def(s) zmienne, których wartości są zdefiniowane (modyfikowane) w punkcie s. (Parametry formalne in są związane z wierzchołkiem wejścia.) Ref(s) zmienne, do których wartości jest odwołanie w punkcie s. Def(s,x) zmienne użyte do zdefiniowania zmiennej x. Dep_D(s,x)={(x,s’,y) | yDef(s,x)  yDef(s’)   ścieżka z s’ do s, na której y nie jest przedefiniowane. Dep_R(s)={(x,s’,x) | jeśli s jest wyrażeniem kontrolnym (if, while), x jest zmienną warunkową użytą w s i x  Def(s’)   istnieje ścieżka z s’ od s, na której x nie jest przedefiniowany}.

Dep_R(5)={wejście Trans} public class Point { int X; int Y; public Point (int x, int y) { 1: X=x; 2: Y=y; } public void Move (int z) { 3: X=X+z; 4: Y=Y+z; public void Trans (int z) { 5: if (z>0) 6: Move(z); else 7: System.out.println (“error”); public class Main { public void main (String[] args) { 8: Point P1=new Point(10,20); 9: Point P2=new Point(0,0); 10: P1.Trans(10); 11: P2.Move(100); 12: P1.X=P1.X+P2.X++; 13: System.out.println (P1.X); 14: System.out.println (P2.X); } Def(12)={P1.X, P2.X} Ref(12)={P1.X, P2.X} Def(12, P2.X)={P2.X} Def(12, P1.X)={P1.X, P2.X} Dep_D(14,P2.X)={P2.X,12,P2.X} Dep_R(5)={wejście Trans}

Znacznik na krawędzi <s1,s2>: (*,*), jeśli <s1,s2>  E1, Definicja 1 Program Dependence Graph dla metody M jest grafem skierowanym ze znacznikami. PDG=<S’,E’,T>, gdzie S’=S (S jest zbiorem wierzchołków grafu CFG), krawędzie E’=E1  E2, gdzie E1 zbiór krawędzi wyrażających zależności kontrolne, E2={<s1, s2> | (x,s2,y)  Dep_D(s1,x)  (x,s2,x)  Dep_R(s1)} jest zbiorem krawędzi wyrażających zależności danych. T jest zbiorem znaczników. Znacznik na krawędzi <s1,s2>: (*,*), jeśli <s1,s2>  E1, (x,y), jeśli (x,s2,y)  Dep_D(s1), (x,x), jeśli (x,s2,x)  Dep_R(s1). Entry (X,X) (Y,Y) (X,z) (Y,z) public void Move (int z) { 3: X=X+z; 4: Y=Y+z; } 3 4 PDG Move

Analiza zależności Rodzaje parametrów: in, out, in out, formalne, aktualne. Zależności pomiędzy parametrami opisane są za pomocą zbiorów zależności parametrów. Metody mogą współdziałać ze sobą tylko za pomocą parametrów. Call Graph – graf skierowany, opisuje powiązania pomiędzy metodami wierzchołki – metody krawędzie – komunikaty, jeśli metoda p wywołuje q, to <p,q> należy do grafu. Def(M) = In(Sexit) – {v|v jest zmienną lokalną lub parametrem typu in}; if v  Def(M) then if v jest parametrem formalnym then Def(s)=Def(s)  {a}; a jest odpowiadającym parametrem aktualnym. else Def(s)=Def(s)  {v}; // v jest zmienną globalną if y  Dep_PM(M,x) then a i b są parametreami aktualnymi odpowiadającymi zmiennym x i y Def(s,a)=Def(s)  {b};

Analiza zależności (polimorfizm) W Javie polimorfizm jest wspierany przez abstrakcyjne metody. Obiekt, których typ może zmienić się podczas wykonania programu jest nazywany obiektem polimorficznym Polimorficzny obiekt jest reprezentowany jako drzewo, w którym korzeń reprezentuje polimorficzny obiekt, a liście reprezentują obiekty możliwych typów. Java jest językiem typowanym statycznie. Polimorfizm jest reprezentowany przez zbiory zależności parametrów. Kiedy obiekt wywołuje metodę to rozważamy następujące przypadki: Obiekt ma określony typ. Obiekt nie ma określonego typu. Metoda nie polimorficzna. Koniec. Bierzemy wszystkie możliwe metody. Metoda polimorficzna. Zamieniamy na odpowiadającą metodę. Dla wszystkich możliwych typów obiektu zmieniamy polimorficzną metodę na jej odpowiedniki.

PDG klasy Klasa: pola danych PDG dla każdej metody podklasa dziedziczy PDG rodzica Reprezentacja obiektu: pola danych obiektu jako parametry drzewo korzeń - obiekt dzieci - pola danych PDG Move PDG Trans PDG Point PDG klasy Point

Partial Slicing Dla podanego kryterium plasterkowania <s, v> partial slicing plasterkuje tylko wybrane części programu (klasę, kilka metod, obiekt). Użyteczny w dużych systemach, lub gdy mamy niekompletny kod. Plasterkujemy metodę, pomijając wywołania innych metod. Analizujemy je w drugiej fazie. Plasterkowanie metody sprowadza się do plasterkowania kilku pojedyńczych metod. Tylko parametry out i in out mają wpływ na stronę wywołującą. Zależności pomiędzy parametrami można wyznaczyć przez interfejsy.

Input: Program P, kryterium plasterkowania <s0, v>. Output: Plasterek spełniający kryterium plasterkowania <s0, v>: Dep_S. Init: W={(s0, v)}; Dep_S = ; PL = ; Algorithm: repeat Usuń element (s, x) z W; for all krawędź <s, s’>, która nie była wybrana do Zaznacz jako wybraną krawędź <s, s’>; Niech T będzie znacznikiem dla <s, s’>; if T=(x, y) then // data dependence W = W  {(s’, y)}; Dep_S = Dep_S  {s’}; if y jest nazwą metody then PL = PL  {(y, y)}; if y jest aktualnym parametrem metody M then Niech y’ będzie odpowiadającym parametrem formalnym. PL = PL  {(M,y’)}; if T=(*,*) then // control dependence for all yi  Ref(s’) do W = W  {(s’,y)}; if y jest nazwą metody then PL  {(y,y)}; while W != ; while PL !=  do Usuń element (P,x) z PL; if P jest interesującą nas częścią then Dep_S = Dep_S  plasterek P dla x; if plasterek P dla x zawiera plasterek Mi dla z then PL = PL  {(Mi,z)}; end;

Kryterium plasterkowania <13,P1.X> metody Move i Trans public class Point { int X; int Y; public Point (int x, int y) { 1: X=x; 2: Y=y; } public void Move (int z) { 3: X=X+z; 4: Y=Y+z; public void Trans (int z) { 5: if (z>0) 6: Move(z); else 7: System.out.println (“error”); public class Main { public void main (String[] args) { 8: Point P1=new Point(10,20); 9: Point P2=new Point(0,0); 10: P1.Trans(10); 11: P2.Move(100); 12: P1.X=P1.X+P2.X++; 13: System.out.println (P1.X); 14: System.out.println (P2.X); } Kryterium plasterkowania <13,P1.X> metody Move i Trans

Object Slicing Głównie użyteczny przy debugowaniu i analizie programu. Kryterium plasterkowania <s, v, Object> Wyznacza wyrażenia metod wybranego obiektu spełniające kryterium <s, v> Korzystamy z algorytmu dla częściowego plasterkowania. Wyznaczamy plasterki metod obiektu Object (mogą być wywoływane pośrednio lub bezpośrednio) Wynikiem jest suma wszystkich tych plasterków.

Kryterium plasterkowania <14,P2.X,P2> public class Point { int X; int Y; public Point (int x, int y) { 1: X=x; 2: Y=y; } public void Move (int z) { 3: X=X+z; 4: Y=Y+z; public void Trans (int z) { 5: if (z>0) 6: Move(z); else 7: System.out.println (“error”); public class Main { public void main (String[] args) { 8: Point P1=new Point(10,20); 9: Point P2=new Point(0,0); 10: P1.Trans(10); 11: P2.Move(100); 12: P1.X=P1.X+P2.X++; 13: System.out.println (P1.X); 14: System.out.println (P2.X); } Kryterium plasterkowania <14,P2.X,P2>

Class Slicing Kryterium plasterkowania <s, v, Class> Wyznacza pola danych i wyrażenia metod należących do klasy Class, które spełniają kryterium plasterkowania <s, v> Algorytm: plasterkujemy każdą instancję, zaznaczając użyte pola danych (kosztowne) plasterkujemy z punktu s, w trakcie zaznaczając wyrażenia i pola danych klasy Class.

Kryterium plasterkowania <14,P2.X,Point> public class Point { int X; int Y; public Point (int x, int y) { 1: X=x; 2: Y=y; } public void Move (int z) { 3: X=X+z; 4: Y=Y+z; public void Trans (int z) { 5: if (z>0) 6: Move(z); else 7: System.out.println (“error”); public class Main { public void main (String[] args) { 8: Point P1=new Point(10,20); 9: Point P2=new Point(0,0); 10: P1.Trans(10); 11: P2.Move(100); 12: P1.X=P1.X+P2.X++; 13: System.out.println (P1.X); 14: System.out.println (P2.X); } Kryterium plasterkowania <14,P2.X,Point>

Zastosowania Zrozumienie programu Co wpływa na co? Zrównoleglanie (dekompozycja) Odzielenie osobnie wyliczanych zadań Specjalizacja plasterek = wyspecjalizowany program Porównywanie programów Wykrywanie rożnic semantycznych Testowanie Które fragmenty nie wymagają powtórnego testowania? Bezpieczeństwo Wykrywanie niebezpiecznych fragmentów programu.

Aplikacje i projekty http://www.grammatech.com/products/codesufer/ http://www.infosun.fmi.uni-passau.de/st/staff/krinke/slicing http://www.cs.wisc.edu/wpis.html http://hissa.ncsl.gov/~jimmy/unravel.html

Bibliografia Z. Chen, B. Xu, “Slicing Object-Oriented Java Programs” Andrea De Lucia, “Program Slicing: Methods and Applications” www.grammatech.com

Dekompozycja void char_count(FILE *f) { int lines = 0; int chars; BOOL eof_flag = FALSE; int n; extern void scan_line(FILE *f, BOOL *bp, int *ip); scan_line(f, &eof_flag, &n); chars = n; while (eof_flag == FALSE) { lines = lines + 1; chars = chars + n; } printf(„lines = %d\n”, lines); printf(„chars = %d\n”, chars); void line_count(FILE *f) { int lines = 0; int chars; BOOL eof_flag = FALSE; int n; extern void scan_line(FILE *f, BOOL *bp, int *ip); scan_line(f, &eof_flag, &n); chars = n; while (eof_flag == FALSE) { lines = lines + 1; chars = chars + n; } printf(„lines = %d\n”, lines); printf(„chars = %d\n”, chars);