SlideShare una empresa de Scribd logo
1 de 52
Descargar para leer sin conexión
Nagyméretű forráskódtárak
inkrementális statikus analízise
konzulensek: Szárnyas Gábor
Dr. Ráth István
Budapesti Műszaki és Gazdaságtudományi Egyetem
Méréstechnika és Információs Rendszerek Tanszék
Hibatűrő Rendszerek Kutatócsoport
Stein Dániel, BSc
Folytonos integráció (FI)
Continuous Integration (CI) – Több fejlesztő együttműködése
– Integrációs problémák
megelőzése
– Például
– Jenkins
– Hudson
– Travis CI
2
Verziókezelés
Fordítás
Fejlesztés
Egység- és
integrációs teszt
Statikus analízis
– Nincs szükség a program
fordítására és futtatására
– Alaki és strukturális jellegű
szabályellenőrzést végez
– FI mellett vagy részeként
alkalmazandó
– Kódmintaillesztést használunk
3
Verziókezelés
Fordítás
Fejlesztés
Egység- és
integrációs teszt
Kódanalízis
– A kódanalízis erőforrás- és időigényes folyamat
– Lassú, nem alkalmazható FI-szerű ütemezéssel
Megoldandó probléma
4
egységteszt
kódanalízis
☼ ☆☾☆
– A kódanalízis erőforrás- és időigényes folyamat
– Lassú, nem alkalmazható FI-szerű ütemezéssel
– Átmeneti megoldás: tömbösítés
Megoldandó probléma
5
egységteszt
kódanalízis
☼ ☆☾☆
egységteszt
kódanalízis
– A kódanalízis erőforrás- és időigényes folyamat
– Lassú, nem alkalmazható FI-szerű ütemezéssel
– Átmeneti megoldás: tömbösítés
Minél hamarabb,
minél gyorsabban
eredményt kell adni.
Megoldandó probléma
6
egységteszt
kódanalízis
☼ ☆☾☆
egységteszt
kódanalízis
A bemutatott megoldás
–Inkrementális elvet alkalmazunk
A számított eredményt csak a későbbi
változás hatásával frissítjük.
–Projekt helyett fájl szintű feldolgozás
–Későbbi skálázhatóságot,
eloszthatóságot figyelembe véve terveztük
7
kódanalizátor
Δ2.-1.1.
Architektúra áttekintés
8
Munkaterület Függőségi
gráf
Absztrakt
szintaxis gráf
Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Main.java | ++----
Dependency.jar | +++++-
FIterator.java | ----
Cparser.java | ++
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
.
jamoppdiscoverer
ChangeProcessor.java
CommandParser.java
FileIterator.java
iterators
DepCollector.java
FileDiscoverer.java
InitIterator.java
Main.java
whitepages
ConnectionMgr.java
DependencyMgr.java
pojo
Dependency.jar
.jar
.java
Kiértékelési jelentés
<!>
<?>
<.>
JaMoPP
Verzió-
kezelő
Architektúra áttekintés
9
Munkaterület Függőségi
gráf
Absztrakt
szintaxis gráf
Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Main.java | ++----
Dependency.jar | +++++-
FIterator.java | ----
Cparser.java | ++
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
.
jamoppdiscoverer
ChangeProcessor.java
CommandParser.java
FileIterator.java
iterators
DepCollector.java
FileDiscoverer.java
InitIterator.java
Main.java
whitepages
ConnectionMgr.java
DependencyMgr.java
pojo
Dependency.jar
.jar
.java
Kiértékelési jelentés
<!>
<?>
<.>
JaMoPP
Verzió-
kezelő
Architektúra áttekintés
10
Munkaterület Függőségi
gráf
Absztrakt
szintaxis gráf
Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Main.java | ++----
Dependency.jar | +++++-
FIterator.java | ----
Cparser.java | ++
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
.
jamoppdiscoverer
ChangeProcessor.java
CommandParser.java
FileIterator.java
iterators
DepCollector.java
FileDiscoverer.java
InitIterator.java
Main.java
whitepages
ConnectionMgr.java
DependencyMgr.java
pojo
Dependency.jar
.jar
.java
Kiértékelési jelentés
<!>
<?>
<.>
JaMoPP
Verzió-
kezelő
Architektúra áttekintés
11
Munkaterület Függőségi
gráf
Absztrakt
szintaxis gráf
Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Main.java | ++----
Dependency.jar | +++++-
FIterator.java | ----
Cparser.java | ++
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
.
jamoppdiscoverer
ChangeProcessor.java
CommandParser.java
FileIterator.java
iterators
DepCollector.java
FileDiscoverer.java
InitIterator.java
Main.java
whitepages
ConnectionMgr.java
DependencyMgr.java
pojo
Dependency.jar
.jar
.java
Kiértékelési jelentés
<!>
<?>
<.>
JaMoPP
Verzió-
kezelő
Munkaterület
Main.java | ++----
Dependency.jar | +++++-
FIterator.java | ----
Cparser.java | ++
.
jamoppdiscoverer
ChangeProcessor.java
CommandParser.java
FileIterator.java
iterators
DepCollector.java
FileDiscoverer.java
InitIterator.java
Main.java
whitepages
ConnectionMgr.java
DependencyMgr.java
pojo
Dependency.jar
Verzió-
kezelő
Architektúra verziókövetés
–Verziókezelőre épül
– Követi a fájlok változását, illetve
az elágazó fejlesztési ágakat
– Lekérdezhető a fájlok pillanatnyi
állapota és a verziók közötti
módosítások listája
–Munkaterület-központú
– Projekt forrása
– Függőségek forrása
(amennyiben elérhető)
12
Függőségi
gráf
Absztrakt
szintaxis gráf
.jar
.java
JaMoPP
Architektúra átalakítás
–Függőségi gráf
– Segédkomponens a későbbi
feldolgozáshoz
– A gráf élei a Java függőségeknek
megfeleltethetők
–Absztrakt szintaxis gráf
– A projektet modellé, majd azt
gráffá alakítjuk
13
Függőségi
gráf
Absztrakt
szintaxis gráf
.jar
.java
JaMoPP
Architektúra átalakítás
–Függőségi gráf
– Segédkomponens a későbbi
feldolgozáshoz
– A gráf élei a Java függőségeknek
megfeleltethetők
–Absztrakt szintaxis gráf
– A projektet modellé, majd azt
gráffá alakítjuk
14
 Minden fájlra leírók gyűjtése és tárolása:
package, szükséges fordítási egységek, stb.
 Minden további alrendszer számára elérhető
információval szolgál
Függőségi
gráf
Absztrakt
szintaxis gráf
.jar
.java
JaMoPP
Architektúra átalakítás
–Függőségi gráf
– Segédkomponens a későbbi
feldolgozáshoz
– A gráf élei a Java függőségeknek
megfeleltethetők
–Absztrakt szintaxis gráf
– A projektet modellé, majd azt
gráffá alakítjuk
15
Függőségi
gráf
Absztrakt
szintaxis gráf
.jar
.java
JaMoPP
Architektúra átalakítás
–Függőségi gráf
– Segédkomponens a későbbi
feldolgozáshoz
– A gráf élei a Java függőségeknek
megfeleltethetők
–Absztrakt szintaxis gráf
– A projektet modellé, majd azt
gráffá alakítjuk
16
 A forráskód struktúrájának gráf
