Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TreeDiff - Analýza evolúcie zdrojových textov s využitím abstraktných syntaktických stromov

TreeDiff - Analýza evolúcie zdrojových textov s využitím abstraktných syntaktických stromov

V súčasnosti sa venuje nemalé úsilie získavaniu rôznych informácií zo zdrojových textov programov, ako aj podporných nástrojov pre tvorbu softvéru. Medzi tieto informácie patria aj tie, ktoré súvisia so zmenami zdrojových textov v čase. Tie nachádzajú uplatnenie napríklad pri detekcii miest zdrojového textu náchylných na chyby, pri plánovaní projektu, manažmente rizík, rozdeľovaní ľudských zdrojov, monitorovaní projektu a mnohých ďalších.

V tejto práci sa zaoberáme problémom analýzy časovej evolúcie zdrojových textov softvérových systémov. Hierarchickú štruktúru zdrojových textov reprezentujeme prostredníctvom syntaktických stromov. Analyzujeme existujúce riešenia a prístupy v tejto oblasti a na základe vykonanej analýzy navrhujeme vlastné riešenie. To umožňuje detekciu zmien zdrojového textu porovnávaním dvoch verzií toho istého textu. Toto porovnávanie a následné párovanie príslušných vrcholov stromov je založené na troch rôznych prístupoch – párovanie založené na podstromoch, párovanie vnútorných vrcholov a párovanie listov. Navrhnutú metódu v práci overujeme na zdrojových textoch reálnych softvérov.

Juraj Kostolanský

June 10, 2014
Tweet

Other Decks in Research

