# HG changeset patch # User Tatsuki IHA # Date 1518204830 -32400 # Node ID 972eb5656f88a9474d4628a2de71b971636d7d40 # Parent 5060432275ea8b9778a393aa8f0190ddd9822c61 Add GearImpl diff -r 5060432275ea -r 972eb5656f88 paper/interface.tex --- 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} diff -r 5060432275ea -r 972eb5656f88 paper/master_paper.pdf Binary file paper/master_paper.pdf has changed diff -r 5060432275ea -r 972eb5656f88 paper/src/iterateCall.cbc --- 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" diff -r 5060432275ea -r 972eb5656f88 paper/src/singleLinkedQueueTest.cbc --- 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(); diff -r 5060432275ea -r 972eb5656f88 slide/slide.md --- 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{ + // 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` を提供している ## 並列処理の構成 - 今回は並列処理を行う機構の実装を行う - 構成要素