reprezentációja
 Nem tartalmaz minden információt
 Részgráfokból állítjuk elő a teljes gráfot
Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
17
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
18
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
 Gráfadatbázis
 Technológiai
választásunk: 4store
 Elasztikusan
skálázódik
Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
19
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
20
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
 Gráfmintaként (SPARQL nyelven)
megfogalmazott kódminták
 Lekérdezések végrehajtása
(akár inkrementálisan)
 Jelentés előállítása (vagy frissítése)
Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
21
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
 Gráfmintaként (SPARQL nyelven)
megfogalmazott kódminták
 Lekérdezések végrehajtása
(akár inkrementálisan)
 Jelentés előállítása (vagy frissítése)
 ASG-n értelmezett minta
 Informális specifikáció
Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
22
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
 Gráfmintaként (SPARQL nyelven)
megfogalmazott kódminták
 Lekérdezések végrehajtása
(akár inkrementálisan)
 Jelentés előállítása (vagy frissítése)
Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
23
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
 Visszajelzés a
felhasználónak
 Felsorolja a szabályokat
megszegő kódrészleteket
 Gráfmintaként (SPARQL nyelven)
megfogalmazott kódminták
 Lekérdezések végrehajtása
(akár inkrementálisan)
 Jelentés előállítása (vagy frissítése)
Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
24
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
 Gráfmintaként (SPARQL nyelven)
megfogalmazott kódminták
 Lekérdezések végrehajtása
(akár inkrementálisan)
 Jelentés előállítása (vagy frissítése)
