Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba Témavezető: Horváth Zoltán és Simon Thompson OTDK 2007, Miskolc Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 1 / 19
Paraméterek összevonása tuple-ba Egy kétmodulos példa (swap függvény paramétereinek összevonása) Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 2 / 19
Erlang Az Erlang nyelv Az Ericsson által kifejlesztett és jelenleg is nagy telekommunikációs szoftverrendszerek fejlesztésére használt funkcionális programozási nyelv. A változók csak egyszer kapnak értéket életük során Nincs statikus típusrendszere, a változók bármilyen típusú értéket kaphatnak Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 3 / 19
Erlang Az Erlang nyelv Egy új kiértékelő szál (processz) indítása nem igényel sokkal több erőforrást, mint egy függvényhívás A függvénynevek atomok, amelyek akár futási időben is generálhatók (kaphatnak értéket) Dinamikusan létrehozott kódrészletek is futtathatók (lecserélhető modulok futás közben) Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 4 / 19
Refaktorálás Refaktorálás definíciója, felhasználási területei A refaktorálás olyan program-transzformációk gyűjtőneve, amelyek nem változtatják meg a program viselkedését. A refaktorálás célja: a kód átszerkesztése, minőségének javítása, optimalizálása Felhasználási területei: széleskörű, mindennapos programozói feladatok (átnevezések, kód újrafelhasználás, kódolási konvenciókhoz igazítás) Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 5 / 19
Refaktorálás Refaktoráló eszköz Miért lényeges egy eszköz használata? Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 6 / 19
Refaktorálás Refaktoráló eszköz Miért lényeges egy eszköz használata? Kézzel lassú és fárasztó a végrehajtás, ráadásul rengeteg a hibalehetőség Géppel gyors és biztonságos Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 6 / 19
Refaktorálás Refaktoráló eszköz Miért lényeges egy eszköz használata? Kézzel lassú és fárasztó a végrehajtás, ráadásul rengeteg a hibalehetőség Géppel gyors és biztonságos Az objektumorientált nyelvekben már régóta használnak refaktor eszközöket (pl. Java és C++) Funkcionális programokhoz eddig csak a HaRe (Haskell) állt rendelkezésre. Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 6 / 19
Refaktorálás Refaktor lépések Erlangban Átnevezések: függvény, változó, modul Függvényparaméterek átrendezése, csoportosítása (tuple-be vonása), egy változó kiemelése paraméterbe Függvények általánosítása, összevonása, specializációja Azonos részkifejezések kiemelése változóba, függvénybe Adatszerkezetek módosítása Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 7 / 19
Refaktorálás Refaktor lépések Erlangban Átnevezések: függvény, változó, modul Függvényparaméterek átrendezése, csoportosítása (tuple-be vonása), egy változó kiemelése paraméterbe Függvények általánosítása, összevonása, specializációja Azonos részkifejezések kiemelése változóba, függvénybe Adatszerkezetek módosítása A nyelv sajátosságai miatt a statikusan típusos és az objektumorientált nyelvektől is lényegesen eltérő, új elemzési módszerek szükségesek. Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 7 / 19
Programszöveg és szintaxisfa A kód és a megfelelő szintaxisfa az azonosítókkal Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 8 / 19
Programszöveg és szintaxisfa A kód és a megfelelő szintaxisfa az azonosítókkal Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 8 / 19
Szintaktikus információk A szintaktikus információk tárolása az adatbázisban Az absztrakt szintaxisfa (AST) szinte minden lehetséges szintaktikus kategóriájához létrehoztunk egy-egy táblát. A fa minden eleméhez rendelünk egy egyedi azonosító. Minden modul is kap egy egyedi modul-azonosítót. A táblák sorai tartalmazzák az adott egyed azonosítóit és gyerekeinek azonosítóit. A pozíciók, szintaktikus kategóriák és nevek tárolására bevezettünk egy-egy külön táblát a keresések sebességének növelésére. Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 9 / 19
Szemantikus információk A szemantikus információk tárolása az adatbázisban Azonos egyedhez tartozó előfordulások tárolása: egy-egy tábla tartalmazza a változók és függvények előfordulásait. A hatókör-tábla tárolja azt a legbelső hatókört, amiben az adott elem van. Egy külön tábla tárolja a hatókörök hierarchiáját. Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 10 / 19
Paraméterek összevonása tuple-ba A refaktor lépés definíciója, paraméterei A refaktor-lépés a felhasználó által mutatott függvényparamétertől kezdve a megadott számú paramétert összevonja egy tuple-ba. A lépés nem csak a konkrét függvény előfordulást érinti, hanem az összes hívását és definícióját is esetleg több modult módosítva. Ha a tuple választott hossza nagyobb 1-nél, akkor a függvény paraméterszáma is megváltozik. Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 11 / 19
Elöfeltételek A lépés előfeltételei Az megadott pozíción a függvény formális paramétere legyen Nem lehet függvénykifejezés (fun... end) Az összevonandó paraméterek száma nem lehet több a hátralévő paraméterek számánál A megváltozó paraméterszám nem okozhat ütközést Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 12 / 19
Implicit függvény Egy példa -module(branch3). -export([calls/0]). branches(first, A, _B) -> A; branches(second, _A, B) -> B; branches(head, [A _], [B _]) -> {A, B}. calls() -> {branches(head, [1,2], [3,4]), apply(fun branches/3, [first, 1, 2]) }. -module(branch3). -export([calls/0]). branches(first, {A, _B}) -> A; branches(second, {_A, B}) -> B; branches(head, {[A _], [B _]}) -> {A, B}. calls() -> { branches(head, {[1,2], [3,4]}), apply(fun (P1,P2,P3) -> branches(p1,{p2,p3}) end, [first, 1, 2]) }. Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 13 / 19
Implicit függvény Egy példa -module(branch3). -export([calls/0]). branches(first, A, _B) -> A; branches(second, _A, B) -> B; branches(head, [A _], [B _]) -> {A, B}. calls() -> {branches(head, [1,2], [3,4]), apply(fun branches/3, [first, 1, 2]) }. -module(branch3). -export([calls/0]). branches(first, {A, _B}) -> A; branches(second, {_A, B}) -> B; branches(head, {[A _], [B _]}) -> {A, B}. calls() -> { branches(head, {[1,2], [3,4]}), apply(fun (P1,P2,P3) -> branches(p1,{p2,p3}) end, [first, 1, 2]) }. Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 14 / 19
Implicit függvény Egy példa -module(branch3). -export([calls/0]). branches(first, A, _B) -> A; branches(second, _A, B) -> B; branches(head, [A _], [B _]) -> {A, B}. calls() -> {branches(head, [1,2], [3,4]), apply(fun branches/3, [first, 1, 2]) }. -module(branch3). -export([calls/0]). branches(first, {A, _B}) -> A; branches(second, {_A, B}) -> B; branches(head, {[A _], [B _]}) -> {A, B}. calls() -> { branches(head, {[1,2], [3,4]}), apply(fun (P1,P2,P3) -> branches(p1,{p2,p3}) end, [first, 1, 2]) }. Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 15 / 19
Implicit függvény Egy példa -module(branch3). -export([calls/0]). branches(first, A, _B) -> A; branches(second, _A, B) -> B; branches(head, [A _], [B _]) -> {A, B}. calls() -> {branches(head, [1,2], [3,4]), apply(fun branches/3, [first, 1, 2]) }. -module(branch3). -export([calls/0]). branches(first, {A, _B}) -> A; branches(second, {_A, B}) -> B; branches(head, {[A _], [B _]}) -> {A, B}. calls() -> { branches(head, {[1,2], [3,4]}), apply(fun (P1,P2,P3) -> branches(p1,{p2,p3}) end, [first, 1, 2]) }. Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 16 / 19
A tool szerkezete A refaktoráló eszköz Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 17 / 19
A tool szerkezete A refaktoráló eszköz Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 17 / 19
Nyelvek Alkalmazott programozási nyelvek ELisp: az Emacs menü szerkezetéhez, felhasználói üzenetek, kommunikáció kezeléséhez Erlang: a refaktor lépések, adatbázis-struktúra kezelése SQL: kommunikáció az adatbázis felé ODBC-n keresztül Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 18 / 19
Elért eredményeink 1 Az eszköz keretrendszerének megvalósítása 2 Az AST és a statikus-szemantikus információk adatbázisban tárolásának megtervezése 3 A kód tárolásának és megjelenítésének megvalósítása Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 19 / 19
Elért eredményeink 1 Az eszköz keretrendszerének megvalósítása 2 Az AST és a statikus-szemantikus információk adatbázisban tárolásának megtervezése 3 A kód tárolásának és megjelenítésének megvalósítása 4 A projektmunka keretében elemzett refaktor lépések feltételeinek megfelelően az algoritmusok megtervezése 5 A refaktor lépések lekódolása Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 19 / 19
Elért eredményeink 1 Az eszköz keretrendszerének megvalósítása 2 Az AST és a statikus-szemantikus információk adatbázisban tárolásának megtervezése 3 A kód tárolásának és megjelenítésének megvalósítása 4 A projektmunka keretében elemzett refaktor lépések feltételeinek megfelelően az algoritmusok megtervezése 5 A refaktor lépések lekódolása 6 Az elemzés során készített tesztesetek (kb. 300 db) mindegyikének lefuttatása, a kapott eredmények helyességének ellenőrzése 7 Az eszköz tesztelése egy iparból kapott nagyobb kódbázison Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 19 / 19
Elért eredményeink 1 Az eszköz keretrendszerének megvalósítása 2 Az AST és a statikus-szemantikus információk adatbázisban tárolásának megtervezése 3 A kód tárolásának és megjelenítésének megvalósítása 4 A projektmunka keretében elemzett refaktor lépések feltételeinek megfelelően az algoritmusok megtervezése 5 A refaktor lépések lekódolása 6 Az elemzés során készített tesztesetek (kb. 300 db) mindegyikének lefuttatása, a kapott eredmények helyességének ellenőrzése 7 Az eszköz tesztelése egy iparból kapott nagyobb kódbázison 8 A teljes eszköz jelenleg 5 refaktor lépést tartalmaz 9 A kód jelenleg 10 000 Erlang sor, ami C kódra átszámítva ennek többszörösét jelenti Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba OTDK 2007, Miskolc 19 / 19