Mercurial > hg > Papers > 2018 > parusu-master
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 |