Példa forráskód
public static String toMonth(int month) {
switch (month) {
case 1: return "January";
case 2: return "February";
case 3: return "March";
case 4: return "April";
case 5: return "May";
case 6: return "June";
case 7: return "July";
case 8: return "August";
case 9: return "September";
case 10: return "October";
case 11: return "November";
case 12: return "December";
default: return "Invalid month";
}
}
25Bemeneti forráskód (részlet) Kódmodell (részlet)
Példa forráskód
public static String toMonth(int month) {
switch (month) {
case 1: return "January";
case 2: return "February";
case 3: return "March";
case 4: return "April";
case 5: return "May";
case 6: return "June";
case 7: return "July";
case 8: return "August";
case 9: return "September";
case 10: return "October";
case 11: return "November";
case 12: return "December";
default: return "Invalid month";
}
}
26Bemeneti forráskód (részlet) Kódmodell (részlet)
Példa forráskód
public static String toMonth(int month) {
switch (month) {
case 1: return "January";
case 2: return "February";
case 3: return "March";
case 4: return "April";
case 5: return "May";
case 6: return "June";
case 7: return "July";
case 8: return "August";
case 9: return "September";
case 10: return "October";
case 11: return "November";
case 12: return "December";
default: return "Invalid month";
}
}
27Bemeneti forráskód (részlet) Kódmodell (részlet)
Példa forráskód
public static String toMonth(int month) {
switch (month) {
case 1: return "January";
case 2: return "February";
case 3: return "March";
case 4: return "April";
case 5: return "May";
case 6: return "June";
case 7: return "July";
case 8: return "August";
case 9: return "September";
case 10: return "October";
case 11: return "November";
case 12: return "December";
default: return "Invalid month";
}
}
28Bemeneti forráskód (részlet) Kódmodell (részlet)
Példa forráskód
public static String toMonth(int month) {
switch (month) {
case 1: return "January";
case 2: return "February";
case 3: return "March";
case 4: return "April";
case 5: return "May";
case 6: return "June";
case 7: return "July";
case 8: return "August";
case 9: return "September";
case 10: return "October";
case 11: return "November";
case 12: return "December";
default: return "Invalid month";
}
}
29Bemeneti forráskód (részlet) Kódmodell (részlet)
switch
:Switch
...
january
:NormalSwitchCase
december
:NormalSwitchCase
#//Switch/cases
#//Switch/variable
month
:IdentifierReference
Példa gráfminta
30
sw: Switch
sc: DefaultSwitchCase
cases
Default ág nélküli switch-
eket kereső gráfminta
Absztrakt szintaxis gráf
(részlet) Gráfminta-illeszkedési találatok:
switch
:Switch
...
january
:NormalSwitchCase
december
:NormalSwitchCase
#//Switch/cases
#//Switch/variable
month
:IdentifierReference
Példa gráfminta
31
sw: Switch
sc: DefaultSwitchCase
cases
Default ág nélküli switch-
eket kereső gráfminta
Absztrakt szintaxis gráf
(részlet) Gráfminta-illeszkedési találatok: switch :Switch
switch
:Switch
...
january
:NormalSwitchCase
december
:NormalSwitchCase
default
:DefaultSwitchCase
#//Switch/cases
#//Switch/variable
month
:IdentifierReference
Példa gráfminta
32
sw: Switch
sc: DefaultSwitchCase
cases
Default ág nélküli switch-
eket kereső gráfminta
Absztrakt szintaxis gráf
(részlet) Gráfminta-illeszkedési találatok: switch :Switch
switch
:Switch
...
january
:NormalSwitchCase
december
:NormalSwitchCase
default
:DefaultSwitchCase
#//Switch/cases
#//Switch/variable
month
:IdentifierReference
Példa gráfminta
33
sw: Switch
sc: DefaultSwitchCase
cases
Default ág nélküli switch-
eket kereső gráfminta
Absztrakt szintaxis gráf
(részlet) Gráfminta-illeszkedési találatok:
Mérési kiértékelés
–Kiértékelő teljesítménymérés
– Az egyes fázisok egymáshoz viszonyított futási idejét vizsgáljuk
– Különböző méretű, nyílt forráskódú projekteken végezzük el az analízist
– Alap (teljes projekt) és módosítás inkrementális feldolgozását mérjük
–Mérési környezet: publikus felhő, elosztott adatbázissal
34
Forrás projekt Kódsorok száma Fájlok száma
Physhun 4 227 53
Java DjVu 41 497 69
Xalan 338 316 907
92.18
425.79
2 378.25
1
10
100
1000
Physhun
4 227 / 35
Java DjVu
41 497 / 69
Xalan
338 316 / 907
Teljesfeldolgozásiidő[s]
(FG,ASG,mentés,lekérdezés)
Projektek
forrás sorok száma / fájlok száma
Mérési eredmények
35
92.18
425.79
2 378.25
1
10
100
1000
Physhun
4 227 / 35
Java DjVu
41 497 / 69
Xalan
338 316 / 907
Teljesfeldolgozásiidő[s]
(FG,ASG,mentés,lekérdezés)
Projektek
forrás sorok száma / fájlok száma
Mérési eredmények
36
1 555
345 951
27 535
213
966
23 354 27 870
201
100
1000
10000
100000
1000000
10000000
Függőségi gráf
építése
Absztrakt szintaxisgráf
összeállítása
Modell
tárolása
Lekérdezések
futtatása
Fázisfutásiideje[ms]
Első, teljes futtatás
Módosítás inkrementális feldolgozása
Nagyságrendi
különbség
Mérési eredmények inkrementális
37
1 555
345 951
27 535
213
966
23 354 27 870
201
100
1000
10000
100000
1000000
10000000
Függőségi gráf
építése
Absztrakt szintaxisgráf
összeállítása
Modell
tárolása
Lekérdezések
futtatása
Fázisfutásiideje[ms]
Első, teljes futtatás
Módosítás inkrementális feldolgozása
Nagyságrendi
különbség
Mérési eredmények inkrementális
38
-85%
4.09 8.42
4.35
2.14
28.36
52.19
375.04
1 10 100 1000
FindBugs
PMD
Checkstyle
Columbus
inkr. ISAaC
ISAaC
Teljes futási idő [s]
Fordítás
Analízis
Mérési eredmények összehasonlítva
39
Összefoglalás
– Szabványos formátumok és
cserélhető komponensek
– Java forráskód átalakítása RDF
gráffá, akár elosztott
megközelítéssel
– Az elkészített gráf inkrementális
frissítése is megoldott
– Moduláris, bővíthető és skálázható
inkrementális statikus analízis
keretrendszert készítettem
– Java forrást RDF gráffá alakító
segédeszközt implementáltam
– Benchmark funkciókkal bővítettem
a keretrendszert és méréseket
végeztem
40
Újszerű megközelítés az inkrementális statikus analízishez:
Továbbfejlesztési lehetőségek
– Inkrementális analízis INCQUERY-D használatával
– Feldolgozás granularitásának javítása minden fázisban
– Keretrendszer elosztottá tétele
41
Átalakítás és
perzisztálás
Munkaterület
beállítása
Függőségek
felderítése
Lekérdezések
futtatása
Szerver 1
Szerver 2
Szerver 3
Szerver 4
Szerver 1
Szerver 2
Szerver 3
Szerver 4
Szerver 1
Szerver 2
Szerver 3
Szerver 4
Sz. 1
Sz. 2
Sz. 3
Sz. 4
Á P
Á P
Á P
Á P
L1 L2
L3
L4 L5
L6
Összefoglalás
– Szabványos formátumok és
cserélhető komponensek
– Java forráskód átalakítása RDF
gráffá, akár elosztott
megközelítéssel
– Az elkészített gráf inkrementális
frissítése is megoldott
A dolgozat eredményei a MONDO
EU-FP7 kutatási projekthez
kapcsolódnak, annak egyik
demonstrátorát képezik.
42
Újszerű megközelítés az inkrementális statikus analízishez:
Bírálói kérdések
A dolgozat említi, hogy a JaMoPP Java 5 támogatása az újabb
verziójú Java kódok elemzését nem teszi lehetővé. Van lehetőség
ennek a komponensnek a lecserélésére? Milyen alternatív
megoldásokat vizsgált meg?
– Réteges az architektúra, a komponens cserélhető, de jobb jelölt nincs
jelenleg nincs.
– A metamodell bővíthető, de sok munka lenne. Az újabb verziójú kódot
is feldolgozza, de nem hibamentesen.
– Alternatívák:
– MoDisco (projekt szintű feldolgozás, de átalakítható)
– Columbus (zárt forráskódú, viszont JaMoPP-hoz jobban hasonlít)
43
Többször említésre kerül az adatbázis alapú tárolás által lehetővé
tett elosztott ellenőrzés lehetősége. Milyen tényezőket érdemes egy
ilyen megoldásnak a teljesítménybeli és pénzügyi
hatékonyságágának megtervezéséhez figyelembe venni?
– Használt tárterület
– A forráskód XMI modellje ~2-5×.
– Az RDF sorosítás ~4-10×.
– Az adatbázis viszont tömörítheti a
sokszor ismétlődő szövegrészleteket
(pl. URI, attribútum).
– Elérési sebesség
– Több adatbázis szerver gyorsíthatja az
olvasást, keresést (de ez nem lassú).
– Az írási és szinkronizációs sebesség
viszont csökkenhet.
Bírálói kérdések
44
Bírálói kérdések
A már létező ellenőrző eszközökhöz nagy számú szabály áll rendelkezésre.
Milyen csoportokra lehetne osztani ezeket a szabályokat az esetleges
migráció megtervezésekor technológia és bonyolultság szerint? Esetleg
minden szabály átírása egyértelmű? Mekkora feladatot jelentene pl. a
PMD-hez rendelkezésre álló szabályok átírása?
– A mintaalapú megközelítés (PMD) könnyebben átírható. A metamodellek
különbsége miatt kézzel kell feldolgozni, de JDT AST-szerű mindkét
metamodell.
– Az IncQuery-D használatával bonyolultabb lekérdezések (pl. count)
megvalósítható, nem csak mintaillesztés.
– Csoportra példa:
sorrend alapú minta (nem az utolsó case a default), ami RDF esetén
nehezebben megoldható. 45
Bírálói kérdések
A forráskódban fellelhető hibákon kívül nagy projekteknél komoly
problémát jelent, ha egy adott library-nek több verziója is jelen van
futás közben. Ezt a build rendszerek, pl. Maven, Gradle, explicit
kizárásokkal, felülírásokkal és további “trükkökkel” próbálják
orvosolni. Volna lehetőség ilyen jellegű problémák kimutatására a
keretrendszer kiterjesztésével? Milyen módon lehetne ezt
implementálni?
– A keretrendszer nem pont erre lett kialakítva, a classpath kezdetleges.
– Library függésével, függőségi és hatásanalízissel Csikós Donát
foglalkozott, az ő munkáját lehetne követni.
– Több library kezelése megoldható a keretrendszer paraméterezésével
és a projektek verziókezelt mentésével. Ehhez átdolgozott mentési
stratégia szükséges.
46
Bírálói kérdések
Hogyan hasonlítható össze a készített ISAaC rendszer egy olyan
rendszerrel hatékonyság szempontjából, amely egy meglévő statikus
kódanalizátort futtat a megváltozott fájlokon (és ezek függőségi
lezártján)?
– FindBugs és PMD analizátorok integrálása a benchmark rendszerbe
– Találatok ellenőrzése
– Vagy nem használjuk fel a változások listáját (teljes futtatás)
– Vagy a modosítás függőségi lezártján futtatjuk az ellenőrzést
– Befolyásolhatja a mérés hűségét, hogy a lezárt alatt ugyanazt érti-e a
másik szoftver fejlesztője, mint a mi megoldásunkban
47
Bírálói kérdések
Jelenlegi granularitás a fájl, mint egység, ami jóval nagyobb
lehet, mint a "changeset". Mi a praktikusan elérhető legkisebb
granularitás?
– JaMoPP esetén a feldolgozás fájlonként történik, ennél kisebb
egység nem vizsgálható.
– Azonban hatásanalízis használatával a szükséges feldolgozandó
fájlok száma csökkenthető.
– Modellösszehasonlító használatával AST node szintig levihető a
granularitás.
48
Bírálói kérdések
Kb. mennyi, az inkrementális mivoltából fakadó extra tárhelyet
használ a rendszer a példában szereplő projektek esetén?
– Az inkrementális feldolgozáshoz csak a módosítás előtti
szerializált részgráfot tároljuk el.
– Egy fájlhoz tehát legfeljebb a gráf formátumban tárolt modell
méretének kétszerese szükséges.
– A szövegesen tárolt gráf tömöríthető.
49
Bírálói kérdések
Mi szükséges a Java mellett más nyelvek támogatásához?
– A JaMoPP-hoz hasonló parser, ami képes a Java forrásból
programmatikusan feldolgozható példánymodellt készíteni.
– Szükséges, hogy a fájlok közti hivatkozás részenként sorosítható
legyen, egyértelmű, hierarchikus azonosítókkal.
projects://ISAaC/src/Teszt.java#//@statements.0/@...
50
1.49 1.95
11.42
81.8
395.6
2 110.8
8.73
28.01
255.79
1
10
100
1000
Physhun
4 227
Java DjVu
41 497
Xalan
338 316
Szükségesidő[s]
Függőségi gráf építése
Absztrakt szintaxisgráf összeállítása
Modell tárolása
Mérési eredmények
51
1.49 1.95 11.42
81.79
395.61
2 110.82
8.73
28.01
255.79
0
500
1000
1500
2000
2500
Physhun
4 227
Java DjVu
41 497
Xalan
338 316
Time[s]
Persisting the ASG
Transforming the Code into an ASG
Building the Dependency Graph
Mérési eredmények
52

