Simon Larsén

Spork: Rörelsemedveten strukturerad sammanfogning för Java

Abstract

I samband med att mjukvaruutveckling blir en alltmer parallelliserad process så blir tillkortakommanden hos ostrukturerad sammanfogning (eng: merge) mer påtagliga. Strukturerad sammanfogning, som typiskt arbetar på ett abstrakt syntaxträd istället för på text, kan till stor del avhjälpa problem med onödiga konflikter. Det finns dock aspekter av strukturerad sammanfogning som är i behov av förbättring, bland annat långsam körning, problem relaterade till omstruktureringar såsom namnändringar och förflyttningar av kodblock, samt undermålig förmåga att bevara formattering. I denna avhandling implementerar och utvärderar vi Spork, ett strukturerat sammanfogningsverktyg för program skrivna i Java. Spork bygger på förflyttningsmedvetna (eng: move-enabled) differentierings- och sammanfogningsalgoritmer som ofta automatiskt kan sammanfoga filer trots omstruktureringar. Dessa algoritmer är även effektiva, vilket gör att Spork skalar väl med större sammanfogningar. Utöver detta strävar vi efter att bevara formatering genom att direkt återanvända källkod från filversionerna som sammanfogas. Genom en experimentell utvärdering jämför vi Spork med det toppmoderna strukturerade sammanfogningsverktyget JDime på 890 sammanfogningsscenarion från 119 olika Java-projekt med öppen källkod, som totalt uppgår till 1740 olika filsammanfogningar. Viktiga resultat inkluderar att Spork och JDime är lika snabba i medianfallet, med körtider på 1.45 respektive 1.48 sekunder per filsammanfogning. Under medianen är Spork marginellt långsammre än JDime, men över medianen är Spork betydligt snabbare, vilket anytder att Spork skalar bättre med stora sammanfogningar. Spork producerar även färre men något större konflikter än JDime, vilket till stor del beror på kända problem. Vi konstaterar även att det inte finns någon statistiskt signifikant skillnad mellan verktygens förmåga att återskapa sammanfogningar som utvecklare checkat in, vilket tyder på att verktygen är på samma nivå vad gäller korrekthet. Vi visar även att Spork's förflyttningsmedvetna algoritmer låter det automatiskt lösa sammnfogningar med namnändringar som orsakar konflikter för JDime. Sammantaget utgör dessa resultat starkt bevis för att förflyttningsmedvetna algoritmer är användbara i ett praktiskt sammanfogningsverktyg för Java-kod. Vidare finner vi även att Spork's återanvändning av källkod leder till en mer än 4 gånger bättre bibehållning av formatering i medianfallet gentemot JDime. Trots dessa lovande resultat finns det fortfarande olösta problem med konflikter relaterade till förflyttningar och borttagningar av kod som sänker Spork's prestanda och pålitlighet, och ytterligare arbete krävs för att avhjälpa detta.