Mercurial > hg > Papers > 2019 > mitsuki-master
changeset 21:2f235b4308d2
update
author | mir3636 |
---|---|
date | Thu, 31 Jan 2019 03:56:37 +0900 |
parents | 1c7e6703724a |
children | d5f62ca8d3e9 |
files | paper/generate_code.tex paper/master_paper.pdf |
diffstat | 2 files changed, 27 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/generate_code.tex Wed Jan 30 20:11:35 2019 +0900 +++ b/paper/generate_code.tex Thu Jan 31 03:56:37 2019 +0900 @@ -10,8 +10,8 @@ \section{Meta Code Gear の生成} -stub Code Gear は Code Gear 間の継続に挟まれる 必要な Data Gear を Context から参照し、 -継続する Code Gear へと渡すための Meta Code Gear である。 +stub Code Gear は Code Gear 間の継続に挟まれる Meta Code Gear である。 +必要な Data Gear を Context から参照し、継続する Code Gear へと渡すための Meta Code Gear である。 Code Gear 毎に記述する必要があり、継続する Code Gear の引数を見て取り出す Data Gear を選択する。 stub Code Gear はユーザーが任意に記述することも出来るが、Meta を扱うため自動生成を行いたい。 そのため、stub Code Gear を 自動生成する generate stub を Perl スクリプトで作成した。 @@ -22,6 +22,22 @@ この Code Gear を generate stub によって変換、 stub Code Gear の生成を行なったコードがソースコード \ref{MetaCodeGear} である。 +生成された stub Code Gear は、 +継続先の Code Gear が引数で指定した Input Data Gear、Output Data Gear を Context から参照している。 +Gearef は Context から Data Gear を参照するためのマクロである。 +ソースコード\ref{noref} はマクロを用いなかった場合の pop stack の stub Code Gear である。 +Context には Allocation 等で生成した Data Gear へのポインタが格納されている。 +Code Gear が Context にアクセスする際、 +ポインタを使用してデータを取り出すため煩雑なコードとなる。 +そこで Code Gear がデータを参照するための Gearef というマクロを定義した。 +Gearef は Context から Interface の引数格納用の Data Gear を取り出す。 +Gearef に Context と Interface の型を渡すことでデータの参照が行える。 + +GearImpl マクロは Interface の型に包まれた Data Gear から +実装の Data Gear を取り出すためのマクロである。 +実装の Data Gear を取り出す際も、ポインタでの記述が複雑になってしまうため 同様に GearImpl を定義した。 +GearImpl は Context と Interface の型、実装の Data Gear 名を指定することで参照する。 + \begin{lstlisting}[frame=lrbt,label=MetaCodeGear,caption={\footnotesize Stack pop の変換}] __code popSingleLinkedStack_stub(struct Context* context) { @@ -49,23 +65,17 @@ \end{lstlisting} -生成された stub Code Gear は、 -継続先が引数で指定した Input Code Gear、Output Code Gear を Context から参照している。 -Gearef は Context から Data Gear を参照するためのマクロである。 -Context には Allocation 等で生成した Data Gear へのポインタが格納されている。 -Code Gear が Context にアクセスする際、 -ポインタを使用してデータを取り出すため煩雑なコードとなる。 -そこで Code Gear がデータを参照するための Gearef というマクロを定義した。 -Gearef は Context から Interface の引数格納用の Data Gear を取り出す。 -Gearef に Context と Data Gear の型を渡すことでデータの参照が行える。 - -GearImpl マクロは Interface の方に包まれた Data Gear から -実装の Data Gear を取り出すためのマクロである。 -実装の Data Gear を取り出す際も、ポインタでの記述が複雑になってしまうため 同様に GearImpl を定義した。 -GearImpl は Context と Data Gear の型、実装の Data Gear 名を指定することで参照する。 +\begin{lstlisting}[frame=lrbt,label=noref,caption={マクロを用いない stub Code Gear}] +__code popSingleLinkedStack_stub(struct Context* context) { + SingleLinkedStack* stack = (SingleLinkedStack*)context->data[D_Stack]->Stack.stack->Stack.stack; + enum Code next = context->data[D_Stack]->Stack.next; + Data** O_data = &context->data[D_Stack]->Stack.data; + goto popSingleLinkedStack(context, stack, next, O_data); +} +\end{lstlisting} また、Code Gear は継続の際 meta へと goto する。 -Context はすべての Code Gear のリストを持っており、継続先の Code Gear のアドレスは +Context はすべての Code Gear のリストを持っており、継続先の Code Gear へは enum で対応付けられた Code Gear のアドレスのリストを参照して継続を行う。 この meta もスクリプトにより自動生成される。