In the context of this thesis, we worked on mining idioms from repositories. With the term idiom, we mean a small fragment of code that recurs in repositories and has a specific semantic purpose. Idioms are characterized by their readability and reusability to perform a specific task. Experienced developers aspire to write idiomatic code, which leads to better performance and easier maintenance applications. The importance of idioms is being realized as integrated development environments such as Eclipse and IntelliJ have specific tools that offer idioms to users. Our research to address the problem of the automatic idioms extraction is focused on clustering snippets of code from high level software projects. These projects were extracted from the version control system, GitHub based on their popularity. For the representation of the snippets, Abstract Syntax Trees have been used that retain both the structural information of the code and the semantic information with variables and methods names. The comparison of the source code fragments was performed with the pq-grams algorithm which is a method of measuring the distance of trees. Then the most representative code snippets of the resulting clusters were converted to a generalized format retaining the semantic content of the code. The results from the above procedure were evaluated based on a test set and were very encouraging.
3. Ιδιώματα
• Τμήματα κώδικα (snippets) που έχουν ένα συγκεκριμένο σημασιολογικό σκοπό και
επαναλαμβάνονται σε έργα λογισμικού υψηλού επιπέδου.
• Τα ιδιώματα φαίνονται ‘’φυσικά’’ σε έναν έμπειρο προγραμματιστή.
Idiomatic Non-Idiomatic
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 3
4. Σημασία Ιδιωμάτων
• Προσφέρουν αναγνωσιμότητα και μεγαλύτερη δυνατότητα επαναχρησιμοποίησης
συμβάλλοντας στην ανάπτυξη λογισμικού υψηλού επιπέδου
• Μερικά από τα πλέον δημοφιλή IDE έχουν εργαλεία που παρέχουν την δυνατότητα
εισαγωγής ιδιωμάτων:
Live Templates built-in της JetBrain
Bing Code plug-in του Visual Studio
SnipMatch plug-in του Eclipse
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 4
5. Σκοπός της διπλωματικής εργασίας
Τα εργαλεία αυτά περιέχουν ιδιώματα τα οποία:
• έχουν εισαχθεί χειροκίνητα (SnipMatch, Live Templates)
• η εύρεση τους έχει πραγματοποιηθεί με αναζήτηση στο διαδίκτυο (Bing Code)
Ανάγκη για αυτόματη εξαγωγή ιδιωμάτων από αποθετήρια κώδικα
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 5
6. Μεθοδολογία
Βασική ιδέα υλοποίησης:
1. Εστιάσαμε σε τμήματα κώδικα που αποτελούν εντολές ελέγχου ροής (If, For, Try, While,
Do και Switch)
2. Ομαδοποίηση των snippets
3. Επιλογή των βέλτιστων ομάδων και εύρεση του πιο αντιπροσωπευτικού σημείου για
κάθε μία από αυτές (centroid)
4. Μετατροπή του centroid σε μια γενικευμένη μορφή με στόχο την ευκολότερη
χρησιμοποίηση των ιδιωμάτων
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 6
8. Δημιουργία Συνόλου Δεδομένων
Επιλέγονται τα 1500 δημοφιλέστερα repositories σε γλώσσα προγραμματισμού Java:
• Αναπαράσταση των αρχείων Java ως Αφηρημένα Συντακτικά Δέντρα (ASTs)
• Εύρεση των snippets που περιέχουν εντολές ελέγχου ροής
• Δημιουργία συνόλου δεδομένων με εγγραφές που περιέχουν snippets τόσο σε μορφή
κώδικα όσο και σε μορφή δέντρου AST
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 8
9. Προεπεξεργασία Δεδομένων
• Επιλέγουμε να διατηρήσουμε μόνο τα snippets με αριθμό γραμμών μικρότερο ή ίσο του
7
• Διαχωρίζουμε τα τμήματα κώδικα σε έξι υποομάδες με βάση τον τύπο της εντολής
ελέγχου ροής
• Αρχική ομαδοποίηση (preclustering) των snippets με βάση τη πολυπλοκότητα
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 9
Υποσύνολα
Δεδομένων
Αριθμός
Εγγραφών
If 1.034.259
For 252.587
Try 246.632
While 55.438
Switch 10.482
Do 3.482
10. Προεπεξεργασία Δεδομένων
Ο αρχικός διαχωρισμός πραγματοποιείται με βάση τις μετρικές:
1. Cyclomatic Complexity, αριθμός ανεξάρτητων μονοπατιών του snippet
2. Συνολικός αριθμός μεταβλητών και μεθόδων του snippet
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 10
Υποσύνολα
Δεδομένων
Αριθμός
Υποομάδων
Μέσος Αριθμός
Εγγραφών
If 19 51.287
For 10 25.258
Try 11 22.421
11. Σχήμα Ομοιότητας
• Δημιουργία πινάκων ομοιότητας για κάθε μία από τις υποομάδες
• Η σύγκριση των snippets πραγματοποιείται με βάση την απόσταση των AST
• Τα Αφηρημένα Συντακτικά Δέντρα χρειάζεται να μετατραπούν σε ordered labelled trees
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 11
<IfStatement>
<SimpleName>resultSetFinished</SimpleName>
<Block>
<ReturnStatement>
<BooleanLiteral>false</BooleanLiteral>
</ReturnStatement>
</Block>
</IfStatement>
12. Αλγόριθμος pq-grams
• Χρησιμοποιείται για την μέτρηση της απόστασης δύο δέντρων
• Βασίζεται σε δύο παραμέτρους p, q
• Για κάθε ένα από τα δέντρα σχηματίζεται ένα extended tree:
p-1 null κόμβοι εισάγονται στη ρίζα του δέντρου ως πρόγονοι
q-1 null κόμβοι εισάγονται ως παιδιά, πριν το πρώτο και μετά το τελευταίο παιδί, κάθε
ενδιάμεσου κόμβου (non-leaf node)
q παιδιά εισάγονται σε κάθε φύλλο του δέντρου
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 12
13. Αλγόριθμος pq-grams
• Για κάθε extended tree υπολογίζονται τα pq-grams trees
• Ως pq-gram ορίζεται το δέντρο που περιέχει ένα κόμβο με p-1 προγόνους και q παιδιά
• Παραδείγματα υποδέντρων 2,3-grams trees του T1
2,3
• Όλα τα pq-grams ενός δέντρου αποτελούν το προφίλ του δέντρου και συμβολίζεται με
Pp,q
Τ
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 13
14. Αλγόριθμος pq-grams
• Τα κοινά pq-grams trees που περιέχονται στα προφίλ των δέντρων καθορίζουν την μεταξύ
τους απόσταση σύμφωνα με την παρακάτω σχέση:
𝑑𝑝,𝑞
𝑇1, 𝑇2 = 1 − 2
𝑃𝑝,𝑞
𝑇1 ∩ 𝑃𝑝,𝑞
𝑇2
𝑃𝑝,𝑞 𝑇1 ∪ 𝑃𝑝,𝑞 𝑇2
𝑃𝑝,𝑞
(𝑇1) ∩ 𝑃𝑝,𝑞
(𝑇2) : αριθμός κοινών pq-grams δέντρων που έχουν τα T1, T2
𝑃𝑝,𝑞
(𝑇1) ∪ 𝑃𝑝,𝑞
(𝑇2) : το άθροισμα των pq-grams που έχουν τα T1, T2
• Αντίστοιχα η ομοιότητα μεταξύ δύο δέντρων δίνεται από τη σχέση:
𝑠𝑖𝑚𝑝,𝑞
𝑇1, 𝑇2 = 2
𝑃𝑝,𝑞
𝑇1 ∩ 𝑃𝑝,𝑞
𝑇2
𝑃𝑝,𝑞 𝑇1 ∪ 𝑃𝑝,𝑞 𝑇2
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 14
15. Φιλτράρισμα Εγγραφών
Με βάση τους πίνακες ομοιότητας που υπολογίστηκαν πραγματοποιείται αφαίρεση των
διπλοεγγραφών:
• Snippets με ομοιότητα μονάδα που ανήκουν στο ίδιο repository
• Snippets με ομοιότητα μονάδα που ανήκουν σε διαφορετικά repository αλλα
προέρχονται από το ίδιο java package το οποίο μπορεί να χρησιμοποιείται από πολλά
αποθετήρια κώδικα
Η διαδικασία του φιλτραρίσματος συμβάλει σημαντικά ώστε οι ομάδες που θα προκύψουν
στη συνέχεια να περιέχουν snippets που θα προέρχονται από μεγάλο αριθμό διαφορετικών
προγραμματιστών.
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 15
16. Ομαδοποίηση
• Συγχωνευτική Ιεραρχική ομαδοποίηση για κάθε έναν από τους πίνακες ομοιότητας
• Υπολογισμός απόστασης ομάδων με τη μέθοδο Average Linkage
𝑑 𝑟, 𝑠 =
1
𝑛𝑟𝑛𝑠
𝑖=1
𝑛𝑟
𝑗=1
𝑛𝑠
(𝑑(𝑟𝑖 , 𝑠𝑗))
• Επιλογή βέλτιστου αριθμού ομάδων με τη χρήση της μετρικής average silhouette
η μέση απόσταση του σημείου από τα υπόλοιπα σημεία της ομάδας a 𝑖 =
1
𝐶𝑖 −1 𝑗∈𝐶𝑖
𝑗≠𝑖
𝑑(𝑖, 𝑗)
η μέση απόσταση του σημείου από το αμέσως επόμενο όμοιο cluster 𝑏 𝑖 = min
𝑘≠𝑖
1
𝐶𝑘
𝑗∈𝐶𝑘
𝑑(𝑖, 𝑗)
𝑠 𝑖 =
𝑏 𝑖 − 𝑎(𝑖)
m𝑎𝑥 𝑎 𝑖 , 𝑏(𝑖)
• Βέλτιστη τιμή αριθμού ομάδων 𝑘𝑜𝑝𝑡𝑖𝑚𝑎𝑙 = 𝑘 ∶ m𝑎𝑥 ( 𝑠(𝑘))
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 16
17. Επιλογή Ομάδων
Η επιλογή των βέλτιστων ομάδων πραγματοποιείται με τη χρήση τριών παραμέτρων:
• Μέγεθος ομάδων
• Συνοχή που παρουσιάζουν οι ομάδες
𝑐𝑜ℎ𝑒𝑠𝑖𝑜𝑛 = 1 −
1
𝐶 − 1
𝑥∈𝐶
𝑑(𝑥, 𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑)
• Αριθμός διαφορετικών repositories
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 17
Cluster
Type
Size
Threshold
Cohesion
Threshold
Repositories
Threshold
If 80 0.7 8
For 100 0.7 40
Try 100 0.7 30
While 50 0.7 30
Do 25 0.7 5
Switch 80 0.7 10
18. Γενικευμένη Μορφή Ιδιωμάτων
• Τα ιδιώματα χρειάζεται να περιέχουν ένα πλήθος μεταδεδομένων
• Για κάθε ένα από τα tokens του centroid υπολογίζεται η συχνότητα με την οποία
εμφανίζεται στα snippets του clusters
• Επιλέγουμε να διατηρήσουμε μόνο αυτά με συχνότητα μεγαλύτερη από 0.5
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 18
19. Παραδείγματα Ιδιωμάτων
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 19
Centroids Idioms abstract form
while ((line=reader.readLine()) != null) {
result.add(line);
}
while ((line=$(object1).readLine()) != null) {
$(object2).$(method1)(line);
}
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
$(object1).$(method1)();
} catch ($(exception) e) {
e.printStackTrace();
}
if (value == null) {
throw new IllegalArgumentException("Cannot
generate variable name for an Object return type
with null value");
}
if ($(object1) == null) {
throw new $(exception1)($(string1))
}
20. Αξιολόγηση Ομάδων
Οι ομάδες που χρησιμοποιήθηκαν για την εξαγωγή των ιδιωμάτων παρουσιάζουν τα εξής
χαρακτηριστικά:
• Έχουν κατά μέσο όρο 297 snippets
• Μέση τιμή συνοχής 0.81
• Μέσο αριθμό διαφορετικών repositories 59
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 20
21. Αξιολόγηση Ιδιωμάτων
• Για τον έλεγχο της χρησιμότητας των ιδιωμάτων χρησιμοποιήθηκαν 500 αποθετήρια
κώδικα (test set)
• Συγκρίνουμε τη γενικευμένη μορφή των ιδιωμάτων του συστήματος με τα snippets που
περιέχονται στο σύνολο αξιολόγησης
• Με βάση τη σύγκριση αυτή υπολογίζουμε δύο βασικά στατιστικά:
Σε πόσα repositories χρησιμοποιείται το κάθε ιδίωμα
Πόσα ιδιώματα χρησιμοποιεί το κάθε αποθετήριο κώδικα
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 21
22. Αξιολόγηση Ιδιωμάτων
• Τα ιδιώματα χρησιμοποιούνται κατά μέσο όρο σε 27 διαφορετικά repositories του test
set
• Μόνο δύο από τα ιδιώματα δεν βρέθηκαν να χρησιμοποιούνται σε κανένα αποθετήριο
κώδικα
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 22
23. Αξιολόγηση Ιδιωμάτων
• Το 81% από τα repositories χρησιμοποιούν τουλάχιστον ένα από τα ιδιώματα του
συστήματος
• Κατά μέσο όρο χρησιμοποιούν 4 ιδιώματα
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 23
24. Συμπεράσματα
Αναπτύξαμε ένα σύστημα αυτόματης εξαγωγής ιδιωμάτων για το οποίο ισχύει ότι:
• Αξιοποιεί τόσο τη δομική όσο και τη σημασιολογική πληροφορία των snippets
• Δημιουργεί ομάδες από τις οποίες προκύπτουν ενδιαφέροντα τμήματα κώδικα με σαφές
σημασιολογικό περιεχόμενο
• Μετατρέπει τα ιδιώματα σε μια γενικευμένη μορφή ώστε το κάθε snippet να
προσαρμόζεται στις ανάγκες του προγραμματιστή
• Τα ιδιώματα που εξαγάγαμε χρησιμοποιούνται σε ικανοποιητικό βαθμό από τα
repositories του test set
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 24
25. Μελλοντική Εργασία
• Επέκταση μεθοδολογίας ώστε να περιλαμβάνει και τμήματα κώδικα που δεν αποτελούν
εντολές ελέγχου ροής
• Παραλληλοποίηση των συγκρίσεων με τη χρήση GPU
• Προσθήκη περιγραφής για κάθε ιδίωμα, ώστε να είναι ευκολότερη η εισαγωγή τους σε
ένα σύστημα προτάσεων
• Εφαρμογή της μεθοδολογίας σε γλώσσες προγραμματισμού λιγότερο δομημένες έτσι
ώστε να συγκριθούν τα τελικά αποτελέσματα
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 25
26. Ευχαριστίες
Θα ήθελα να ευχαριστήσω θερμά τους:
• κ. Ανδρέα Συμεωνίδη
• κ. Θωμά Καρανικιώτη
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 26
27. Σας ευχαριστώ για την προσοχή σας
Ερωτήσεις;
Νοέμβριος 2020 Εξαγωγή Ιδιωμάτων από Αποθετήρια Κώδικα 27