diff paper/meta_computation.tex @ 1:9100f20b8797

copy mitsuki-sigos
author mir3636
date Wed, 11 Jul 2018 21:48:28 +0900
parents
children a70aef153f8d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/meta_computation.tex	Wed Jul 11 21:48:28 2018 +0900
@@ -0,0 +1,52 @@
+\chapter{Gears におけるメタ計算}
+Gears OS ではメタ計算を柔軟に記述するためのプログラミング言語の単位として Code Gear、Data Gear という単位を用いる。
+Code Gear、Data Gear にはそれぞれメタレベルの単位である Meta Code Gear、Meta Data Gear が存在し、これらを用いてメタ計算を実現する。(図\ref{fig:metaCS})
+
+\begin{figure}[ht]
+ \begin{center}
+  \includegraphics[width=70mm]{./fig/metaCS.pdf}
+ \end{center}
+ \caption{Gears でのメタ計算}
+ \label{fig:metaCS}
+\end{figure}
+
+CbC は軽量継続 (goto文) による遷移を行うので、継続前の Code Gear に戻ることはなく、状態遷移ベースのプログラミングに適している。
+CbC は LLVM\cite{llvm} と GCC\cite{gcc} 上で実装されている。
+メタレベルの記述は Perl スクリプトによって生成される stub と goto 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 を直接見ることはできない。
+
+Code Gear の継続は関数型プログラミングからみると継続先の Context を含む Closure となっている。
+これを記述するために継続に不定長引数を追加する構文をスクプリトの変換機能として用意した。Code \ref{varargnext}
+メタ計算側ではこれらの Context を常に持ち歩いているので goto 文で引数を用いることはなく、
+行き先は Code Gear の番号のみで指定される。
+
+\lstinputlisting[label=varargnext, caption=不定長引数を持つ継続]{./src/varargnext.cbc}
+
+これにより Interface 間の呼び出しを C++ のメソッド呼び出しのように記述することができる。
+Interface の実装は、Context 内に格納されているので、オブジェクトごとに実装を変える多様性を実現できている。
+呼び出された Code Gear は必要な引数を Context から取り出す必要がある。
+これは スクリプトで生成された stub Meta Code Gear で行われる。
+Gears OS でのメタ計算は stub と goto のメタ計算の2箇所で実現される。
+
+Context を複製して複数の CPU に割り当てることにより並列実行を可能になる。
+これによりメタ計算として並列処理を記述したことになる。
+Gears のスレッド生成は Agda の関数型プログラミングに対応して行われるのが望ましい。
+そこで、par goto 構文を導入し、Agda の継続呼び出しに対応させることにした。
+par goto では Context の複製、入力の同期、タスクスケジューラーへの Context の登録などが行われる。
+par goto 文の継続として、スレッドの join に相当する \_\_exit を用意した。
+\_\_exit により par goto で分岐した Code Gear の出力を元のスレッドで受け取ることができる。
+
+関数型プログラムではメモリ管理は GC などを通して暗黙に行われる。
+Gears OS ではメモリ管理は stub などのメタ計算部分で処理される。
+例えば、寿命の短いスレッドでは使い捨ての線形アロケーションを用いる。
+
+%Meta Code Gear は通常の Code Gear の直後に遷移され、メタ計算を実行する。
+
+%これを図示したものが図\ref{fig:metaCS}である。