Más contenido relacionado

Similar a Nagyméretű forráskódtárak inkrementális statikus analízise

Enterprise java evolució, avagy java ee (
Enterprise java evolució, avagy java ee (Enterprise java evolució, avagy java ee (
Enterprise java evolució, avagy java ee (Attila Balogh-Biró
 
Szerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelvenSzerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelvenKrisztián Gyula Tóth
 
Univerzalis Entitas Kezeles - Laravel
Univerzalis Entitas Kezeles - LaravelUniverzalis Entitas Kezeles - Laravel
Univerzalis Entitas Kezeles - LaravelPeter Perger
 
Continous Integration and Deployment
Continous Integration and DeploymentContinous Integration and Deployment
Continous Integration and DeploymentKároly Nagy
 
Webalkalmazások teljesítményoptimalizálása
Webalkalmazások teljesítményoptimalizálásaWebalkalmazások teljesítményoptimalizálása
Webalkalmazások teljesítményoptimalizálásaFerenc Kovács
 
PHP alkalmazások minőségbiztosítása
PHP alkalmazások minőségbiztosításaPHP alkalmazások minőségbiztosítása
PHP alkalmazások minőségbiztosításaFerenc Kovács
 
Test for my business
Test for my businessTest for my business
Test for my businesstibormarias
 
Vjzvzr poster
Vjzvzr posterVjzvzr poster
Vjzvzr posterpszaby
 
Az online hirdetéskiszolgálás technológiai kihívásai
Az online hirdetéskiszolgálás technológiai kihívásaiAz online hirdetéskiszolgálás technológiai kihívásai
Az online hirdetéskiszolgálás technológiai kihívásaiAdverticum
 
Dr. Ekler Péter: A mobilszoftver két értéke – legjobb gyakorlatok és újdonság...
Dr. Ekler Péter: A mobilszoftver két értéke – legjobb gyakorlatok és újdonság...Dr. Ekler Péter: A mobilszoftver két értéke – legjobb gyakorlatok és újdonság...
Dr. Ekler Péter: A mobilszoftver két értéke – legjobb gyakorlatok és újdonság...Mobil Weekend
 
GCP - A felhőalapú architektúrák és szolgáltatások
GCP - A felhőalapú architektúrák és szolgáltatásokGCP - A felhőalapú architektúrák és szolgáltatások
GCP - A felhőalapú architektúrák és szolgáltatásokMárton Kodok
 
Fehér Péter - Az üzleti és ICT architektúra kapcsolatáról
Fehér Péter - Az üzleti és ICT architektúra kapcsolatárólFehér Péter - Az üzleti és ICT architektúra kapcsolatáról
Fehér Péter - Az üzleti és ICT architektúra kapcsolatárólMKT Informatikai szakosztály
 
Béla, mi élesedett tulajdonképpen? A request to release koncepció mire is ad ...
Béla, mi élesedett tulajdonképpen? A request to release koncepció mire is ad ...Béla, mi élesedett tulajdonképpen? A request to release koncepció mire is ad ...
Béla, mi élesedett tulajdonképpen? A request to release koncepció mire is ad ...META-INF Kft.
 
III. Elmélet - Az ERP rendszerek implementációja 1..pptx
III. Elmélet - Az ERP rendszerek implementációja 1..pptxIII. Elmélet - Az ERP rendszerek implementációja 1..pptx
III. Elmélet - Az ERP rendszerek implementációja 1..pptxSzabolcs Gulyás
 
Szoftverfejlesztés a repülőgépiparban
Szoftverfejlesztés a repülőgépiparbanSzoftverfejlesztés a repülőgépiparban
Szoftverfejlesztés a repülőgépiparbanÁkos Horváth
 

Similar a Nagyméretű forráskódtárak inkrementális statikus analízise (20)

Enterprise java evolució, avagy java ee (
Enterprise java evolució, avagy java ee (Enterprise java evolució, avagy java ee (
Enterprise java evolució, avagy java ee (
 
Agile, Ésszerűen
Agile, ÉsszerűenAgile, Ésszerűen
Agile, Ésszerűen
 
Szerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelvenSzerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelven
 
Univerzalis Entitas Kezeles - Laravel
Univerzalis Entitas Kezeles - LaravelUniverzalis Entitas Kezeles - Laravel
Univerzalis Entitas Kezeles - Laravel
 
Continous Integration and Deployment
Continous Integration and DeploymentContinous Integration and Deployment
Continous Integration and Deployment
 
Webalkalmazások teljesítményoptimalizálása
Webalkalmazások teljesítményoptimalizálásaWebalkalmazások teljesítményoptimalizálása
Webalkalmazások teljesítményoptimalizálása
 
Forum BPM
Forum BPMForum BPM
Forum BPM
 
PHP alkalmazások minőségbiztosítása
PHP alkalmazások minőségbiztosításaPHP alkalmazások minőségbiztosítása
PHP alkalmazások minőségbiztosítása
 
Test for my business
Test for my businessTest for my business
Test for my business
 
Webkonf 2013
Webkonf 2013Webkonf 2013
Webkonf 2013
 
Szoftver tesztelés
Szoftver tesztelésSzoftver tesztelés
Szoftver tesztelés
 
NETaudIT
NETaudITNETaudIT
NETaudIT
 
Vjzvzr poster
Vjzvzr posterVjzvzr poster
Vjzvzr poster
 
Az online hirdetéskiszolgálás technológiai kihívásai
Az online hirdetéskiszolgálás technológiai kihívásaiAz online hirdetéskiszolgálás technológiai kihívásai
Az online hirdetéskiszolgálás technológiai kihívásai
 
Dr. Ekler Péter: A mobilszoftver két értéke – legjobb gyakorlatok és újdonság...
Dr. Ekler Péter: A mobilszoftver két értéke – legjobb gyakorlatok és újdonság...Dr. Ekler Péter: A mobilszoftver két értéke – legjobb gyakorlatok és újdonság...
Dr. Ekler Péter: A mobilszoftver két értéke – legjobb gyakorlatok és újdonság...
 
GCP - A felhőalapú architektúrák és szolgáltatások
GCP - A felhőalapú architektúrák és szolgáltatásokGCP - A felhőalapú architektúrák és szolgáltatások
GCP - A felhőalapú architektúrák és szolgáltatások
 
Fehér Péter - Az üzleti és ICT architektúra kapcsolatáról
Fehér Péter - Az üzleti és ICT architektúra kapcsolatárólFehér Péter - Az üzleti és ICT architektúra kapcsolatáról
Fehér Péter - Az üzleti és ICT architektúra kapcsolatáról
 
Béla, mi élesedett tulajdonképpen? A request to release koncepció mire is ad ...
Béla, mi élesedett tulajdonképpen? A request to release koncepció mire is ad ...Béla, mi élesedett tulajdonképpen? A request to release koncepció mire is ad ...
Béla, mi élesedett tulajdonképpen? A request to release koncepció mire is ad ...
 
III. Elmélet - Az ERP rendszerek implementációja 1..pptx
III. Elmélet - Az ERP rendszerek implementációja 1..pptxIII. Elmélet - Az ERP rendszerek implementációja 1..pptx
III. Elmélet - Az ERP rendszerek implementációja 1..pptx
 
Szoftverfejlesztés a repülőgépiparban
Szoftverfejlesztés a repülőgépiparbanSzoftverfejlesztés a repülőgépiparban
Szoftverfejlesztés a repülőgépiparban
 

Nagyméretű forráskódtárak inkrementális statikus analízise

  • 1. Nagyméretű forráskódtárak inkrementális statikus analízise konzulensek: Szárnyas Gábor Dr. Ráth István Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék Hibatűrő Rendszerek Kutatócsoport Stein Dániel, BSc
  • 2. Folytonos integráció (FI) Continuous Integration (CI) – Több fejlesztő együttműködése – Integrációs problémák megelőzése – Például – Jenkins – Hudson – Travis CI 2 Verziókezelés Fordítás Fejlesztés Egység- és integrációs teszt
  • 3. Statikus analízis – Nincs szükség a program fordítására és futtatására – Alaki és strukturális jellegű szabályellenőrzést végez – FI mellett vagy részeként alkalmazandó – Kódmintaillesztést használunk 3 Verziókezelés Fordítás Fejlesztés Egység- és integrációs teszt Kódanalízis
  • 4. – A kódanalízis erőforrás- és időigényes folyamat – Lassú, nem alkalmazható FI-szerű ütemezéssel Megoldandó probléma 4 egységteszt kódanalízis ☼ ☆☾☆
  • 5. – A kódanalízis erőforrás- és időigényes folyamat – Lassú, nem alkalmazható FI-szerű ütemezéssel – Átmeneti megoldás: tömbösítés Megoldandó probléma 5 egységteszt kódanalízis ☼ ☆☾☆ egységteszt kódanalízis
  • 6. – A kódanalízis erőforrás- és időigényes folyamat – Lassú, nem alkalmazható FI-szerű ütemezéssel – Átmeneti megoldás: tömbösítés Minél hamarabb, minél gyorsabban eredményt kell adni. Megoldandó probléma 6 egységteszt kódanalízis ☼ ☆☾☆ egységteszt kódanalízis
  • 7. A bemutatott megoldás –Inkrementális elvet alkalmazunk A számított eredményt csak a későbbi változás hatásával frissítjük. –Projekt helyett fájl szintű feldolgozás –Későbbi skálázhatóságot, eloszthatóságot figyelembe véve terveztük 7 kódanalizátor Δ2.-1.1.
  • 8. Architektúra áttekintés 8 Munkaterület Függőségi gráf Absztrakt szintaxis gráf Jólformáltsági szabályok Lekérdezés futtatása Adatbázis Main.java | ++---- Dependency.jar | +++++- FIterator.java | ---- Cparser.java | ++ Automatikus jólformáltsági szabály kiértékelés Kézi futtatás és kiértékelés Automatikus többszörözés és elosztás . jamoppdiscoverer ChangeProcessor.java CommandParser.java FileIterator.java iterators DepCollector.java FileDiscoverer.java InitIterator.java Main.java whitepages ConnectionMgr.java DependencyMgr.java pojo Dependency.jar .jar .java Kiértékelési jelentés <!> <?> <.> JaMoPP Verzió- kezelő
  • 9. Architektúra áttekintés 9 Munkaterület Függőségi gráf Absztrakt szintaxis gráf Jólformáltsági szabályok Lekérdezés futtatása Adatbázis Main.java | ++---- Dependency.jar | +++++- FIterator.java | ---- Cparser.java | ++ Automatikus jólformáltsági szabály kiértékelés Kézi futtatás és kiértékelés Automatikus többszörözés és elosztás . jamoppdiscoverer ChangeProcessor.java CommandParser.java FileIterator.java iterators DepCollector.java FileDiscoverer.java InitIterator.java Main.java whitepages ConnectionMgr.java DependencyMgr.java pojo Dependency.jar .jar .java Kiértékelési jelentés <!> <?> <.> JaMoPP Verzió- kezelő
  • 10. Architektúra áttekintés 10 Munkaterület Függőségi gráf Absztrakt szintaxis gráf Jólformáltsági szabályok Lekérdezés futtatása Adatbázis Main.java | ++---- Dependency.jar | +++++- FIterator.java | ---- Cparser.java | ++ Automatikus jólformáltsági szabály kiértékelés Kézi futtatás és kiértékelés Automatikus többszörözés és elosztás . jamoppdiscoverer ChangeProcessor.java CommandParser.java FileIterator.java iterators DepCollector.java FileDiscoverer.java InitIterator.java Main.java whitepages ConnectionMgr.java DependencyMgr.java pojo Dependency.jar .jar .java Kiértékelési jelentés <!> <?> <.> JaMoPP Verzió- kezelő
  • 11. Architektúra áttekintés 11 Munkaterület Függőségi gráf Absztrakt szintaxis gráf Jólformáltsági szabályok Lekérdezés futtatása Adatbázis Main.java | ++---- Dependency.jar | +++++- FIterator.java | ---- Cparser.java | ++ Automatikus jólformáltsági szabály kiértékelés Kézi futtatás és kiértékelés Automatikus többszörözés és elosztás . jamoppdiscoverer ChangeProcessor.java CommandParser.java FileIterator.java iterators DepCollector.java FileDiscoverer.java InitIterator.java Main.java whitepages ConnectionMgr.java DependencyMgr.java pojo Dependency.jar .jar .java Kiértékelési jelentés <!> <?> <.> JaMoPP Verzió- kezelő
  • 12. Munkaterület Main.java | ++---- Dependency.jar | +++++- FIterator.java | ---- Cparser.java | ++ . jamoppdiscoverer ChangeProcessor.java CommandParser.java FileIterator.java iterators DepCollector.java FileDiscoverer.java InitIterator.java Main.java whitepages ConnectionMgr.java DependencyMgr.java pojo Dependency.jar Verzió- kezelő Architektúra verziókövetés –Verziókezelőre épül – Követi a fájlok változását, illetve az elágazó fejlesztési ágakat – Lekérdezhető a fájlok pillanatnyi állapota és a verziók közötti módosítások listája –Munkaterület-központú – Projekt forrása – Függőségek forrása (amennyiben elérhető) 12
  • 13. Függőségi gráf Absztrakt szintaxis gráf .jar .java JaMoPP Architektúra átalakítás –Függőségi gráf – Segédkomponens a későbbi feldolgozáshoz – A gráf élei a Java függőségeknek megfeleltethetők –Absztrakt szintaxis gráf – A projektet modellé, majd azt gráffá alakítjuk 13
  • 14. Függőségi gráf Absztrakt szintaxis gráf .jar .java JaMoPP Architektúra átalakítás –Függőségi gráf – Segédkomponens a későbbi feldolgozáshoz – A gráf élei a Java függőségeknek megfeleltethetők –Absztrakt szintaxis gráf – A projektet modellé, majd azt gráffá alakítjuk 14  Minden fájlra leírók gyűjtése és tárolása: package, szükséges fordítási egységek, stb.  Minden további alrendszer számára elérhető információval szolgál
  • 15. Függőségi gráf Absztrakt szintaxis gráf .jar .java JaMoPP Architektúra átalakítás –Függőségi gráf – Segédkomponens a későbbi feldolgozáshoz – A gráf élei a Java függőségeknek megfeleltethetők –Absztrakt szintaxis gráf – A projektet modellé, majd azt gráffá alakítjuk 15
  • 16. Függőségi gráf Absztrakt szintaxis gráf .jar .java JaMoPP Architektúra átalakítás –Függőségi gráf – Segédkomponens a későbbi feldolgozáshoz – A gráf élei a Java függőségeknek megfeleltethetők –Absztrakt szintaxis gráf – A projektet modellé, majd azt gráffá alakítjuk 16  A forráskód struktúrájának gráf reprezentációja  Nem tartalmaz minden információt  Részgráfokból állítjuk elő a teljes gráfot
  • 17. Jólformáltsági szabályok Lekérdezés futtatása Adatbázis Automatikus jólformáltsági szabály kiértékelés Kézi futtatás és kiértékelés Automatikus többszörözés és elosztás Kiértékelési jelentés <!> <?> <.> Architektúra modellfeldolgozás Felhasználói ki- és bemenet 17 Felhasználói bemenet kiértékelése és kimenet előállítása Adattárolás és lekérdezés- végrehajtás
  • 18. Jólformáltsági szabályok Lekérdezés futtatása Adatbázis Automatikus jólformáltsági szabály kiértékelés Kézi futtatás és kiértékelés Automatikus többszörözés és elosztás Kiértékelési jelentés <!> <?> <.> Architektúra modellfeldolgozás Felhasználói ki- és bemenet 18 Felhasználói bemenet kiértékelése és kimenet előállítása Adattárolás és lekérdezés- végrehajtás  Gráfadatbázis  Technológiai választásunk: 4store  Elasztikusan skálázódik
  • 19. Jólformáltsági szabályok Lekérdezés futtatása Adatbázis Automatikus jólformáltsági szabály kiértékelés Kézi futtatás és kiértékelés Automatikus többszörözés és elosztás Kiértékelési jelentés <!> <?> <.> Architektúra modellfeldolgozás Felhasználói ki- és bemenet 19 Felhasználói bemenet kiértékelése és kimenet előállítása Adattárolás és lekérdezés- végrehajtás
  • 20. Jólformáltsági szabályok Lekérdezés futtatása Adatbázis Automatikus jólformáltsági szabály kiértékelés Kézi futtatás és kiértékelés Automatikus többszörözés és elosztás Kiértékelési jelentés <!> <?> <.> Architektúra modellfeldolgozás Felhasználói ki- és bemenet 20 Felhasználói bemenet kiértékelése és kimenet előállítása Adattárolás és lekérdezés- végrehajtás  Gráfmintaként (SPARQL nyelven) megfogalmazott kódminták  Lekérdezések végrehajtása (akár inkrementálisan)  Jelentés előállítása (vagy frissítése)
  • 21. Jólformáltsági szabályok Lekérdezés futtatása Adatbázis Automatikus jólformáltsági szabály kiértékelés Kézi futtatás és kiértékelés Automatikus többszörözés és elosztás Kiértékelési jelentés <!> <?> <.> Architektúra modellfeldolgozás Felhasználói ki- és bemenet 21 Felhasználói bemenet kiértékelése és kimenet előállítása Adattárolás és lekérdezés- végrehajtás  Gráfmintaként (SPARQL nyelven) megfogalmazott kódminták  Lekérdezések végrehajtása (akár inkrementálisan)  Jelentés előállítása (vagy frissítése)  ASG-n értelmezett minta  Informális specifikáció
  • 22. Jólformáltsági szabályok Lekérdezés futtatása Adatbázis Automatikus jólformáltsági szabály kiértékelés Kézi futtatás és kiértékelés Automatikus többszörözés és elosztás Kiértékelési jelentés <!> <?> <.> Architektúra modellfeldolgozás Felhasználói ki- és bemenet 22 Felhasználói bemenet kiértékelése és kimenet előállítása Adattárolás és lekérdezés- végrehajtás  Gráfmintaként (SPARQL nyelven) megfogalmazott kódminták  Lekérdezések végrehajtása (akár inkrementálisan)  Jelentés előállítása (vagy frissítése)
  • 23. Jólformáltsági szabályok Lekérdezés futtatása Adatbázis Automatikus jólformáltsági szabály kiértékelés Kézi futtatás és kiértékelés Automatikus többszörözés és elosztás Kiértékelési jelentés <!> <?> <.> Architektúra modellfeldolgozás Felhasználói ki- és bemenet 23 Felhasználói bemenet kiértékelése és kimenet előállítása Adattárolás és lekérdezés- végrehajtás  Visszajelzés a felhasználónak  Felsorolja a szabályokat megszegő kódrészleteket  Gráfmintaként (SPARQL nyelven) megfogalmazott kódminták  Lekérdezések végrehajtása (akár inkrementálisan)  Jelentés előállítása (vagy frissítése)
  • 24. Jólformáltsági szabályok Lekérdezés futtatása Adatbázis Automatikus jólformáltsági szabály kiértékelés Kézi futtatás és kiértékelés Automatikus többszörözés és elosztás Kiértékelési jelentés <!> <?> <.> Architektúra modellfeldolgozás Felhasználói ki- és bemenet 24 Felhasználói bemenet kiértékelése és kimenet előállítása Adattárolás és lekérdezés- végrehajtás  Gráfmintaként (SPARQL nyelven) megfogalmazott kódminták  Lekérdezések végrehajtása (akár inkrementálisan)  Jelentés előállítása (vagy frissítése)
  • 25. Példa forráskód public static String toMonth(int month) { switch (month) { case 1: return "January"; case 2: return "February"; case 3: return "March"; case 4: return "April"; case 5: return "May"; case 6: return "June"; case 7: return "July"; case 8: return "August"; case 9: return "September"; case 10: return "October"; case 11: return "November"; case 12: return "December"; default: return "Invalid month"; } } 25Bemeneti forráskód (részlet) Kódmodell (részlet)
  • 26. Példa forráskód public static String toMonth(int month) { switch (month) { case 1: return "January"; case 2: return "February"; case 3: return "March"; case 4: return "April"; case 5: return "May"; case 6: return "June"; case 7: return "July"; case 8: return "August"; case 9: return "September"; case 10: return "October"; case 11: return "November"; case 12: return "December"; default: return "Invalid month"; } } 26Bemeneti forráskód (részlet) Kódmodell (részlet)
  • 27. Példa forráskód public static String toMonth(int month) { switch (month) { case 1: return "January"; case 2: return "February"; case 3: return "March"; case 4: return "April"; case 5: return "May"; case 6: return "June"; case 7: return "July"; case 8: return "August"; case 9: return "September"; case 10: return "October"; case 11: return "November"; case 12: return "December"; default: return "Invalid month"; } } 27Bemeneti forráskód (részlet) Kódmodell (részlet)
  • 28. Példa forráskód public static String toMonth(int month) { switch (month) { case 1: return "January"; case 2: return "February"; case 3: return "March"; case 4: return "April"; case 5: return "May"; case 6: return "June"; case 7: return "July"; case 8: return "August"; case 9: return "September"; case 10: return "October"; case 11: return "November"; case 12: return "December"; default: return "Invalid month"; } } 28Bemeneti forráskód (részlet) Kódmodell (részlet)
  • 29. Példa forráskód public static String toMonth(int month) { switch (month) { case 1: return "January"; case 2: return "February"; case 3: return "March"; case 4: return "April"; case 5: return "May"; case 6: return "June"; case 7: return "July"; case 8: return "August"; case 9: return "September"; case 10: return "October"; case 11: return "November"; case 12: return "December"; default: return "Invalid month"; } } 29Bemeneti forráskód (részlet) Kódmodell (részlet)
  • 30. switch :Switch ... january :NormalSwitchCase december :NormalSwitchCase #//Switch/cases #//Switch/variable month :IdentifierReference Példa gráfminta 30 sw: Switch sc: DefaultSwitchCase cases Default ág nélküli switch- eket kereső gráfminta Absztrakt szintaxis gráf (részlet) Gráfminta-illeszkedési találatok:
  • 31. switch :Switch ... january :NormalSwitchCase december :NormalSwitchCase #//Switch/cases #//Switch/variable month :IdentifierReference Példa gráfminta 31 sw: Switch sc: DefaultSwitchCase cases Default ág nélküli switch- eket kereső gráfminta Absztrakt szintaxis gráf (részlet) Gráfminta-illeszkedési találatok: switch :Switch
  • 32. switch :Switch ... january :NormalSwitchCase december :NormalSwitchCase default :DefaultSwitchCase #//Switch/cases #//Switch/variable month :IdentifierReference Példa gráfminta 32 sw: Switch sc: DefaultSwitchCase cases Default ág nélküli switch- eket kereső gráfminta Absztrakt szintaxis gráf (részlet) Gráfminta-illeszkedési találatok: switch :Switch
  • 33. switch :Switch ... january :NormalSwitchCase december :NormalSwitchCase default :DefaultSwitchCase #//Switch/cases #//Switch/variable month :IdentifierReference Példa gráfminta 33 sw: Switch sc: DefaultSwitchCase cases Default ág nélküli switch- eket kereső gráfminta Absztrakt szintaxis gráf (részlet) Gráfminta-illeszkedési találatok:
  • 34. Mérési kiértékelés –Kiértékelő teljesítménymérés – Az egyes fázisok egymáshoz viszonyított futási idejét vizsgáljuk – Különböző méretű, nyílt forráskódú projekteken végezzük el az analízist – Alap (teljes projekt) és módosítás inkrementális feldolgozását mérjük –Mérési környezet: publikus felhő, elosztott adatbázissal 34 Forrás projekt Kódsorok száma Fájlok száma Physhun 4 227 53 Java DjVu 41 497 69 Xalan 338 316 907
  • 35. 92.18 425.79 2 378.25 1 10 100 1000 Physhun 4 227 / 35 Java DjVu 41 497 / 69 Xalan 338 316 / 907 Teljesfeldolgozásiidő[s] (FG,ASG,mentés,lekérdezés) Projektek forrás sorok száma / fájlok száma Mérési eredmények 35
  • 36. 92.18 425.79 2 378.25 1 10 100 1000 Physhun 4 227 / 35 Java DjVu 41 497 / 69 Xalan 338 316 / 907 Teljesfeldolgozásiidő[s] (FG,ASG,mentés,lekérdezés) Projektek forrás sorok száma / fájlok száma Mérési eredmények 36
  • 37. 1 555 345 951 27 535 213 966 23 354 27 870 201 100 1000 10000 100000 1000000 10000000 Függőségi gráf építése Absztrakt szintaxisgráf összeállítása Modell tárolása Lekérdezések futtatása Fázisfutásiideje[ms] Első, teljes futtatás Módosítás inkrementális feldolgozása Nagyságrendi különbség Mérési eredmények inkrementális 37
  • 38. 1 555 345 951 27 535 213 966 23 354 27 870 201 100 1000 10000 100000 1000000 10000000 Függőségi gráf építése Absztrakt szintaxisgráf összeállítása Modell tárolása Lekérdezések futtatása Fázisfutásiideje[ms] Első, teljes futtatás Módosítás inkrementális feldolgozása Nagyságrendi különbség Mérési eredmények inkrementális 38 -85%
  • 39. 4.09 8.42 4.35 2.14 28.36 52.19 375.04 1 10 100 1000 FindBugs PMD Checkstyle Columbus inkr. ISAaC ISAaC Teljes futási idő [s] Fordítás Analízis Mérési eredmények összehasonlítva 39
  • 40. Összefoglalás – Szabványos formátumok és cserélhető komponensek – Java forráskód átalakítása RDF gráffá, akár elosztott megközelítéssel – Az elkészített gráf inkrementális frissítése is megoldott – Moduláris, bővíthető és skálázható inkrementális statikus analízis keretrendszert készítettem – Java forrást RDF gráffá alakító segédeszközt implementáltam – Benchmark funkciókkal bővítettem a keretrendszert és méréseket végeztem 40 Újszerű megközelítés az inkrementális statikus analízishez:
  • 41. Továbbfejlesztési lehetőségek – Inkrementális analízis INCQUERY-D használatával – Feldolgozás granularitásának javítása minden fázisban – Keretrendszer elosztottá tétele 41 Átalakítás és perzisztálás Munkaterület beállítása Függőségek felderítése Lekérdezések futtatása Szerver 1 Szerver 2 Szerver 3 Szerver 4 Szerver 1 Szerver 2 Szerver 3 Szerver 4 Szerver 1 Szerver 2 Szerver 3 Szerver 4 Sz. 1 Sz. 2 Sz. 3 Sz. 4 Á P Á P Á P Á P L1 L2 L3 L4 L5 L6
  • 42. Összefoglalás – Szabványos formátumok és cserélhető komponensek – Java forráskód átalakítása RDF gráffá, akár elosztott megközelítéssel – Az elkészített gráf inkrementális frissítése is megoldott A dolgozat eredményei a MONDO EU-FP7 kutatási projekthez kapcsolódnak, annak egyik demonstrátorát képezik. 42 Újszerű megközelítés az inkrementális statikus analízishez:
  • 43. Bírálói kérdések A dolgozat említi, hogy a JaMoPP Java 5 támogatása az újabb verziójú Java kódok elemzését nem teszi lehetővé. Van lehetőség ennek a komponensnek a lecserélésére? Milyen alternatív megoldásokat vizsgált meg? – Réteges az architektúra, a komponens cserélhető, de jobb jelölt nincs jelenleg nincs. – A metamodell bővíthető, de sok munka lenne. Az újabb verziójú kódot is feldolgozza, de nem hibamentesen. – Alternatívák: – MoDisco (projekt szintű feldolgozás, de átalakítható) – Columbus (zárt forráskódú, viszont JaMoPP-hoz jobban hasonlít) 43
  • 44. Többször említésre kerül az adatbázis alapú tárolás által lehetővé tett elosztott ellenőrzés lehetősége. Milyen tényezőket érdemes egy ilyen megoldásnak a teljesítménybeli és pénzügyi hatékonyságágának megtervezéséhez figyelembe venni? – Használt tárterület – A forráskód XMI modellje ~2-5×. – Az RDF sorosítás ~4-10×. – Az adatbázis viszont tömörítheti a sokszor ismétlődő szövegrészleteket (pl. URI, attribútum). – Elérési sebesség – Több adatbázis szerver gyorsíthatja az olvasást, keresést (de ez nem lassú). – Az írási és szinkronizációs sebesség viszont csökkenhet. Bírálói kérdések 44
  • 45. Bírálói kérdések A már létező ellenőrző eszközökhöz nagy számú szabály áll rendelkezésre. Milyen csoportokra lehetne osztani ezeket a szabályokat az esetleges migráció megtervezésekor technológia és bonyolultság szerint? Esetleg minden szabály átírása egyértelmű? Mekkora feladatot jelentene pl. a PMD-hez rendelkezésre álló szabályok átírása? – A mintaalapú megközelítés (PMD) könnyebben átírható. A metamodellek különbsége miatt kézzel kell feldolgozni, de JDT AST-szerű mindkét metamodell. – Az IncQuery-D használatával bonyolultabb lekérdezések (pl. count) megvalósítható, nem csak mintaillesztés. – Csoportra példa: sorrend alapú minta (nem az utolsó case a default), ami RDF esetén nehezebben megoldható. 45
  • 46. Bírálói kérdések A forráskódban fellelhető hibákon kívül nagy projekteknél komoly problémát jelent, ha egy adott library-nek több verziója is jelen van futás közben. Ezt a build rendszerek, pl. Maven, Gradle, explicit kizárásokkal, felülírásokkal és további “trükkökkel” próbálják orvosolni. Volna lehetőség ilyen jellegű problémák kimutatására a keretrendszer kiterjesztésével? Milyen módon lehetne ezt implementálni? – A keretrendszer nem pont erre lett kialakítva, a classpath kezdetleges. – Library függésével, függőségi és hatásanalízissel Csikós Donát foglalkozott, az ő munkáját lehetne követni. – Több library kezelése megoldható a keretrendszer paraméterezésével és a projektek verziókezelt mentésével. Ehhez átdolgozott mentési stratégia szükséges. 46
  • 47. Bírálói kérdések Hogyan hasonlítható össze a készített ISAaC rendszer egy olyan rendszerrel hatékonyság szempontjából, amely egy meglévő statikus kódanalizátort futtat a megváltozott fájlokon (és ezek függőségi lezártján)? – FindBugs és PMD analizátorok integrálása a benchmark rendszerbe – Találatok ellenőrzése – Vagy nem használjuk fel a változások listáját (teljes futtatás) – Vagy a modosítás függőségi lezártján futtatjuk az ellenőrzést – Befolyásolhatja a mérés hűségét, hogy a lezárt alatt ugyanazt érti-e a másik szoftver fejlesztője, mint a mi megoldásunkban 47
  • 48. Bírálói kérdések Jelenlegi granularitás a fájl, mint egység, ami jóval nagyobb lehet, mint a "changeset". Mi a praktikusan elérhető legkisebb granularitás? – JaMoPP esetén a feldolgozás fájlonként történik, ennél kisebb egység nem vizsgálható. – Azonban hatásanalízis használatával a szükséges feldolgozandó fájlok száma csökkenthető. – Modellösszehasonlító használatával AST node szintig levihető a granularitás. 48
  • 49. Bírálói kérdések Kb. mennyi, az inkrementális mivoltából fakadó extra tárhelyet használ a rendszer a példában szereplő projektek esetén? – Az inkrementális feldolgozáshoz csak a módosítás előtti szerializált részgráfot tároljuk el. – Egy fájlhoz tehát legfeljebb a gráf formátumban tárolt modell méretének kétszerese szükséges. – A szövegesen tárolt gráf tömöríthető. 49
  • 50. Bírálói kérdések Mi szükséges a Java mellett más nyelvek támogatásához? – A JaMoPP-hoz hasonló parser, ami képes a Java forrásból programmatikusan feldolgozható példánymodellt készíteni. – Szükséges, hogy a fájlok közti hivatkozás részenként sorosítható legyen, egyértelmű, hierarchikus azonosítókkal. projects://ISAaC/src/Teszt.java#//@statements.0/@... 50
  • 51. 1.49 1.95 11.42 81.8 395.6 2 110.8 8.73 28.01 255.79 1 10 100 1000 Physhun 4 227 Java DjVu 41 497 Xalan 338 316 Szükségesidő[s] Függőségi gráf építése Absztrakt szintaxisgráf összeállítása Modell tárolása Mérési eredmények 51
  • 52. 1.49 1.95 11.42 81.79 395.61 2 110.82 8.73 28.01 255.79 0 500 1000 1500 2000 2500 Physhun 4 227 Java DjVu 41 497 Xalan 338 316 Time[s] Persisting the ASG Transforming the Code into an ASG Building the Dependency Graph Mérési eredmények 52