Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba Témavezető: Horváth Zoltán és Simon Thompson
Nagy Tamás és Víg Anikó ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
OTDK 2007, Miskolc
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
1 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
Paraméterek összevonása tuple-ba
Egy kétmodulos példa (swap függvény paramétereinek összevonása)
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
2 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
3 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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)
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
4 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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)
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
5 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
Refaktorálás
Refaktoráló eszköz
Miért lényeges egy eszköz használata?
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
6 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
6 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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.
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
6 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
7 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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.
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
7 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
Programszöveg és szintaxisfa
A kód és a megfelelő szintaxisfa az azonosítókkal
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
8 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
Programszöveg és szintaxisfa
A kód és a megfelelő szintaxisfa az azonosítókkal
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
8 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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.
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
9 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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.
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
10 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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.
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
11 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
12 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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]) }.
Nagy Tamás és Víg Anikó
-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]) }.
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
13 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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]) }.
Nagy Tamás és Víg Anikó
-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]) }.
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
14 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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]) }.
Nagy Tamás és Víg Anikó
-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]) }.
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
15 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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]) }.
Nagy Tamás és Víg Anikó
-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]) }.
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
16 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
A tool szerkezete
A refaktoráló eszköz
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
17 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
A tool szerkezete
A refaktoráló eszköz
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
17 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
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
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
18 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
Elért eredményeink 1 2
3
Az eszköz keretrendszerének megvalósítása Az AST és a statikus-szemantikus információk adatbázisban tárolásának megtervezése A kód tárolásának és megjelenítésének megvalósítása
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
19 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
Elért eredményeink 1 2
3 4
5
Az eszköz keretrendszerének megvalósítása Az AST és a statikus-szemantikus információk adatbázisban tárolásának megtervezése A kód tárolásának és megjelenítésének megvalósítása A projektmunka keretében elemzett refaktor lépések feltételeinek megfelelően az algoritmusok megtervezése A refaktor lépések lekódolása
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
19 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
Elért eredményeink 1 2
3 4
5 6
7
Az eszköz keretrendszerének megvalósítása Az AST és a statikus-szemantikus információk adatbázisban tárolásának megtervezése A kód tárolásának és megjelenítésének megvalósítása A projektmunka keretében elemzett refaktor lépések feltételeinek megfelelően az algoritmusok megtervezése A refaktor lépések lekódolása 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 Az eszköz tesztelése egy iparból kapott nagyobb kódbázison
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
19 / 19
Bevezetés
Erlang refaktorálás
A kód tárolása
Paraméterek összevonása tuple-ba
Implementáció
Eredmények
Elért eredményeink 1 2
3 4
5 6
7 8 9
Az eszköz keretrendszerének megvalósítása Az AST és a statikus-szemantikus információk adatbázisban tárolásának megtervezése A kód tárolásának és megjelenítésének megvalósítása A projektmunka keretében elemzett refaktor lépések feltételeinek megfelelően az algoritmusok megtervezése A refaktor lépések lekódolása 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 Az eszköz tesztelése egy iparból kapott nagyobb kódbázison A teljes eszköz jelenleg 5 refaktor lépést tartalmaz A kód jelenleg 10 000 Erlang sor, ami C kódra átszámítva ennek többszörösét jelenti
Nagy Tamás és Víg Anikó
ELTE IK Programozási Nyelvek és Fordítóprogramok Tanszék
Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba
OTDK 2007, Miskolc
19 / 19