comparison paper/meta_computation.tex @ 22:d5f62ca8d3e9

update
author mir3636
date Sun, 03 Feb 2019 03:55:49 +0900
parents 9295b0c90a84
children 5927917e1832
comparison
equal deleted inserted replaced
21:2f235b4308d2 22:d5f62ca8d3e9
8 Gears OS は処理やデータの構造が Code Gear、Data Gear に閉じているため、 8 Gears OS は処理やデータの構造が Code Gear、Data Gear に閉じているため、
9 これにより実行時間、メモリ使用量などを予測可能なものにすることが可能になる。 9 これにより実行時間、メモリ使用量などを予測可能なものにすることが可能になる。
10 10
11 \section{Continuation based C} 11 \section{Continuation based C}
12 CbC は処理を Code Gear とした単位を用いて記述するプログラミング言語である。 12 CbC は処理を Code Gear とした単位を用いて記述するプログラミング言語である。
13 Code Gear 間では軽量継続 (goto文) による遷移を行うので、継続前の Code Gear に戻ることはなく、状態遷移ベースのプログラミングに適している。 13 Code Gear 間では軽量継続 (goto文) による遷移を行うので、継続前の Code Gear に戻ることはなく、
14 状態遷移ベースのプログラミングに適している。
14 図\ref{fig:cs}は Code Gear 間の処理の流れを表している。 15 図\ref{fig:cs}は Code Gear 間の処理の流れを表している。
15 16
16 \begin{figure}[htpb] 17 \begin{figure}[htpb]
17 \begin{center} 18 \begin{center}
18 \scalebox{0.7}{\includegraphics{fig/codesegment.pdf}} 19 \scalebox{0.9}{\includegraphics{fig/codesegment.pdf}}
19 \end{center} 20 \end{center}
20 \caption{goto による code gear 間の継続} 21 \caption{goto による code gear 間の継続}
21 \label{fig:cs} 22 \label{fig:cs}
22 \end{figure} 23 \end{figure}
23 24
26 Gears OS はこの CbC を用いて記述されている。 27 Gears OS はこの CbC を用いて記述されている。
27 28
28 \section{Code Gear} 29 \section{Code Gear}
29 30
30 Code Gear は CbC における最も基本的な処理単位である。 31 Code Gear は CbC における最も基本的な処理単位である。
31 リスト \ref{code_simple} はCbC における Code Gear の一例である。 32 ソースコード \ref{code_simple} はCbC における Code Gear の一例である。
32 33
33 \begin{lstlisting}[frame=lrbt,label=code_simple,caption={\footnotesize code segment の軽量継続}] 34 \begin{lstlisting}[frame=lrbt,label=code_simple,caption={\footnotesize code segment の軽量継続}]
34 __code cs0(int a, int b){ 35 __code cs0(int a, int b){
35 goto cs1(a+b); 36 goto cs1(a+b);
36 } 37 }
41 \end{lstlisting} 42 \end{lstlisting}
42 43
43 Code Gear は\_\_code Code Gear 名 (引数) の形で記述される。 44 Code Gear は\_\_code Code Gear 名 (引数) の形で記述される。
44 Code Gear は戻り値を持たないので、関数とは異なり return 文は存在しない。 45 Code Gear は戻り値を持たないので、関数とは異なり return 文は存在しない。
45 次の Code Gear への遷移は goto Code Gear 名 (引数) で次の Code Gear への遷移を記述する。 46 次の Code Gear への遷移は goto Code Gear 名 (引数) で次の Code Gear への遷移を記述する。
46 リスト \ref{code_simple} での goto cs1(a+b); がこれにあたる。 47 ソースコード \ref{code_simple} での goto cs1(a+b); がこれにあたる。
47 この goto の行き先を継続と呼び、このときの a+b が次の Code Gear への出力となる。 48 この goto の行き先を継続と呼び、このときの a+b が次の Code Gear への出力となる。
48 Scheme の継続と異なり CbC には呼び出し元の環境がないので、この継続は単なる行き先である。 49 Scheme の継続と異なり CbC には呼び出し元の環境がないので、この継続は単なる行き先である。
49 したがってこれを軽量継続と呼ぶこともある。 50 したがってこれを軽量継続と呼ぶこともある。
50 cs1 へ継続した後は cs0 へ戻ることはない。 51 cs1 へ継続した後は cs0 へ戻ることはない。
51 軽量継続により、並列化、ループ制御、関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようにする。 52 軽量継続により、並列化、ループ制御、関数コールとスタックの操作を意識した最適化がソースコードレベルで行えるようにする。
52 53
53 \section{Data Gear} 54 \section{Data Gear}
54 Data Gear は Gears におけるデータの単位である。 55 Data Gear は Gears OS におけるデータの単位である。
55 Gears OS では Code Gear は Input Data Gear、Output Data Gear を引数に持ち、 56 Gears OS では Code Gear は Input Data Gear、Output Data Gear を引数に持ち、
56 任意の Input Data Gear を参照し、Output Data Gear を書き出す。\ref{fig:IODataGear} 57 任意の Input Data Gear を参照し、Output Data Gear を書き出す。図\ref{fig:IODataGear}
57 Code Gear はこのとき渡された引数の Data Gear 以外を参照することはない。 58 Code Gear はこのとき渡された引数の Data Gear 以外を参照することはない。
58 この Data Gear の対応から依存関係の解決を行う。 59 この Data Gear の対応から依存関係の解決を行う。
59 60
60 \begin{figure}[ht] 61 \begin{figure}[ht]
61 \begin{center} 62 \begin{center}
62 \includegraphics[width=100mm]{fig/IO_DataGear.pdf} 63 \includegraphics[width=130mm]{fig/IO_DataGear.pdf}
63 \end{center} 64 \end{center}
64 \caption{CodeGear と DataGear} 65 \caption{CodeGear と DataGear}
65 \label{fig:IODataGear} 66 \label{fig:IODataGear}
66 \end{figure} 67 \end{figure}
67 68
68 ソースコード \ref{Gears_code} は Gears OS での Stack の操作の Code Gear の例である。 69 ソースコード \ref{Gears_code} は Gears OS での Stack の pop 操作の Code Gear の例である。
69 popSingleLinkedStack での引数 stack が Input Data Gear、next は継続先の Code Gear のアドレス、 70 popSingleLinkedStack での引数 stack が Input Data Gear、next は継続先の Code Gear のアドレス、
70 next の引数の data が Output Data Gear、... は可変長引数であることを示している。 71 next の引数の data が Output Data Gear、... は可変長引数であることを示している。
71 pop の操作を行った後に goto next で引数で受けた次の Code Gear へと継続する。 72 Input Data Gear で受け取った Stack に対して pop の操作を行った後に、
73 取り出したデータを Output Data Gear として書き出し、goto next で引数で受けた次の Code Gear へと継続する。
72 74
73 \begin{lstlisting}[frame=lrbt,label=Gears_code,caption={\footnotesize Gears でのStack pop}] 75 \begin{lstlisting}[frame=lrbt,label=Gears_code,caption={\footnotesize Gears でのStack pop}]
74 76
75 __code stackTest3(struct Stack* stack) { 77 __code stackTest3(struct Stack* stack) {
76 goto stack->pop(assert3); 78 goto stack->pop(assert3);
93 95
94 \end{lstlisting} 96 \end{lstlisting}
95 97
96 \section{Meta Code Gear、Meta Data Gear} 98 \section{Meta Code Gear、Meta Data Gear}
97 Gears OS ではメタ計算 を Meta Code Gear、Meta Data Gear で表現する。 99 Gears OS ではメタ計算 を Meta Code Gear、Meta Data Gear で表現する。
98 Meta Code Gear は通常の Code Gear の直後に遷移され、メタ計算を実行する。 100 Meta Code Gear は通常の Code Gear の直前、直後に遷移され、メタ計算を実行する。
101 Code Gear はノーマルレベルでは図 \ref{fig:normal_Code_Gear} のように見える。
102 メタレベルでは Code Gear は図 \ref{fig:meta_Code_Gear} のように継続を行なっている。
103
104 \begin{figure}[ht]
105 \begin{center}
106 \includegraphics[width=60mm]{fig/normal_Code_Gear.pdf}
107 \end{center}
108 \caption{ノーマルレベルの Code Gear の継続}
109 \label{fig:normal_Code_Gear}
110 \end{figure}
111
112 \begin{figure}[ht]
113 \begin{center}
114 \includegraphics[width=100mm]{fig/meta_Code_Gear.pdf}
115 \end{center}
116 \caption{メタレベルの Code Gear の継続}
117 \label{fig:meta_Code_Gear}
118 \end{figure}
99 119
100 Gears OS では Context と呼ばれる、使用されるすべての Code Gear、Data Gear を持つ Meta Data Gear を持っている。 120 Gears OS では Context と呼ばれる、使用されるすべての Code Gear、Data Gear を持つ Meta Data Gear を持っている。
101 Gears OS は必要な Code Gear、Data Gear を参照したい場合、この Context を通す必要がある。 121 Gears OS は必要な Code Gear、Data Gear を参照したい場合、この Context を通す必要がある。
102 しかし Context を通常の計算から直接扱うのはセキュリティ上好ましくない。 122 しかし Context を通常の計算から直接扱うのはセキュリティ上好ましくない。
103 そこで Context から必要なデータを取り出して Code Gear に接続する Meta Code Gear を定義し、 123 そこで Context から必要なデータを取り出して Code Gear に接続する Meta Code Gear を定義し、
104 これを介して間接的に必要な Data Gear にアクセスする。 124 これを介して間接的に必要な Data Gear にアクセスする。
105 この Meta Code Gear を stub Code Gear と呼ぶ。 125 この Meta Code Gear を stub Code Gear と呼ぶ。
106 %code を入れる
107 stub Code Gear は Code Gear 毎にあり、次の Code Gear へと継続する前に挿入される。 126 stub Code Gear は Code Gear 毎にあり、次の Code Gear へと継続する前に挿入される。
108 つまり goto による継続を行うと、実際には次の Code Gear の stub Code Gear を呼び出す。 127 つまり goto による継続を行うと、実際には次の Code Gear の stub Code Gear を呼び出す。
109 stub Code Gear では、継続先が求める Input Code Gear、Output Code Gear を Context から参照している。 128 stub Code Gear では、継続先が求める Input Code Gear、Output Code Gear を Context から参照している。
110 129
130 図 \ref{fig:Context_ref} はメタレベルで見た Data Gear へのアクセスを図示したものである。
131 メタレベルでは Code Gear は Context が持つ Data Gear へのポインタを渡されており、
132 そこへ Output を行う。
133 stub Code Gear は Meta Data Gear である Context が持つ Data Gear を、
134 Input Data Gear、Output Data Gear として参照し、
135 継続先のノーマルレベルの Code Gear へと遷移する。
136
137 \begin{figure}[ht]
138 \begin{center}
139 \includegraphics[width=140mm]{fig/Context_ref.pdf}
140 \end{center}
141 \caption{Context が持つ Data Gear へのアクセス}
142 \label{fig:Context_ref}
143 \end{figure}
111 144
112 Code Gear と Data Gear は Interface と呼ばれるまとまりとして記述される。 145 Code Gear と Data Gear は Interface と呼ばれるまとまりとして記述される。
113 Interface は使用される Data Gear の定義と、それに対する操作を行う Code Gear の集合である。 146 Interface は使用される全ての Data Gear の定義と、それに対する操作を行う Code Gear の集合である。
114 Interface 作成時に Code Gear の集合を指定することにより複数の実装を持つことができる。 147 Interface 作成時に Code Gear の集合を指定することにより複数の実装を持つことができる。
115 Interface の操作に対応する Code Gear の引数は Interface に定義されている Data Gear を通して指定される。 148 Interface の操作に対応する Code Gear の引数は Interface に定義されている Data Gear を通して指定される。
116 一つの実行スレッド内で使われる Interface の Code Gear と Data Gear は Context に格納される。 149 一つの実行スレッド内で使われる Interface の Code Gear と Data Gear は Context に格納される。
117 150
118 Code Gear の継続は関数型プログラミングからみると継続先の Context を含む Closure となっている。 151 Code Gear の継続は関数型プログラミングからみると継続先の Context を含む Closure となっている。