Fordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1

Hasonló dokumentumok
Fordító Optimalizálás

Fordító Optimalizálás

sallang avagy Fordítótervezés dióhéjban Sallai Gyula

Fordítóprogramok. Aszalós László szeptember 7.

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Stack Vezérlés szerkezet Adat 2.

A kódgenerálás helye a fordítási folyamatban. Kódgenerálás I. (kifejezések és vezérlési szerkezetek) A kódgenerálás feladata. Ebben az előadásban...

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Programozás II. 2. Dr. Iványi Péter

A fordítóprogramok szerkezete. Kódoptimalizálás. A kódoptimalizálás célja. A szintézis menete valójában. Kódoptimalizálási lépések osztályozása

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Pénzügyi algoritmusok

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

A C programozási nyelv II. Utasítások. A függvény.

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Modellező eszközök, kódgenerálás

GPU Lab. 4. fejezet. Fordítók felépítése. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Szemantikai elemzés. konzisztenciájának vizsgálata a szemantikai elemzés feladata lesz.

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

C programozási nyelv

Informatika szigorlat. A lexikális elemző feladatai közé tartozik a whitespace karakterek (a

Programok értelmezése

Java II. I A Java programozási nyelv alapelemei

Bevezetés a C++ programozási nyelvbe

Informatika terméktervezőknek

Bonyolultságelmélet. Monday 26 th September, 2016, 18:50

Haladó Fordítóprogramok

A programozás alapjai

PE/COFF fájl formátum

Fordítóelmélet bevezetés

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Fordítás Kódoptimalizálás

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Programozás C és C++ -ban

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

Digitális technika VIMIAA01 9. hét

Java II. I A Java programozási nyelv alapelemei

PHP alapjai, bevezetés. Vincze Dávid Miskolci Egyetem, IIT

Mintavételes szabályozás mikrovezérlő segítségével

FORDÍTÓPROGRAMOK. MKSA3144F kidolgozott tételek ás verzió január 21., Domján Tamás

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

C programozás. 1 óra Bevezetés

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Programozási nyelvek Java

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Mutatók és mutató-aritmetika C-ben március 19.

Alkalmazások architektúrája

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Occam 1. Készítette: Szabó Éva

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Készítette: Trosztel Mátyás Konzulens: Hajós Gergely

Vezérlésfolyam gráf és X86 utasításkészlet

Programozás II. 4. Dr. Iványi Péter

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Programozás 6. Dr. Iványi Péter

Web-technológia PHP-vel

Programozás I. 1. előadás: Algoritmusok alapjai. Sergyán Szabolcs

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Előfeldolgozó rendszer Tömbök. Dr. Bécsi Tamás 4. Előadás

Algoritmizálás és adatmodellezés tanítása 1. előadás

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

8. gyakorlat Pointerek, dinamikus memóriakezelés

Alprogramok, paraméterátadás

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

Bisonc++ tutorial. Dévai Gergely. A szabály bal- és jobboldalát : választja el egymástól. A szabályalternatívák sorozatát ; zárja le.

Programozás 1. Dr. Iványi Péter

Rekurzió. Dr. Iványi Péter

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Programozási nyelvek (ADA)

Programozás alapjai 9.Gy: Struktúra 2.

Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba

A C# programozási nyelv alapjai

1. Alapok. Programozás II

Pénzügyi algoritmusok

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Megoldások a mintavizsga kérdések a VIMIAC04 tárgy ellenőrzési technikák részéhez kapcsolódóan (2017. május)

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Pénzügyi algoritmusok

Java programozási nyelv

3. ZH-ban a minimum pontszám 15

3 A C programozási nyelv szintaktikai egységei

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Apple Swift kurzus 3. gyakorlat

OOP #14 (referencia-elv)

Modellek végrehajtása, kódgenerálás

Programozás alapjai. 7. előadás

Felhasználó által definiált adattípus

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

Programozási nyelvek 6. előadás

Átírás:

Fordító részei Kód visszafejtés. Izsó Tamás 2016. szeptember 29. Izsó Tamás Fordító részei / 1

Section 1 Fordító részei Izsó Tamás Fordító részei / 2

Irodalom Izsó Tamás Fordító részei / 3

Irodalom Izsó Tamás Fordító részei / 4

Irodalom 01-fm-i-viii-9780120884780 2011/1/13 15:54 page ii #2 Izsó Tamás Fordító részei / 5

Irodalom Reverse Compilation Techniques by Cristina Cifuentes Doctor of Philosophy at the QUEENSLAND UNIVERSITY OF TECHNOLOGY July 1994 Izsó Tamás Fordító részei / 6

Miért kell ismerni a fordítót? általában a fordító által generált kódot kell visszafejteni; ha ismerjük a fordító által alkalmazott kódtranszformációt, hamarabb rájöhetünk az eredeti tartalomra; tesztelni kell a fordítót; mert a fordító is azokat az algoritmusokat használja a kód elemzéshez, melyeket a modern decompiler-ek. (Miért, amikor a fordító rendelkezésére áll az eredeti forrás?) Izsó Tamás Fordító részei / 7

Fordító decompiler párhuzamok Fázis fordító decompiler előfeldolgozó makrók kifejtése input file részeinek a beolvasása lexikai analízis tokenizálás assembly utasítás generálás szintaktikai analízis absztrakt szintaxisfa készítés absztrakt szintaxisfa készítés kód generálás gépi kód előállítása magas szintű nyelven írt program előállítása optimalizálás felesleges utasítások kiszűrése és a futás gyorsítása kevesebb forrásprogram sor, még olvashatóbb formába Ilfak Guilfanov (Hex-Rays) Decompilers and beyond cikke alapján. Izsó Tamás Fordító részei / 8

decompiler készítés szempontjai Információ gyűjtés a függvényhívási konvencióról, fordító kibocsájtójáról, memória modellről, stb. Esetleg a felhasználó adja meg. Elméleti alapokon nyugvó problémák megoldása (adatfolyam analízis, regiszterek szerepe az adatterjedésben, alias analízis, use-def lánc, eredményt nem befolyásoló utasítások kiszűrés, adatok élettartama, vezérlésfolyam gráf analízis). Nem megoldható problémákra heurisztikák keresése (indirekt ugrások, függvényhatárok, és függvényparaméterek megállapítása). Beavatkozási lehetőséget adni a felhasználónak a disassembler által nem kezelhető problémák megoldására. Iteraktív felhasználói beavatkozás biztosítása. Izsó Tamás Fordító részei / 9

decompiler működésének a lépései Gépi utasítások visszafejtés. Gépi utasítás mikrokóddá alakítása. Algoritmusnak könnyebb figyelembe venni az utasítások szemantikáját. Például pop eax utasítás csökkenti az esp regiszter értékét. Lokális optimalizálás egyszerűsíti az utasításokat, figyelembe veszi peephole optimalizáció hatását. Globális optimalizáció. Adatfolyam analízis a regiszterek szerepének a tisztázásában. Függvényhívás és paraméter átadás analízis. Pointer és alias analízis. Függvény stack frame határainak a megállapítása. Lokális adatok feltérképezése. Vezérlésszerkezet feltérképezése. A feltételes elágazások alapján az (if, switch, for, stb...) utasítások előállítása. Pszeudokód generálás. Pszeudokód transzformáció, hogy még olvashatóbb legyen a program. Típusok felderítése. Izsó Tamás Fordító részei / 10

Fordító részei Közbenső kódgenerálás szimbólumtábla karakter sorozat Lexikai elemző tokenek sorozata Szintaktikai analízis absztrakt szintaktikai fa Szemantikai ellenőrzés absztrakt szintaktikai fa közbenső ábrázolás Gépfüggetlen kódoptimalizáló közbenső ábrázolás hiba logolás Kódgenerátor processzor függő kód Gépi kód függő optimalizálás processzor függő kód Izsó Tamás Fordító részei / 11

Lexikai elemző 1 double calc( double initial, double rate ) 2 { 3 double position; 4 position = initial+rate*100; 5 return position; 6 } Izsó Tamás Fordító részei / 12

Lexikai elemző double calc( double initial, double rate ) \n { \n double position; \n position = initial+ rate*100; \n return position; \n } \n DOUBLE ID calc "(" DOUBLE ID initial "," DOUBLE ID rate ")" "{" DOUBLE ID position ";" ID position "=" ID initial "+" ID rate "*" NUMBER 100 ";" "RETURN" ID position ";" Izsó Tamás Fordító részei / 13

Token token szintaktikai kategória, csoport; élő nyelvben: ige, főnév, melléknév, tárgy; programozási nyelvekben: egész konstans, valós konstans, string, azonosító, operátor, kulcsszó, írásjelek; lexéma konkrét megvalósulása egy tokennek; attribútum tokenhez rendelt tulajdonság, érték elmaradhat (pl. T_FOR) típus egész konstans, valós konstans, sztring értéke; méret; élettartam; láthatóság stb. nem token: szóköz, megjegyzés Izsó Tamás Fordító részei / 14

Blokk struktúra i n t main ( ) { i n t a=1; i n t b=1; { i n t a=3; p r i n t f ("%d %d \ n ", a, b ) ; } } { i n t b=4; p r i n t f ("%d %d \ n ", a, b ) ; } p r i n t f ("%d %d \ n ", a, b ) ; r e t u r n 0; Izsó Tamás Fordító részei / 15

Szimbólum tábla a tokenizálás során keletkezett azonosítókat, és az azokhoz kapcsolódó attribútumokat tárolja; megőrzi a blokkstruktúrát; OOP esetén a származtatást; gyorsan lehet benne keresni; sokszor a kulcsszavakat is tartalmazza (pl. for, while). Izsó Tamás Fordító részei / 16

Szintaktikai analízis lexikai elemzés után tokenek sorozatát kapjuk; cél a program szerkezetének az értelmezése a környezetfüggetlen nyelvtani szabályok (context-free grammar CFG) alapján (műveletek, precedencia); cél a hibák felderítése; absztrakt szintaxisfa (abstract syntax tree AST) elkészítése. Izsó Tamás Fordító részei / 17

Szintaktikai analízis eredménye function ident calc paramlist body ident initial paramlist declist stmtlist ident rate end ident position end = stmtlist ident position + RETURN end ident initial * NUM 100 ident rate NUM 100 Izsó Tamás Fordító részei / 18

Szemantikai analízis célja Olyan hibák felderítése, amit a CFG-ben nehéz, vagy nem lehet megadni. További információk gyűjtése. 1 extern void f ( i n t n ) ; 2 double calc ( ) 3 { i n t p1, p2 ; 4 i n t i, j ; 5.... 6 p1 = p1 + i ; / OK / 7 p1 = p1 + p2 ; / Hiba / 8 i f ( f ( p1 ) ) / Hiba f ( ) void / 9 { 10 i = j [ 2 ] ; / Hiba / 11 i = j [ p1 ] ; / OK / 12 } 13 / Nincs visszatérési érték / 14 } Izsó Tamás Fordító részei / 19