Skip to content

Commit

Permalink
Finishing touches
Browse files Browse the repository at this point in the history
  • Loading branch information
battila7 committed Apr 5, 2017
1 parent 5171adb commit 5b5ad9d
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 34 deletions.
70 changes: 47 additions & 23 deletions chapters/01-bevezetes.tex
Original file line number Diff line number Diff line change
Expand Up @@ -12,29 +12,53 @@ \section{Motiváció}

Természetesen felmerül a kérdés, hogy mégis mennyiben indokolt egy ilyen, új nyelvi elem bevezetése? Egyelőre ahelyett, hogy a generátorok előnyeivel próbálnánk érvelni a bevezetésük mellett, vizsgáljuk meg inkább azt, hogy más, széleskörben használt programozási nyelvek hogyan viszonyulnak a kérdéshez. A legnépszerűbb nyelvek listájához a TIOBE Indexet vettem alapul \cite{TIOBEIndex}. Az \ref{table:1} táblázat adataiból kiolvasható, hogy a legnépszerűbb programozási nyelvek fele natívan támogatja a generátorok létrehozását. Ennek ismeretében már feltételezhetjük, hogy valós igény mutatkozna e struktúra bevezetésére a \textit{Java} nyelvben is. Az említett két tényező biztosította a motivációt, hogy a generátorok \textit{Java} nyelvben történő bevezetésének lehetőségét megvizsgáljam.

\begin{table}
\captionsetup{justification=centering}
\centering
\begin{tabular}{|| c | c ||}
\hline
Programozási nyelv & Támogatás \\
\hline \hline
Java & \cellcolor{red!20}Nem \\
C & \cellcolor{red!20}Nem \\
C++ & \cellcolor{yellow!20}Tervezett \\
C\# & \cellcolor{green!20}Igen \\
Python & \cellcolor{green!20}Igen \\
Visual Basic .NET & \cellcolor{green!20}Igen \\
PHP & \cellcolor{green!20}Igen \\
JavaScript & \cellcolor{green!20}Igen \\
Delphi/Object Pascal & \cellcolor{red!20}Nem \\
Swift & \cellcolor{red!20}Nem \\
\hline
\end{tabular}
\caption{Generátorok támogatása a legnépszerűbb programozási nyelvek körében (népszerűség sorrendjében)}
\label{table:1}
\end{table}

\if\useColors1
\begin{table}
\captionsetup{justification=centering}
\centering
\begin{tabular}{|| c | c ||}
\hline
Programozási nyelv & Támogatás \\
\hline \hline
Java & \cellcolor{red!20}Nem \\
C & \cellcolor{red!20}Nem \\
C++ & \cellcolor{yellow!20}Tervezett \\
C\# & \cellcolor{green!20}Igen \\
Python & \cellcolor{green!20}Igen \\
Visual Basic .NET & \cellcolor{green!20}Igen \\
PHP & \cellcolor{green!20}Igen \\
JavaScript & \cellcolor{green!20}Igen \\
Delphi/Object Pascal & \cellcolor{red!20}Nem \\
Swift & \cellcolor{red!20}Nem \\
\hline
\end{tabular}
\caption{Generátorok támogatása a legnépszerűbb programozási nyelvek körében (népszerűség sorrendjében)}
\label{table:1}
\end{table}
\else
\begin{table}
\captionsetup{justification=centering}
\centering
\begin{tabular}{|| c | c ||}
\hline
Programozási nyelv & Támogatás \\
\hline \hline
Java & Nem \\
C & Nem \\
C++ & Tervezett \\
C\# & Igen \\
Python & Igen \\
Visual Basic .NET & Igen \\
PHP & Igen \\
JavaScript & Igen \\
Delphi/Object Pascal & Nem \\
Swift & Nem \\
\hline
\end{tabular}
\caption{Generátorok támogatása a legnépszerűbb programozási nyelvek körében (népszerűség sorrendjében)}
\label{table:1}
\end{table}
\fi
\section{Az eljárás célja}

A dolgozatban ismertetett transzformációs eljárás azzal a céllal került kidolgozásra, hogy alapot vessen a natív támogatás megjelenésének. A kísérleti implementáció által szolgáltatott tapasztalatok birtokában ugyanis megnyílik az út a \textit{Java} fordító módosítása, egy új ajánlás létrehozása, és utolsó lépésként akár a hivatalos támogatás elnyerése előtt.
Expand Down
8 changes: 4 additions & 4 deletions chapters/02-generatorok-es-mas-vezerlesi-szerkezetek.tex
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,17 @@ \section{Szubrutin (\textit{subroutine})}

\section{Korutin (\textit{coroutine})}

