A RefactorErl Projekt Erlang programok statikus elemzése és refaktorálása Tóth Melinda KMOP-1.1.2-08/1-2008-0002 pályázat A kutatás-fejlesztési központok fejlesztése és megerősítése 2012. június 19., Budapest Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 1 / 9
Az alprojekt célkitűzései Szoftverek karbantartásának és átalakításának támogatása Refaktorálás Forráskód egységesítés Tulajdonság alapú tesztelés Kódmegértés támogatás Alkalmazás-specifikus nyelv fejlesztés Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 2 / 9
Erlang Ericsson által fejlesztett Telekommunikációs szoftverek írásának megkönnyítése Széleskörű ipari használat Sok millió soros szoftverek Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 3 / 9
RefactorErl mérföldkövek 2006 - Feladat az Ericssonból 2007, Augusztus - Első kiadás 2008, Augusztus - 15 refaktorálás az újratervezett rendszerben 2009, Október - Lekérdezések Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 4 / 9
RefactorErl Statikus forráskód elemző és transzformáló eszköz Ipari kódok elemzésére tervezve Perzisztens adattárolás Inkrementális elemzés Hatékony adatelérés Biztonságos transzformálás Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 5 / 9
3-rétegű gráf modell 1 Lexikális réteg Tokenek Preprocesszálás Comment, whitespace 2 Szintaktikus réteg Absztrakt Szintaxis-Fa File 3 Szemantikus réteg Modul, függvény, rekord, változó, környezet elemzés Adatfolyam, mellékhatás Aszinkron elemző infrastruktúra Utóelemzések: dinamikus függvényhívás elemzés, folyamatelemzés, ets elemzés Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 6 / 9
-module(my). -define(eol(x), X ++ "\n"). f(s) -> io:put chars(?eol(s)). my.erl function put chars my modq var atom atom f io app S ++ var string S ++ "\n" f ( S ) -> io : put chars (? EOL ( S ) ). Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 7 / 9
-module(my). -define(eol(x), X ++ "\n"). f(s) -> io:put chars(?eol(s)). my.erl function put chars my modq var atom atom f io app S ++ var string S ++ "\n" f ( S ) -> io : put chars (? EOL ( S ) ). Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 7 / 9
-module(my). -define(eol(x), X ++ "\n"). f(s) -> io:put chars(?eol(s)). my.erl function put chars my modq var atom atom f io app S ++ var string S ++ "\n" f ( S ) -> io : put chars (? EOL ( S ) ). Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 7 / 9
-module(my). -define(eol(x), X ++ "\n"). f(s) -> io:put chars(?eol(s)). my.erl function put chars my modq var atom atom f io app S ++ var string S ++ "\n" f ( S ) -> io : put chars (? EOL ( S ) ). Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 7 / 9
-module(my). -define(eol(x), X ++ "\n"). f(s) -> io:put chars(?eol(s)). my.erl function put chars my modq var atom atom f io app S ++ var string S ++ "\n" f ( S ) -> io : put chars (? EOL ( S ) ). Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 7 / 9
-module(my). -define(eol(x), X ++ "\n"). f(s) -> io:put chars(?eol(s)). my.erl function put chars my modq var atom atom f io app S ++ var string S ++ "\n" f ( S ) -> io : put chars (? EOL ( S ) ). Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 7 / 9
-module(my). -define(eol(x), X ++ "\n"). f(s) -> io:put chars(?eol(s)). my.erl function put chars my modq var atom atom f io app S ++ var string S ++ "\n" f ( S ) -> io : put chars (? EOL ( S ) ). Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 7 / 9
Gráf tárolás és kezelés A csúcsok és élek Mnesia táblákban vannak tárolva* Csúcs attribútumok: token szöveg, változó név,... Élcímkék: sub, funref, varref,... Gráf bejárás: szűrt élcímke sorozat Az élek indexeltek Nem ugrik meg a lekérdezések költsége A gyakran használt lekérdezések fix hosszúak Szintaxis alapú transzformációk, automatikus token kezelés Inkrementális, automatizált szemantikus elemzések Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 8 / 9
Alternatív tárolási módok NIF Gráf: C++ Kyoto Cabinet: C Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 9 / 9
Refaktorálás A forráskód szerkezetének átalakítása Viselkedés/jelentés megőrzése RefactorErl eredményessége Szintaktikus átalakítás Szemantikus és lexikális struktúra automatikusan áll helyre 25 megvalósított transzformáció Metrika vezérelt átalakítások Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 10 / 9
Implementált transzformációk Rename variable function record, record field macro module/header file Function interface introduce function argument reorder parameters introduce tuple eliminate/introduce import Move definition macro record function Expression structure eliminate/introduce variable eliminate/introduce function eliminate macro application eliminate fun-expression Data structure Introduce record Upgrade module interface Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 11 / 9
Tulajdonság alapú tesztelés A transzformációk helyességének ellenőrzése QuickCheck/PropEr tulajdonság alapú tesztelővel A refaktorálások tulajdonságai formalizáltak Viselkedés megőrzés ellenőrzése Véletlenszerűen generált transzformációs paraméterek Véletlenszerűen generált programokon Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 12 / 9
Kódmegértés támogatása Szemantikus információ elérhetővé tétele Lekérdező nyelv Függőségi elemzések és vizualizáció Metrikák Klaszterezés Kód böngészés beépített lekérdezésekkel Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 13 / 9
Lekérdező nyelv Az Erlang nyelv jellemzőire és szemantikus fogalmaira épül Entitás + szelektor + tulajdonság mods.funs.refs mods[name=alma].funs.refs Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 14 / 9
Syntax of semantic queries semantic_query ::= initial_selection [. query_sequence] initial_selection ::= initial_selector [ [ filter ] ] query_sequence ::= query [. query_sequence] query ::= selection iteration closure property_query selection ::= selector [ [ filter ] ] iteration ::= { query_sequence } int [ [ filter ] ] closure ::= ( query_sequence ) int [ [ filter ] ] ( query_sequence )+ [ [ filter ] ] property_query ::= property [ [ filter ] ] Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 15 / 9
Syntax of semantic queries semantic_query ::= initial_selection [. query_sequence] initial_selection ::= initial_selector [ [ filter ] ] query_sequence ::= query [. query_sequence] query ::= selection iteration closure property_query selection ::= selector [ [ filter ] ] iteration ::= { query_sequence } int [ [ filter ] ] closure ::= ( query_sequence ) int [ [ filter ] ] ( query_sequence )+ [ [ filter ] ] property_query ::= property [ [ filter ] ] Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 15 / 9
Syntax of semantic queries semantic_query ::= initial_selection [. query_sequence] initial_selection ::= initial_selector [ [ filter ] ] query_sequence ::= query [. query_sequence] query ::= selection iteration closure property_query selection ::= selector [ [ filter ] ] iteration ::= { query_sequence } int [ [ filter ] ] closure ::= ( query_sequence ) int [ [ filter ] ] ( query_sequence )+ [ [ filter ] ] property_query ::= property [ [ filter ] ] Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 15 / 9
Szemantikus lekérdezések Value of a variable @expr.origin Call chain @fun.(called by)+ @fun.(calls)+ Side effect @fun.dirty Dynamic function calls @fun.refs @fun.dyncall @fun.dyncalled by @expr.dynfuns Sent messages mods.funs.exprs [.sub[index==1 and value==upd] and type==send expr] Received messages mods.funs. exprs[type==receive expr].sub[.sub[index==1 and value==upd] and type == tuple] Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 16 / 9
Szemantikus lekérdezések Value of a variable @expr.origin Call chain @fun.(called by)+ @fun.(calls)+ Side effect @fun.dirty Dynamic function calls @fun.refs @fun.dyncall @fun.dyncalled by @expr.dynfuns Sent messages mods.funs.exprs [.sub[index==1 and value==upd] and type==send expr] Received messages mods.funs. exprs[type==receive expr].sub[.sub[index==1 and value==upd] and type == tuple] Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 16 / 9
Szemantikus lekérdezések Value of a variable @expr.origin Call chain @fun.(called by)+ @fun.(calls)+ Side effect @fun.dirty Dynamic function calls @fun.refs @fun.dyncall @fun.dyncalled by @expr.dynfuns Sent messages mods.funs.exprs [.sub[index==1 and value==upd] and type==send expr] Received messages mods.funs. exprs[type==receive expr].sub[.sub[index==1 and value==upd] and type == tuple] Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 16 / 9
Szemantikus lekérdezések Value of a variable @expr.origin Call chain @fun.(called by)+ @fun.(calls)+ Side effect @fun.dirty Dynamic function calls @fun.refs @fun.dyncall @fun.dyncalled by @expr.dynfuns Sent messages mods.funs.exprs [.sub[index==1 and value==upd] and type==send expr] Received messages mods.funs. exprs[type==receive expr].sub[.sub[index==1 and value==upd] and type == tuple] Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 16 / 9
Szemantikus lekérdezések Value of a variable @expr.origin Call chain @fun.(called by)+ @fun.(calls)+ Side effect @fun.dirty Dynamic function calls @fun.refs @fun.dyncall @fun.dyncalled by @expr.dynfuns Sent messages mods.funs.exprs [.sub[index==1 and value==upd] and type==send expr] Received messages mods.funs. exprs[type==receive expr].sub[.sub[index==1 and value==upd] and type == tuple] Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 16 / 9
Szemantikus lekérdezések Value of a variable @expr.origin Call chain @fun.(called by)+ @fun.(calls)+ Side effect @fun.dirty Dynamic function calls @fun.refs @fun.dyncall @fun.dyncalled by @expr.dynfuns Sent messages mods.funs.exprs [.sub[index==1 and value==upd] and type==send expr] Received messages mods.funs. exprs[type==receive expr].sub[.sub[index==1 and value==upd] and type == tuple] Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 16 / 9
Függőségi elemzés Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 17 / 9
A szoftver Fejlesztő környezetbe építve: Emacs, Vi, Eclipse Interaktív és szkriptelhető Erlang shell interfész Parancssoros használat Webes felület Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 18 / 9
Webes Felület Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 19 / 9
Eredmények Megjelent cikkek, előadások, poszterek: 9 + 14 + 11 Szakdolgozat/Diplomamunka: 14 5 TDK dolgozat: egy 2. díj, egy 3. díj az OTDK-n 2011-ben, 2 dolgozat bemutatása 2013-ban Bevont hallgatók száma: 10-20/szemeszter Oktatási hasznosítás: Szoftvertechnológia laborok, Erlang Szoftver: RefactorErl Tóth Melinda (ELTE IK.) Statikus elemzés 2012. június 19., Budapest 20 / 9