changeset 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
files paper/interface.tex paper/master_paper.pdf paper/src/iterateCall.cbc paper/src/singleLinkedQueueTest.cbc slide/slide.md
diffstat 5 files changed, 60 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/paper/interface.tex	Sat Feb 10 03:36:57 2018 +0900
+++ b/paper/interface.tex	Sat Feb 10 04:33:50 2018 +0900
@@ -115,13 +115,15 @@
 変換後のコードはメタレベルのコードとなるため、Context をマクロを経由し、直接参照を行う。
 \coderef{singleLinkedQueueTest_script} は \coderef{singleLinkedQueueTest} がスクリプトによってに変換されたソースコードを示しており、 \figref{goto_interface} は \coderef{singleLinkedQueueTest_script} が実行された際の Queue Interface と Code Gear、 Data Gear の関係を示している。
 
-\coderef{singleLinkedQueueTest_script} 内の Gearef マクロは Context から Interface の引数格納用の Data Gear を取り出す。
+\coderef{singleLinkedQueueTest_script} 内の Gearef マクロ(\coderef{singleLinkedQueueTest_script} 5-7行目)は Context から Interface の引数格納用の Data Gear を取り出す。
 この引数格納用の Data Gear は Context の初期化の際に特別に生成され、型は使用される Interface の型と同じである。
 また、引数格納用の Data Gear はノーマルレベルでは参照されず、メタレベルの場合のみ参照される。
 引数格納用の Data Gear を取り出した後は変換前の呼び出しの引数を Interface で定義した Code Gear の引数情報に合わせて格納し、指定した Code Gear に継続する。
 
-\coderef{singleLinkedQueueTest_script} では Queue Interface の put を継続しているため、6行目で Input Data Gear として node Data Gear を 引数格納用の Data Gear の data に代入し、7行目で実行後に継続する Code Gear として queueTest2 を 引数格納用の Data Gear の next に代入している。
+\coderef{singleLinkedQueueTest_script} では Queue Interface(\coderef{queueInterface}) の put を継続しているため、6行目で Input Data Gear として node Data Gear を 引数格納用の Data Gear の data に代入し、7行目で実行後に継続する Code Gear として queueTest2 を 引数格納用の Data Gear の next に代入している。
+
 代入した引数は自動生成された stub Code Gear(\coderef{stubCodeGear})で展開され、実装された Code Gear に Data Gear を渡す。
+stub Code Gear で使用されている GearImpl マクロ(\coderef{stubCodeGear} 12行目)は引数として指定された Interface の型に包まれた Data Gear から実装の Data Gear を取り出す。
 
 \lstinputlisting[caption=スクリプトによる変換後, label=code:singleLinkedQueueTest_script]{./src/singleLinkedQueueTest_script.cbc}
 
Binary file paper/master_paper.pdf has changed
--- a/paper/src/iterateCall.cbc	Sat Feb 10 03:36:57 2018 +0900
+++ b/paper/src/iterateCall.cbc	Sat Feb 10 04:33:50 2018 +0900
@@ -1,4 +1,3 @@
-
 #include "../context.h"
 #interface "Iterator.h"
 #interface "TaskManager.h"
--- a/paper/src/singleLinkedQueueTest.cbc	Sat Feb 10 03:36:57 2018 +0900
+++ b/paper/src/singleLinkedQueueTest.cbc	Sat Feb 10 04:33:50 2018 +0900
@@ -1,5 +1,3 @@
-#interface "Queue.h"
-
 __code code1() {
     Queue* queue = createSingleLinkedQueue(context);
     Node* node = new Node();
--- a/slide/slide.md	Sat Feb 10 03:36:57 2018 +0900
+++ b/slide/slide.md	Sat Feb 10 04:33:50 2018 +0900
@@ -130,11 +130,66 @@
 - Interface は Java のインターフェース、 Haskell の型クラスに対応する
 
 ## Interface の定義
+- Interface の定義には以下の内容を定義する
+    - 操作(API) である Code Gear と Code Gear に渡す引数情報
+    - 引数のData Gear 群
+    - 操作(API) 実行後に継続される Code Gear
+
+``` c
+typedef struct Queue<Impl>{
+        // Data Gear parameter
+        union Data* queue;
+        union Data* data;
+        __code next(...);
+        __code whenEmpty(...);
+
+        // Code Gear
+        __code clear(Impl* queue, __code next(...));
+        __code put(Impl* queue, union Data* data, __code next(...));
+        __code take(Impl* queue, __code next(union Data*, ...));
+        __code isEmpty(Impl* queue, __code next(...), __code whenEmpty(...));
+} Queue;
+```
 
 ## Interface の実装
+- Interface には複数の実装を行うことが出来る
+- 実装した Code Gear を Interface で定義した Code Gear に代入することで実装を行う
+- 代入する Code Gear を入れ替えることで別の実装を表現する
+- 実装した Data Gear の生成は関数呼び出しで行われ、 外から見るとInterface の型で扱われる
+
+```
+Queue* createSingleLinkedQueue(struct Context* context) {
+    struct Queue* queue = new Queue(); // Allocate Queue interface
+    struct SingleLinkedQueue* singleLinkedQueue = new SingleLinkedQueue(); // Allocate Queue implement
+    queue->queue = (union Data*)singleLinkedQueue;
+    singleLinkedQueue->top  = new Element();
+    singleLinkedQueue->last = singleLinkedQueue->top;
+    queue->clear = C_clearSingleLinkedQueue;
+    queue->put  = C_putSingleLinkedQueue;
+    queue->take  = C_takeSingleLinkedQueue;
+    queue->isEmpty = C_isEmptySingleLinkedQueue;
+    return queue;
+}
+```
+
+## Interface の実装例
+- SingleLinkedQueue の put 実装
+- 引数は Queue Interface の定義にあわせる
+- 第一引数は 実装対象の Data Gear の型になる
+
+``` c
+__code putSingleLinkedQueue(struct SingleLinkedQueue* queue, union Data* data, __code next(...)) {
+    Element* element = new Element();
+    element->data = data;
+    element->next = NULL;
+    queue->last->next  = element;
+    queue->last = element;
+    goto next(...);
+}
+```
 
 ## Interface を利用した Code Gear の呼び出し
-
+- Interface を利用した Code Gear への継続として `goto interface->method` を提供している
 ## 並列処理の構成
 - 今回は並列処理を行う機構の実装を行う
 - 構成要素