A \textit{korutin} fogalmának definiálása helyett, először kövessük Knuth gondolatmenetét \cite[p. 190]{TAoCPVol1}, melynek segítségével azt is megérthetjük, miért volt szükség a szubrutin ismertetésére.
A \textit{korutin} fogalmának definiálása helyett, először kövessük Knuth gondolatmenetét \cite{TAoCPVol1}, melynek segítségével azt is megérthetjük, miért volt szükség a szubrutin ismertetésére.

Tekintsünk a főprogramra és a szubrutinokra együttesen úgy, mint programok egy csapatára, melyben minden egyes csapattag valamilyen feladatot végez el. A főprogram meghív egy szubrutint, az végrehajtja a megfelelő utasításokat, majd újra a főprogram következik. Tovább folytatva a gondolatsort, képzeljük el, hogy a szubrutin, amikor visszatér, valójában meghívja a főprogramot.

Az előbbi gondolatokat követve, megkapjuk a korutinokat, amelyek esetében nincsen egyértelmű alá-fölérendeltségi viszony, mint a szubrutin és a főprogram esetén. A ko\-rutinok mind alá-fölérendeltségi, mind mellérendeltségi viszony kialakítására alkalmasak. Ennek megfelelően a szubrutinok valójában speciális korutinok \cite[p. 190]{TAoCPVol1}.
Az előbbi gondolatokat követve, megkapjuk a korutinokat, amelyek esetében nincsen egyértelmű alá-fölérendeltségi viszony, mint a szubrutin és a főprogram esetén. A ko\-rutinok mind alá-fölérendeltségi, mind mellérendeltségi viszony kialakítására alkalmasak. Ennek megfelelően a szubrutinok valójában speciális korutinok \cite{TAoCPVol1}.

Felmerülhet azonban a kérdés, hogy mi történik abban az esetben, amikor egy korutin egynél többször kerül meghívásra? Míg szubrutinok hívásakor a végrehajtás mindig a szubrutin elejétől indul, addig korutinok esetén a végrehajtás mindig ott folytatódik, ahol a legutóbbi hívás esetén abbamaradt. Ez, és a korutin szempontjából lokális változók értékének megőrzése a hívások között, a korutinok két legfontosabb, definiáló tulajdonsága \cite{Marlin1980}.

\subsection{Szimmetrikus és aszimmetrikus korutinok}

A korutinok (vagyis azok megvalósításainak) különböző szempontok szerint osztályozását adja meg de Moura és Ierusalimschy \citeyear{RevisitingCoroutines}. Egyik lehetséges osztályozási szempont a vezérlés átadásának módja, mely szerint szimmetrikus és aszimmetrikus korutinokat különböztethetünk meg.
A korutinok (vagyis azok megvalósításainak) különböző szempontok szerinti osztályozását adja meg de Moura és Ierusalimschy \citeyear{RevisitingCoroutines}. Egyik lehetséges osztályozási szempont a vezérlés átadásának módja, mely szerint szimmetrikus és aszimmetrikus korutinokat különböztethetünk meg.

A szimmetria valójában a korutinok egymás közötti viszonyát határozza meg. Ha a korutinok szimmetrikusak, akkor egy korutin tetszőleges másik korutint hívhat meg, felfüggesztve ezzel a saját futását, és aktívvá téve a másikat. Ezzel szemben az aszimmetria azt jelenti, hogy a hívott korutinnak vissza kell adnia a vezérlést a hívónak, felfüggesztve ezzel saját futását. Ez pontosan az a megvalósítás, amit a Knuth-féle gondolatmenet bevezetett. Ilyenkor, bár alárendeltségi viszony alakul ki, a Marlin-féle tulajdonságok továbbra is megmaradnak.

Expand Down Expand Up @@ -108,7 +108,7 @@ \subsection{Generátorok megvalósítása iterátorokkal}