Transcript

  1. Analýza evolúcie zdrojových textov s využitím AST Bc. Juraj Kostolanský

    vedúci práce: Ing. Peter Lacko, PhD. Slovenská technická univerzita v Bratislave Fakulta informatiky a informačných technológií
  2. Cieľ práce Detekcia zmien medzi dvoma verziami zdrojového textu •

    využitie syntaktických stromov Postup 1. vstup: 2 verzie zdrojového textu (2 súbory) 2. vygenerovanie syntaktických stromov 3. vytvorenie párovania vrcholov stromov 4. vytvorenie zoznamu zmien
  3. Existujúce riešenia • porovnávanie textových reťazcov ◦ menej vhodné pre

    zdrojové texty • využitie stromovej štruktúry ◦ prístup zhora nadol ▪ uprednostnené párovanie vnútorných vrcholov ▪ menej úspešný ◦ prístup zdola nahor ▪ uprednostnené párovanie listov ▪ menšie využitie štruktúry stromu
  4. Generovanie syntaktických stromov Nástroj ANTLR • generátor lexikálnych a syntaktických

    analyzátorov • univerzálnosť • gramatiky známych prog. jazykov voľne dostupné • vstup: ◦ gramatika jazyka ◦ zdrojový text • výstup: ◦ syntaktický strom
  5. Párovanie vrcholov stromov Párovanie: 1. podstromov 2. vnútorných vrcholov 3.

    listov • iteratívnosť • využitie existujúceho párovania
  6. Fázy párovania Fáza 1 • párovanie podstromov (rôzna hĺbka) •

    párovanie vnútorných vrcholov Fáza 2 • párovanie listov (nezmenených, zmenených) • párovanie vnútorných vrcholov Fáza 3 • dodatočné spracovanie párovania ◦ odstránenie chybných presunov ◦ dodatočné párovanie vnútorných vrcholov
  7. Párovanie podstromov • maximálna hĺbka h max , obsahujú aspoň

    jeden list • vytvorenie množín podobných podstromov (štruktúra) • výber najpodobnejšieho podstromu ◦ predchodcovia v pôvodnom strome ◦ doterajšie párovanie
  8. Párovanie vnútorných vrcholov Dva vnútorné vrcholy (x, y) sú spárované,

    ak príslušné podstromy majú dostatočný počet (spoločne) spárovaných listov: common(x, y) / max(|x|, |y|) > t • prahová hodnota t je dynamická ◦ znižuje sa pre malé podstromy
  9. Párovanie listov • vytvorenie množín podobných listov ◦ obsahová podobnosť

    listov (Jaccard + n-gram) • výber najpodobnejšieho listu ◦ podobnosť predchodcov v pôvodnom strome ◦ doterajšie párovanie vrcholov
  10. Overovanie • implementovaný prototyp - jazyk Java • priebežné testovanie

    - umelé dáta • záverečné overovanie - dáta z 3 reálnych softvérov ◦ Apache Hadoop, Elasticsearch, Spring Framework ◦ 50 dvojíc súborov ◦ od malých zmien až po 70% riadkov, priemer 13% ◦ 250 riadkov / súbor (bez komentárov a prázdnych riadkov) ◦ 4.000 vrcholov stromu / súbor ◦ manuálne vyhodnocovanie ▪ FP - počet uzlov, ktoré nástroj chybne spároval ▪ FN - počet uzlov, ktoré nástroj chybne ponechal nespárované ▪ rýchlosť tvorby párovania
  11. Výsledky • priemere správne spárovaných vrcholov: 99,5 % • priemerná

    hodnota presnosti: 99,9 % • priemerná hodnota pokrytia: 99,5 % • hodnoty vždy > 94 % • FP < FN • čas párovania vrcholov ◦ priemer: 434ms ◦ medián: 170ms
  12. Výsledky • závislosť správne spárovaných vrcholov od veľkosti zmien iba

    v menšej miere • správnosť závisí od typu zmien
  13. Výsledky • párovanie podstromov ~ 99 % párovaní • pomer

    vrcholov spárovaných v prvej fáze klesá so vzrastajúcou veľkosťou zmien v texte:
  14. Publikácie • IIT.SRC 2014 ◦ cena dekana • Journal of

    Universal Computer Science ◦ rozpracovaný
  15. Ďalšia práca • overenie univerzálnosti navrhnutého riešenia ◦ iné programovacie

    jazyky • rozšírenie syntaktických stromov o sémantické hrany ◦ napr. previazanie premenných / metód s ich deklaráciami (premenovania) • podpora presunov medzi súbormi ◦ virtuálny vrchol • prepojenia nástroja so systémom na riadenie revízií
  16. Zhrnutie • Detekcia zmien v zdrojových textoch 1. Generovanie stromov

    (ANTLR) 2. Párovanie: a. podstromov b. vnútorných vrcholov c. listov 3. Generovanie zoznamu zmien (INS, DEL, UPD, MOV) • správnych párovaní priemerne ~ 99 % (FP < FN) • priemerná rýchlosť ~ 170 ms • porovnateľné s existujúcimi riešeniami
  17. Sémantika ASG = AST + sémantické hrany: • viaceré výhody

    ◦ premenovania: spájanie entít (metód, premenných) s ich deklaráciami ◦ všímanie si kontextu (presuny v rámci metódy / medzi metódami, …) ◦ ... • vlastná implementácia ◦ nie je triviálna (rozsah platnosti, deklarácie v iných súboroch, …) • existujúci nástroj pre sémantickú analýzu ◦ iný generátor syntaktických stromov s podporou sémentickej analýzy ◦ samostatný sémantický analyzátor • problém s univerzálnosťou
  18. Porovnanie s existujúcimi riešeniami • nástrojov je málo, väčšinou vedecké

    články ◦ autori nezverejňujú ich nástroje ◦ autori nezverejňujú testovacie dáta • určené pre zdrojové texty konkrétnych jazykov • výnimka - ChangeDistiller
  19. ChangeDistiller • jazyk Java, dostupné zdrojové texty • prorovnanie napriek

    tomu komplikované ◦ odlišné syntaktické stromy ◦ rozdielna detekcia zmien komentárov, anotácií, deklarácií importov… ◦ problém stanoviť “jednotku” • subjektívne: výsledky podobné, nástroje sa dopĺňali ◦ ťažké určiť, ktorý je lepší - závisí od dát ◦ konkrétne typy rozdielneho párovania v práci • náš nástroj generoval detailnejší zoznam zmien ◦ súvisí s rozdielnou povahou generovaných stromov