System Do Oceny Podobienstwa Kodów Zródłowych W Jezykach
Total Page:16
File Type:pdf, Size:1020Kb
i “output” — 2018/6/21 — 7:43 — page 1 — #1 i i i POLITECHNIKA WARSZAWSKA WYDZIAŁ MATEMATYKI I NAUK INFORMACYJNYCH Rozprawa doktorska mgr inż. Maciej Bartoszuk System do oceny podobieństwa kodów źródłowych w językach funkcyjnych oparty na metodach uczenia maszynowego i agregacji danych Promotor dr hab. inż. Marek Gągolewski, prof. PW WARSZAWA 2018 i i i i i “output” — 2018/6/21 — 7:43 — page 2 — #2 i i i i i i i i “output” — 2018/6/21 — 7:43 — page 3 — #3 i i i Streszczenie Rozprawa poświęcona jest wykrywaniu podobnych kodów źródłowych (zwanych także klo- nami) w językach funkcyjnych na przykładzie języka R. Detekcja klonów ma dwa główne zastosowania: po pierwsze, służy nauczycielom i trenerom, którzy prowadzą zajęcia z pro- gramowania, wskazując prace, których samodzielne wykonanie być może należy zakwestio- nować. Po drugie, pomaga zapewniać wysoką jakość kodu w projektach informatycznych, poprzez unikanie powtórzeń. Po pierwsze, w pracy zostaje zaproponowana operacyjna definicja podobieństwa pary kodów źródłowych, która służy jako formalne sformułowanie problemu. Polega ona na wymienieniu możliwych modyfikacji kodu, a następnie stwierdzeniu, że kody A i B są do siebie podobne, jeśli A może powstać przy użyciu dobrze określonych przekształceń B. Co więcej, jako że obecnie spotykane w literaturze sposoby badania skuteczności proponowa- nych metod nie są zadowalające, zaproponowano nowe podejście, pozwalające na rzetelną ocenę ich jakości. Stworzono zbiory benchmarkowe, poprzez wylosowanie zgromadzonych uprzednio funkcji z popularnych pakietów, a następnie przekształcono losowo wybrane z nich przy użyciu wymienionych wcześniej modyfikacji. Pozwala to na kontrolę zarówno rozmiaru badanej grupy funkcji, jak i jej cech: frakcji klonów czy liczby dokonywanych przekształceń. Na potrzeby pracy ustalono 108 zestawów wartości poszczególnych para- metrów sterujących cechami zbioru, a następnie dla każdego z nich, aby wyeliminować wpływ czynnika losowego, wygenerowano po 10 instancji. Po drugie, proponowane do tej pory algorytmy działają na pewnym z góry określo- nym sposobie reprezentacji kodu, np. na tokenach. Nie dokonywano porównań, jak dobrze sprawiłby się taki sam algorytm dla innego ciągu, np. surowych znaków. W tej pracy od- dzielono algorytmy, jako sposoby porównywania pewnych ciągów lub grafów, od samej reprezentacji, a następnie zbadano skuteczność wszystkich tak uzyskanych kombinacji. W szczególności zaproponowano nowy sposób reprezentacji, skupiający się na użytych wywołaniach funkcji. Takie podejście pozwala na precyzyjne określenie, w jakim stopniu na skuteczność danej metody składa się sam algorytm, który jest być może już obecny w literaturze, a w jakim – samo przekształcenie kodu do konkretnej postaci. W pracy przetestowano cztery reprezentacje (trzy sekwencyjne i jedną grafową) oraz siedem algo- rytmów porównujących (cztery dla postaci sekwencyjnych oraz trzy dla grafowych). i i i i i “output” — 2018/6/21 — 7:43 — page 4 — #4 i i i Po trzecie, dotychczasowe podejścia do porównywania kodów źródłowych oparte na grafie zależności programu (ang. Program Dependence Graph, PDG) nie są efektywne i opierają się na algorytmach, których złożoność obliczeniowa jest wykładnicza. W tej pracy zbadano po raz pierwszy w kontekście detekcji klonów skuteczność algorytmu o zło- żoności wielomianowej opartego na metodzie Weisfeilera–Lehmana służącego do znajdo- wania podobnych grafów, a także zaproponowano własną metodę o nazwie SimilaR, która jest lepiej dostosowana pod specyfikę problemu znajdowania podobnych kodów źródło- wych. Wyniki eksperymentalne potwierdzają jej lepszą skuteczność. Dodatkowo przedsta- wiono algorytm tworzenia grafu zależności programu dostosowany do specyfiki języków funkcyjnych, ilustrując jego użycie na przykładzie języka R. Zaproponowana metoda po- zwala w łatwiejszy sposób wykrywać modyfikacje stosowane przez osoby dopuszczające się plagiatu. Ponieważ różne algorytmy porównywania kodów źródłowych koncentrują się na róż- nych jego cechach, dodatkowo praca skupia się na agregacji wyników kilku takich podejść w kontekście rozwiązywania problemu klasyfikacji binarnej oraz regresji. Znane z litera- tury metody, takie jak lasy losowe czy maszyna wektorów podpierających, mają jednak zasadniczą wadę: nie pozwalają na interpretację wpływu poszczególnych metod na osta- teczny wynik, a także nie gwarantują takich własności, jak monotoniczność ze względu na poszczególne składowe czy idempotentność. Co więcej, nie pozwalają na bezpośrednie po- równanie generowanych przez nie wyników. Innymi słowy, np. wartość 0,76 zwrócona przez jedną metodę nie musi reprezentować takiego samego stopnia podobieństwa jak wartość 0,76 uzyskana przy użyciu innego algorytmu. Zaproponowano więc własną metodę agrega- cji wyników zwracanych przez algorytmy, aby podjąć pojedynczą decyzję o podobieństwie dwóch kodów źródłowych. Jest ona oparta o krzywe i płatki B-sklejane. Podejście to po- zwala zachować dobrze interpretowalną postać modelu, poprzez sprowadzenie wyników poszczególnych składowych do jednej skali. Eksperymentalnie wykazano, że lepsze wyniki są osiągane dla zestawu metod niż każdej z nich użytej pojedynczo, a także, że zapropono- wana metoda agregacji daje lepsze wyniki niż inne modele uczenia maszynowego, w tym m.in. algorytm lasów losowych. Warto ponadto zauważyć, że podejścia prezentowane w literaturze posługują się syme- tryczną postacią podobieństwa: zwracana jest jedna wartość, która opisuje, jak podobne są obie funkcje do siebie. W pracy tej uznano taki sposób za niewystarczający i zbadano podejście, w którym metoda porównująca dwie funkcje zwraca parę wartości: jak bardzo pierwsza zawiera się w drugiej (A ⊂ B) oraz jak bardzo druga zawiera się w pierwszej (A ⊃ B). Następnie zaproponowano sposoby agregacji tych dwóch wartości przy uży- ciu t-norm (minimum, produktowej i Łukasiewicza), średniej arytmetycznej lub t-konorm (dualnych do wymienionych t-norm). Dzięki odpowiedniej agregacji wyników kilku metod 4 i i i i i “output” — 2018/6/21 — 7:43 — page 5 — #5 i i i osiągnięto lepsze wyniki, niż w przypadku podejścia symetrycznego. Stworzone zostało także oprogramowanie, które pozwala na skorzystanie z dokonań niniejszej pracy w praktyce: publicznie dostępny pakiet w języku R umieszczony w re- pozytorium CRAN, a także serwis internetowy, dzięki któremu można porównać kody źródłowe. Słowa kluczowe: Język R, podobieństwo kodu, graf zależności programu, uczenie ma- szynowe, agregacja danych 5 i i i i i “output” — 2018/6/21 — 7:43 — page 6 — #6 i i i Abstract Title: A source code similarity assessment system for functional programming languages based on machine learning and data aggregation methods This thesis deals with the problem of detecting similar source codes (also known as clones) in functional languages, especially in R. Code clones’ detection is useful in programming tutoring, where teachers and trainers wish to identify suspiciously similar works, as well as in assuring source code quality, so that repeated code is avoided. This work introduces an operational definition of code similarity, which is used as a for- mal formulation of the problem: given a list of possible source code modifications, we say that two code fragments A and B are similar if A can be derived from B by means of these transformations. Based on the observation that currently employed assessment methods of clone detection algorithms are insufficient, a new approach to evaluate their perfor- mance and accuracy is proposed. Namely, the benchmark sets were created by randomly choosing functions, extracted from popular packages and transforming them by means of the aforementioned modifications. This allows to constrain the size of similar functions’ clusters, as well as the fraction of clones and number of performed transformations. 10 random sets of functions generated according to 108 different parameter scenarios were considered. One may note that the algorithms proposed so far use a fixed source code represen- tation, e.g., tokens. There were no detailed studies on how accurate an algorithm would be if it was run against a different sequence, e.g., of raw characters. In this work, the algorithms, understood as methods to compare sequences or graphs, are separated from particular representations of source codes. By means of such an approach, the effectiveness of each algorithm could have been examined with respect to each possible code represen- tation. In particular, a new way of code representation was proposed, namely the one that focuses on R function calls. In this study, four representations (three sequential and one graph-based) and seven comparison algorithms (four for sequential and three for graph data) were examined. The current state-of-the-art code clone detection approaches based on Program De- pendence Graphs (PDG) rely on some exponential-time subroutines. In this work, the performance of a polynomial-time algorithm based on the Weisfeier–Lehman method for i i i i i “output” — 2018/6/21 — 7:43 — page 7 — #7 i i i finding similar graphs is examined. What is more, its novel modification – the SimilaR algorithm has been empirically shown to outperform all the other inspected methods. Since all the algorithms for comparing source codes focus on different code similarity aspects, the current work also ephasizes the need for a proper aggregation of the results generated by different approaches, especially in the context of solving the problem of bi- nary classification and regression. However, one may note that many supervised learning algorithms like random