Ez a rokonság az alapja annak, hogy a korutinokat nem, de iterátorokat ismerő programozási nyelvekben is dolgozhassunk generátorokkal. Az egyik lehetőség, hogy a függvényeket \textit{iterálhatónak} tekintjük. Ebben az esetben a függvény meghívásával egy új \textit{iterátort} kapunk, mely a generátor által lustán előállított elemeken képes iterálni. Ezt alkalmazza például a \textit{JavaScript}. A másik lehetőség, hogy a függvény egy \textit{iterálhatóval} tér vissza, melyet ugyanúgy használhatunk, mint egy iterálható gyűjteményt. E megoldás alkalmazására példa a \textit{C\#}.

A függvény eredeti törzsét azonban nem használhatjuk fel közvetlenül, hiszen korutinok hiányában nem rendelkezünk olyan eszközökkel, melyek lehetővé tennék a lokális változók értékének hívások közötti megőrzését és a végrehajtás folytatását. A függvénytörzset fordítási idejű transzformációnak kell alávetnünk, hogy ezeket a tulajdonságokat szimulálni tudjuk. A dolgozatban ismertetésre kerülő transzformáció célja is pontosan ugyanez.
A függvény eredeti törzsét azonban nem használhatjuk fel közvetlenül, hiszen ko\-rutinok hiányában nem rendelkezünk olyan eszközökkel, melyek lehetővé tennék a lokális változók értékének hívások közötti megőrzését és a végrehajtás folytatását. A függvénytörzset fordítási idejű transzformációnak kell alávetnünk, hogy ezeket a tulajdonságokat szimulálni tudjuk. A dolgozatban ismertetésre kerülő transzformáció célja is pontosan ugyanez.

% Lehet, hogy el kell majd távolítani
% \pagebreak
Expand Down
6 changes: 3 additions & 3 deletions chapters/04-generatorok-javaban.tex
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ \subsection{Félnyilvános (\textit{package private}) osztály}

A különböző utak részletes kifejtése nélkül ki lehet azonban jelenteni, hogy a láthatóság (vagyis annak hiánya) által okozott kérdések megválaszolása óriási erőfeszítéseket igényel. Vagy bonyolult kerülőutakat kell alkalmazni, hogy a megfelelő deklarációk elérhetőek legyenek, vagy pedig \textit{reflection}t kell használni, mely összetett és fáradságos megoldás.

Bár az osztály létrehozását kivitelezhető a meglevő szintaxisfa módosítása nélkül, azonban ahhoz hogy az eredeti metódus generátormetódussá váljon, tehát az újonnan előállított osztály metódusait hívja, szükséges a felépített szintaxisfa átírása. Hiába generálunk tehát egy új fordítási egységet, a létező szintaxisfát mindenképpen meg kell változtatnunk.
Bár az osztály létrehozása kivitelezhető a meglevő szintaxisfa módosítása nélkül, azonban ahhoz hogy az eredeti metódus generátormetódussá váljon, tehát az újonnan előállított osztály metódusait hívja, szükséges a felépített szintaxisfa átírása. Hiába generálunk tehát egy új fordítási egységet, a létező szintaxisfát mindenképpen meg kell változtatnunk.

A félnyilvános, új fordítási egységbe leképezett osztály mellett szól a stabil és kényelmes \textit{API}, amivel generálható, és hogy az annotáció-feldolgozás kifejezetten ezt támogatja. Ellenérvként említendő, hogy csak bonyolultan kivitelezhető, hogy minden, az eredeti metódus által használt deklaráció elérhető legyen. Emellett semmilyen módon nem kerülhető el az eredeti metódus módosítása.

Expand Down Expand Up @@ -194,7 +194,7 @@ \subsection{Lineáris kód}
\label{GenLinear}
\end{center}

A \ref{GenLinear} kódrészlet jobboldala két \texttt{return} utasítást tartalmaz, melyek a kódrészlet két darabba vágását eredményezik. A \texttt{method1} az első \texttt{return} előtt álló utasításokat tartalmazza, valamint az első generált értéket előállító kifejezést. Emellett jelzi a \textit{trampoline} számára, hogy a futásnak legközelebb a \texttt{method2}-vel kell folytatódnia. A \texttt{method2} tartalmazza a még hátralevő kódrészletet, valamint előállítja a második generált értéket.
A \ref{GenLinear} kódrészlet baloldala két \texttt{return} utasítást tartalmaz, melyek a kódrészlet két darabba vágását eredményezik. A \texttt{method1} az első \texttt{return} előtt álló utasításokat tartalmazza, valamint az első generált értéket előállító kifejezést. Emellett jelzi a \textit{trampoline} számára, hogy a futásnak legközelebb a \texttt{method2}-vel kell folytatódnia. A \texttt{method2} tartalmazza a még hátralevő kódrészletet, valamint előállítja a második generált értéket.

Érdemes megfigyelni, hogy mivel ez az utolsó \textit{állapot}, a \textit{trampoline}-nak már közvetlenül a kapott \textit{continuation}t meghívó lambda függvényt ad át, jelezve a számítás végét. Ez a többi vezérlési szerkezet esetén is hasonlóan fog történni.

Expand Down Expand Up @@ -456,7 +456,7 @@ \subsection{\texttt{switch}}

A \texttt{switch} ágaiból képzett metódusok már csak az adott ághoz tartozó utasításokat tartalmazzák. Egy további állapotban történik a vezérlés újraegyesítése, mely semmilyen, az eredeti kódrészletből átemelt utasítást nem tartalmaz.

\subsection{Fordítási idejű CPS}
\subsection{Fordítási idejű \textit{CPS}}

A vezérlési szerkezetek bemutatásakor egyik oldalon szerepelt a forráskód, a másik oldalon pedig az ebből képzett metódusok. A két oldal közötti mechanika nem került pontos ismertetésre. A transzformáció egzakt működése azonban csak ennek felfedésével lesz megérthető.

Expand Down
2 changes: 1 addition & 1 deletion chapters/05-peldak-es-meresek.tex
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,6 @@ \section{Konklúzió}

A fejezet két példán keresztül mutatta be a \textit{Jield} használatát és teljesítményét. Természetesen ez nem elég ahhoz, hogy általános érvényű következtetéseket vonhassunk le, azonban bizonyos jellemzők megfigyelését lehetővé teszik.

A \textit{Jield} segítségével ugyanúgy írhatunk generátort, mint egy hagyományos metódust, mindössze a \texttt{return} megváltozott szerepére kell tekintettel lenni. Ez lehetővé teszi, közvetlenül az elemek előállítására koncentráljunk, a generátor működési mechanizmusa rejtve marad.
A \textit{Jield} segítségével ugyanúgy írhatunk generátort, mint egy hagyományos metódust, mindössze a \texttt{return} megváltozott szerepére kell tekintettel lenni. Ez lehetővé teszi, hogy közvetlenül az elemek előállítására koncentráljunk, a generátor működési mechanizmusa rejtve marad.

Az absztrakciónak azonban ára van. A mérésekből kitűnik, hogy legjobb esetben is kétszer, legrosszabb esetben mintegy $7,5$-szer több a \textit{Jield}-féle generátorok átlagos futási ideje, mint a \texttt{Stream}et használó metódusoké. Teljesítménykritikus helyzetekben ezt mindenképpen figyelembe kell venni.
2 changes: 1 addition & 1 deletion chapters/06-osszefoglalas.tex
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
\chapter{Összefoglalás}

A dolgozatban egy olyan eljárás került bemutatásra, mely úgynevezett generátorok előállítását teszi lehetővé \textit{Java}ban. A kidolgozott módszer annotáció-feldolgozáson alapul, használatához csak egy annotáció elhelyezése szükséges a megfelelő metóduson. A háttérben, a szintaxisfa módosítása segítségével új osztályok és új metódusok kerülnek létrehozásra, valamint az eredeti implementáció sem marad érintetlenül. A programvezérlés szabályozása \textit{CPS}-transzformáció segítségével valósul meg.
A dolgozatban egy olyan eljárás került bemutatásra, mely úgynevezett generátorok előállítását teszi lehetővé \textit{Java}ban. A kidolgozott módszer annotáció-feldolgozáson alapul, használatához csak egy annotáció elhelyezése szükséges a megfelelő metóduson. A háttérben a szintaxisfa módosítása segítségével új osztályok és új metódusok kerülnek létrehozásra, valamint az eredeti implementáció sem marad érintetlenül. A programvezérlés szabályozása \textit{CPS}-transzformáció segítségével valósul meg.

\section{A transzformáció jellemzői}

Expand Down
2 changes: 1 addition & 1 deletion chapters/koszonetnyilvanitas.tex
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ \chapter*{Köszönetnyilvánítás}

Szeretném megköszönni a dolgozat elkészítésében nyújtott segítséget a témavezetőimnek, Dr. Battyányi Péternek és Balla Tibornak. Az elmúlt hetekben számtalanszor olvasták át újra és újra a szöveget, hogy érthető és szakmai szempontból kifogástalan legyen.

Bár nem ehhez a témához kapcsolódik, de az első konferencia-részvételemet is Dr. Battyányi Péter tette lehetővé, amiért rendkívül hálás vagyok. Remélem, még sok konferencián részt vehetek a jövőben.
Bár nem ehhez a témához kapcsolódik, de az első konferencia-részvételemet is Dr. Battyányi Péter tette lehetővé, amiért rendkívül hálás vagyok. Remélem, még sok konferencián vehetek részt a jövőben.

Külön szeretném megköszönni azt a rengeteg időt, amit Balla Tibor a velem folytatott megbeszélésekre szánt, háttérbe szorítva más, fontos feladatait. Emellett mobilinternet-csomagjának utolsó kilobitjeit is a dolgozatom letöltésére és olvasására fordította.

Expand Down
4 changes: 3 additions & 1 deletion misc/defines.tex
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,6 @@
\renewcommand{\ellipsisgap}{0.1em}

% 1,5-es sorköz
\linespread{1.25}
\linespread{1.25}

\providecommand{\useColors}{1}

0 comments on commit 5b5ad9d

Please sign in to comment.