# HG changeset patch # User mir3636 # Date 1547986448 -32400 # Node ID aeabc8477ec15a65436187a8dfd55432b0d01eb9 # Parent a70aef153f8d0e646cbe1862dc5d9a2c22d75115 fix diff -r a70aef153f8d -r aeabc8477ec1 paper/meta_computation.tex --- a/paper/meta_computation.tex Sun Jan 20 12:36:54 2019 +0900 +++ b/paper/meta_computation.tex Sun Jan 20 21:14:08 2019 +0900 @@ -63,6 +63,37 @@ \label{fig:IODataGear} \end{figure} +リスト \ref{Gears_code} は Gears OS での Stack の操作の Code Gear の例である。 +popSingleLinkedStack での引数 stack が Input Data Gear、next は継続先の Code Gear のアドレス、 +next の引数の data が Output Data Gear、... は可変長引数であることを示している。 +pop の操作を行った後に goto next で引数で受けた次の Code Gear へと継続する。 + +\begin{lstlisting}[frame=lrbt,label=Gears_code,caption={\footnotesize Gears でのStack pop}] + +__code stackTest3(struct Stack* stack) { + goto stack->pop(assert3); +} + +__code popSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) { + if (stack->top) { + data = stack->top->data; + stack->top = stack->top->next; + } else { + data = NULL; + } + goto next(data, ...); +} + +__code assert3(struct Node* node, struct Stack* stack) { + /* + assert in normal level + */ + assert(node->color == Red); + goto exit_code(0); +} + +\end{lstlisting} + \section{Meta Code Gear、Meta Data Gear} Gears OS ではメタ計算 を Meta Code Gear、Meta Data Gear で表現する。 Meta Code Gear は通常の Code Gear の直後に遷移され、メタ計算を実行する。 @@ -82,27 +113,27 @@ そこで Context から必要なデータを取り出して Code Gear に接続する Meta Code Gear を定義し、 これを介して間接的に必要な Data Gear にアクセスする。 この Meta Code Gear を stub Code Gear と呼ぶ。 +%code を入れる stub Code Gear は Code Gear 毎に生成され、次の Code Gear へと継続する前に挿入される。 goto による継続を行うと、実際には次の Code Gear の stub Code Gear を呼び出す。 - +\section{Meta Gear の自動生成} -メタレベルの記述は Perl スクリプトによって生成される stub と goto meta によって Code Gear で記述される。 +メタレベルの記述は Perl スクリプトによって生成される。 +stub Code Gear と meta によって Code Gear で記述される。 Code Gear と Data Gear は Interface と呼ばれるまとまりとして記述される。 Interface は使用される Data Gear の定義と、それに対する操作を行う Code Gear の集合である。 Interface 作成時に Code Gear の集合を指定することにより複数の実装を持つことができる。 Interface の操作に対応する Code Gear の引数は Interface に定義されている Data Gear を通して指定される。 -一つの実行スレッド内で使われる Interface の Code Gear と Data Gear は Meta Data Gear に格納される。 -この Meta Data Gear を Context という。 -ノーマルレベルでは Context を直接見ることはできない。 +一つの実行スレッド内で使われる Interface の Code Gear と Data Gear は Context に格納される。 -Code Gear の継続は関数型プログラミングからみると継続先の Context を含む Closure となっている。 -これを記述するために継続に不定長引数を追加する構文をスクプリトの変換機能として用意した。Code \ref{varargnext} -メタ計算側ではこれらの Context を常に持ち歩いているので goto 文で引数を用いることはなく、 -行き先は Code Gear の番号のみで指定される。 +%Code Gear の継続は関数型プログラミングからみると継続先の Context を含む Closure となっている。 +%これを記述するために継続に不定長引数を追加する構文をスクプリトの変換機能として用意した。Code \ref{varargnext} +%メタ計算側ではこれらの Context を常に持ち歩いているので goto 文で引数を用いることはなく、 +%行き先は Code Gear の番号のみで指定される。 -\lstinputlisting[label=varargnext, caption=不定長引数を持つ継続]{./src/varargnext.cbc} +%\lstinputlisting[label=varargnext, caption=不定長引数を持つ継続]{./src/varargnext.cbc} これにより Interface 間の呼び出しを C++ のメソッド呼び出しのように記述することができる。 Interface の実装は、Context 内に格納されているので、オブジェクトごとに実装を変える多様性を実現できている。