Mercurial > hg > Papers > 2019 > mitsuki-master
diff paper/meta_computation.tex @ 22:d5f62ca8d3e9
update
author | mir3636 |
---|---|
date | Sun, 03 Feb 2019 03:55:49 +0900 |
parents | 9295b0c90a84 |
children | 5927917e1832 |
line wrap: on
line diff
--- a/paper/meta_computation.tex Thu Jan 31 03:56:37 2019 +0900 +++ b/paper/meta_computation.tex Sun Feb 03 03:55:49 2019 +0900 @@ -10,12 +10,13 @@ \section{Continuation based C} CbC は処理を Code Gear とした単位を用いて記述するプログラミング言語である。 -Code Gear 間では軽量継続 (goto文) による遷移を行うので、継続前の Code Gear に戻ることはなく、状態遷移ベースのプログラミングに適している。 +Code Gear 間では軽量継続 (goto文) による遷移を行うので、継続前の Code Gear に戻ることはなく、 +状態遷移ベースのプログラミングに適している。 図\ref{fig:cs}は Code Gear 間の処理の流れを表している。 \begin{figure}[htpb] \begin{center} - \scalebox{0.7}{\includegraphics{fig/codesegment.pdf}} + \scalebox{0.9}{\includegraphics{fig/codesegment.pdf}} \end{center} \caption{goto による code gear 間の継続} \label{fig:cs} @@ -28,7 +29,7 @@ \section{Code Gear} Code Gear は CbC における最も基本的な処理単位である。 -リスト \ref{code_simple} はCbC における Code Gear の一例である。 +ソースコード \ref{code_simple} はCbC における Code Gear の一例である。 \begin{lstlisting}[frame=lrbt,label=code_simple,caption={\footnotesize code segment の軽量継続}] __code cs0(int a, int b){ @@ -43,7 +44,7 @@ Code Gear は\_\_code Code Gear 名 (引数) の形で記述される。 Code Gear は戻り値を持たないので、関数とは異なり return 文は存在しない。 次の Code Gear への遷移は goto Code Gear 名 (引数) で次の Code Gear への遷移を記述する。 -リスト \ref{code_simple} での goto cs1(a+b); がこれにあたる。 +ソースコード \ref{code_simple} での goto cs1(a+b); がこれにあたる。 この goto の行き先を継続と呼び、このときの a+b が次の Code Gear への出力となる。 Scheme の継続と異なり CbC には呼び出し元の環境がないので、この継続は単なる行き先である。 したがってこれを軽量継続と呼ぶこともある。 @@ -51,24 +52,25 @@ 軽量継続により、並列化、ループ制御、関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようにする。 \section{Data Gear} -Data Gear は Gears におけるデータの単位である。 +Data Gear は Gears OS におけるデータの単位である。 Gears OS では Code Gear は Input Data Gear、Output Data Gear を引数に持ち、 -任意の Input Data Gear を参照し、Output Data Gear を書き出す。\ref{fig:IODataGear} +任意の Input Data Gear を参照し、Output Data Gear を書き出す。図\ref{fig:IODataGear} Code Gear はこのとき渡された引数の Data Gear 以外を参照することはない。 この Data Gear の対応から依存関係の解決を行う。 \begin{figure}[ht] \begin{center} - \includegraphics[width=100mm]{fig/IO_DataGear.pdf} + \includegraphics[width=130mm]{fig/IO_DataGear.pdf} \end{center} \caption{CodeGear と DataGear} \label{fig:IODataGear} \end{figure} -ソースコード \ref{Gears_code} は Gears OS での Stack の操作の Code Gear の例である。 +ソースコード \ref{Gears_code} は Gears OS での Stack の pop 操作の Code Gear の例である。 popSingleLinkedStack での引数 stack が Input Data Gear、next は継続先の Code Gear のアドレス、 next の引数の data が Output Data Gear、... は可変長引数であることを示している。 -pop の操作を行った後に goto next で引数で受けた次の Code Gear へと継続する。 +Input Data Gear で受け取った Stack に対して pop の操作を行った後に、 +取り出したデータを Output Data Gear として書き出し、goto next で引数で受けた次の Code Gear へと継続する。 \begin{lstlisting}[frame=lrbt,label=Gears_code,caption={\footnotesize Gears でのStack pop}] @@ -95,7 +97,25 @@ \section{Meta Code Gear、Meta Data Gear} Gears OS ではメタ計算 を Meta Code Gear、Meta Data Gear で表現する。 -Meta Code Gear は通常の Code Gear の直後に遷移され、メタ計算を実行する。 +Meta Code Gear は通常の Code Gear の直前、直後に遷移され、メタ計算を実行する。 +Code Gear はノーマルレベルでは図 \ref{fig:normal_Code_Gear} のように見える。 +メタレベルでは Code Gear は図 \ref{fig:meta_Code_Gear} のように継続を行なっている。 + +\begin{figure}[ht] + \begin{center} + \includegraphics[width=60mm]{fig/normal_Code_Gear.pdf} + \end{center} + \caption{ノーマルレベルの Code Gear の継続} + \label{fig:normal_Code_Gear} +\end{figure} + +\begin{figure}[ht] + \begin{center} + \includegraphics[width=100mm]{fig/meta_Code_Gear.pdf} + \end{center} + \caption{メタレベルの Code Gear の継続} + \label{fig:meta_Code_Gear} +\end{figure} Gears OS では Context と呼ばれる、使用されるすべての Code Gear、Data Gear を持つ Meta Data Gear を持っている。 Gears OS は必要な Code Gear、Data Gear を参照したい場合、この Context を通す必要がある。 @@ -103,14 +123,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 を呼び出す。 stub Code Gear では、継続先が求める Input Code Gear、Output Code Gear を Context から参照している。 +図 \ref{fig:Context_ref} はメタレベルで見た Data Gear へのアクセスを図示したものである。 +メタレベルでは Code Gear は Context が持つ Data Gear へのポインタを渡されており、 +そこへ Output を行う。 +stub Code Gear は Meta Data Gear である Context が持つ Data Gear を、 +Input Data Gear、Output Data Gear として参照し、 +継続先のノーマルレベルの Code Gear へと遷移する。 + +\begin{figure}[ht] + \begin{center} + \includegraphics[width=140mm]{fig/Context_ref.pdf} + \end{center} + \caption{Context が持つ Data Gear へのアクセス} + \label{fig:Context_ref} +\end{figure} Code Gear と Data Gear は Interface と呼ばれるまとまりとして記述される。 -Interface は使用される Data Gear の定義と、それに対する操作を行う Code Gear の集合である。 +Interface は使用される全ての Data Gear の定義と、それに対する操作を行う Code Gear の集合である。 Interface 作成時に Code Gear の集合を指定することにより複数の実装を持つことができる。 Interface の操作に対応する Code Gear の引数は Interface に定義されている Data Gear を通して指定される。 一つの実行スレッド内で使われる Interface の Code Gear と Data Gear は Context に格納される。