comparison slide/slide.md @ 85:972eb5656f88

Add GearImpl
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Sat, 10 Feb 2018 04:33:50 +0900
parents 5060432275ea
children 44f592c43324
comparison
equal deleted inserted replaced
84:5060432275ea 85:972eb5656f88
128 - stub Code Gear は実装した Code Gear で決まった形になるため、自動生成が可能である 128 - stub Code Gear は実装した Code Gear で決まった形になるため、自動生成が可能である
129 - Interface を導入することで、 Stack や Queue などのデータ構造を使用と実装に分けて記述することが出来る 129 - Interface を導入することで、 Stack や Queue などのデータ構造を使用と実装に分けて記述することが出来る
130 - Interface は Java のインターフェース、 Haskell の型クラスに対応する 130 - Interface は Java のインターフェース、 Haskell の型クラスに対応する
131 131
132 ## Interface の定義 132 ## Interface の定義
133 - Interface の定義には以下の内容を定義する
134 - 操作(API) である Code Gear と Code Gear に渡す引数情報
135 - 引数のData Gear 群
136 - 操作(API) 実行後に継続される Code Gear
137
138 ``` c
139 typedef struct Queue<Impl>{
140 // Data Gear parameter
141 union Data* queue;
142 union Data* data;
143 __code next(...);
144 __code whenEmpty(...);
145
146 // Code Gear
147 __code clear(Impl* queue, __code next(...));
148 __code put(Impl* queue, union Data* data, __code next(...));
149 __code take(Impl* queue, __code next(union Data*, ...));
150 __code isEmpty(Impl* queue, __code next(...), __code whenEmpty(...));
151 } Queue;
152 ```
133 153
134 ## Interface の実装 154 ## Interface の実装
155 - Interface には複数の実装を行うことが出来る
156 - 実装した Code Gear を Interface で定義した Code Gear に代入することで実装を行う
157 - 代入する Code Gear を入れ替えることで別の実装を表現する
158 - 実装した Data Gear の生成は関数呼び出しで行われ、 外から見るとInterface の型で扱われる
159
160 ```
161 Queue* createSingleLinkedQueue(struct Context* context) {
162 struct Queue* queue = new Queue(); // Allocate Queue interface
163 struct SingleLinkedQueue* singleLinkedQueue = new SingleLinkedQueue(); // Allocate Queue implement
164 queue->queue = (union Data*)singleLinkedQueue;
165 singleLinkedQueue->top = new Element();
166 singleLinkedQueue->last = singleLinkedQueue->top;
167 queue->clear = C_clearSingleLinkedQueue;
168 queue->put = C_putSingleLinkedQueue;
169 queue->take = C_takeSingleLinkedQueue;
170 queue->isEmpty = C_isEmptySingleLinkedQueue;
171 return queue;
172 }
173 ```
174
175 ## Interface の実装例
176 - SingleLinkedQueue の put 実装
177 - 引数は Queue Interface の定義にあわせる
178 - 第一引数は 実装対象の Data Gear の型になる
179
180 ``` c
181 __code putSingleLinkedQueue(struct SingleLinkedQueue* queue, union Data* data, __code next(...)) {
182 Element* element = new Element();
183 element->data = data;
184 element->next = NULL;
185 queue->last->next = element;
186 queue->last = element;
187 goto next(...);
188 }
189 ```
135 190
136 ## Interface を利用した Code Gear の呼び出し 191 ## Interface を利用した Code Gear の呼び出し
137 192 - Interface を利用した Code Gear への継続として `goto interface->method` を提供している
138 ## 並列処理の構成 193 ## 並列処理の構成
139 - 今回は並列処理を行う機構の実装を行う 194 - 今回は並列処理を行う機構の実装を行う
140 - 構成要素 195 - 構成要素
141 - Task(Context) 196 - Task(Context)
142 - Worker 197 - Worker