comparison paper/cbc-type.tex @ 63:6d8825f3b051

Add example of meta code segment execution
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Fri, 03 Feb 2017 11:59:41 +0900
parents a40033d3e10f
children 10a550bf7e4a
comparison
equal deleted inserted replaced
62:a40033d3e10f 63:6d8825f3b051
136 136
137 \lstinputlisting[label=src:agda-mcs, caption=Agda における Meta CodeSegment の定義] {src/MetaCodeSegment.agda.replaced} 137 \lstinputlisting[label=src:agda-mcs, caption=Agda における Meta CodeSegment の定義] {src/MetaCodeSegment.agda.replaced}
138 138
139 % }}} 139 % }}}
140 140
141 % {{{ メタレベル計算の実行
142
141 \section{メタレベル計算の実行} 143 \section{メタレベル計算の実行}
144 Meta DataSegment と Meta CodeSegment の定義を行なったので、残るは実行である。
145
146 実行はノーマルレベルにおいては軽量継続 \verb/goto/ を定義することによって表せた。
147 メタレベル実行ではそれを Meta CodeSegment と Meta DataSegment を扱えるように拡張する。
148 Meta DataSegment は Parameterized Module の引数 \verb/Context/ に相当するため、Meta CodeSegment は Context を取って Context を返す CodeSegment となる。
149 軽量継続 \verb/goto/ と区別するために名前を \verb/exec/ とするリスト~\ref{src:agda-exec}のように定義できる。
150 行なっていることは Meta CodeSegment の本体部分に Meta DataSegment を渡す、という \verb/goto/ と変わらないが、\verb/set/ と \verb/get/ を用いることで上位型である任意の DataSegment を実行する CodeSegment も Meta CodeSegment として一様に実行できる。
151
152 \lstinputlisting[label=src:agda-exec, caption=Agda におけるメタレベル実行の定義] {src/Exec.agda.replaced}
153
154 実行例として、リスト~\ref{src:goto} に示していた a と b の値を加算して c に代入するプログラムを考える。
155 実行する際に c の値を \verb/c'/ に保存してから加算ようなメタ計算を考える。
156 c の値を \verb/c'/ に保存するタイミングは軽量継続時にユーザが指定する。
157 よって軽量継続を行なうのと同等の情報を保持してなくてはならない。
158 そのために Meta Meta DataSegment \verb/Meta/ には制御を移す対象であるノーマルレベル CodeSegment を持つ。
159 値を格納する \verb/c'/ の位置は Meta DataSegment でも Meta Meta DataSegment でも構わないが、今回は Meta Meta DataSegemnt に格納するものとする。
160 それらを踏まえた上での Meta Meta DataSegment の Agda 上での定義は~\ref{src:agda-mmds}のようになる。
161 なお、\verb/goto/ などの名前の衝突を避けるためにノーマルレベルの定義は \verb/N/ に、メタレベルの定義は \verb/M/ へと名前を付けかえている。
162
163 \lstinputlisting[label=src:agda-mmds, caption=Agda における Meta Meta DataSegment の定義例] {src/MetaMetaDataSegment.agda}
164
165 定義した \verb/Meta/ を利用して、c を \verb/c'/に保存するメタ計算 \verb/push/ を定義する。
166 より構文が CbC に似るように \verb/gotoMeta/ を糖衣構文的に定義する。
167 \verb/gotoMeta/ や \verb/push/ で利用している \verb/liftContext/ や \verb/liftMeta/ はノーマルレベル計算をメタ計算レベルとするように型を明示的に変更するものである。
168 結果的に \verb/main/ の \verb/goto/ を \verb/gotoMeta/ に置き換えることにより、c の値を計算しながら保存できる。
169 リスト~\ref{src:agda-mmcs} に示したプログラムでは、通常レベルのコードセグメントを全く変更せずにメタ計算を含む形に拡張している。
170 加算を行なう前の \verb/c/ の値が \verb/70/ であったとした時、計算結果 \verb/150/ は \verb/c/ に格納されるが、\verb/c'/には\verb/70/に保存されている。
171
172 \lstinputlisting[label=src:agda-mmcs, caption=Agda における Meta Meta CodeSegment の定義と実行例] {src/MetaMetaCodeSegment.agda}
173
174 メタの階層構造を表すと図のようになる。
175 Meta DataSegment を含む任意の DataSegment は Meta DataSegment になりえるので、この階層構造は任意の段数定義することが可能である。
176
177
178 % TODO: メタの階層構造の図
179
180 % }}}
181
142 \section{Agda を用いたContinuation based C の検証} 182 \section{Agda を用いたContinuation based C の検証}
143 \section{スタックの実装の検証} 183 \section{スタックの実装の検証}