Mercurial > hg > Papers > 2018 > parusu-master
changeset 24:2c896f2b2d04
Add gotoInterface.graffle
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 30 Jan 2018 04:48:12 +0900 |
parents | 5e40a4836e0a |
children | 43a2be7500dd |
files | paper/fig/dependency.graffle paper/fig/dependency.pdf paper/fig/dependency.xbb paper/fig/gotoInterface.graffle paper/fig/gotoInterface.pdf paper/fig/gotoInterface.xbb paper/fig/putSynchronizedQueue2.graffle paper/fig/putSynchronizedQueue2.pdf paper/fig/putSynchronizedQueue2.xbb paper/interface.tex paper/master_paper.pdf paper/src/metaCreateTask.cbc paper/src/parGotoCreateTask.cbc |
diffstat | 13 files changed, 37 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/fig/dependency.xbb Mon Jan 29 19:33:44 2018 +0900 +++ b/paper/fig/dependency.xbb Tue Jan 30 04:48:12 2018 +0900 @@ -4,5 +4,5 @@ %%HiResBoundingBox: 0.000000 0.000000 573.000000 273.000000 %%PDFVersion: 1.3 %%Pages: 1 -%%CreationDate: Thu Jan 25 15:56:03 2018 +%%CreationDate: Tue Jan 30 03:45:27 2018
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/fig/gotoInterface.xbb Tue Jan 30 04:48:12 2018 +0900 @@ -0,0 +1,8 @@ +%%Title: fig/gotoInterface.pdf +%%Creator: extractbb 20170318 +%%BoundingBox: 0 0 793 724 +%%HiResBoundingBox: 0.000000 0.000000 793.000000 724.000000 +%%PDFVersion: 1.3 +%%Pages: 1 +%%CreationDate: Tue Jan 30 04:46:28 2018 +
--- a/paper/fig/putSynchronizedQueue2.xbb Mon Jan 29 19:33:44 2018 +0900 +++ b/paper/fig/putSynchronizedQueue2.xbb Tue Jan 30 04:48:12 2018 +0900 @@ -4,5 +4,5 @@ %%HiResBoundingBox: 0.000000 0.000000 825.000000 391.000000 %%PDFVersion: 1.3 %%Pages: 1 -%%CreationDate: Wed Jan 24 02:45:08 2018 +%%CreationDate: Mon Jan 29 20:29:39 2018
--- a/paper/interface.tex Mon Jan 29 19:33:44 2018 +0900 +++ b/paper/interface.tex Tue Jan 30 04:48:12 2018 +0900 @@ -36,7 +36,7 @@ Queue の Interface を \coderef{queueInterface} に示す。 \coderef{queueInterface} の3-4行目は 引数の Data Gear 群を定義している。 ここで定義された Data Gear 名は、 定義された Code Gear の引数に対応する。 -例えば \coderef{queueInterface} 10行目は Queue に要素を挿入する Code Gear を定義しており、引数として 挿入する Queue の実装と 挿入する要素を受け取る。 +例えば \coderef{queueInterface} の10行目は Queue に要素を挿入する Code Gear を定義しており、引数として 挿入する Queue の実装と 挿入する要素を受け取る。 この引数それぞれが \coderef{queueInterface} 3-4行目で定義した queue と data に対応する。 \coderef{queueInterface} の5-6行目は Interface の Code Gear の実行後に継続される Code Gear を定義している。 @@ -57,24 +57,29 @@ \lstinputlisting[caption=QueueのInterface, label=code:queueInterface]{./src/queueInterface.h} \section{Interface の実装} -Interface はあくまでも、 Data Gear の振る舞いである Code Gear とその Code Gear で扱われている Data Gear を抽象的に表現した Meta Data Gear であり、実際の実装は別に定義する。 -Interface の実装は、 Interface で定義された Code Gear の変数に実装した Code Gear を代入することで行う。 +Interface はあくまでも、 ある Data Gear に対しての振る舞いとなる Code Gear とその Code Gear で扱われている Data Gear を抽象的に表現した Meta Data Gear であり、実装は別に定義する。 +Interface の実装は、 実装する Data Gear の初期化と実装した Code Gear を Interface で定義した Code Gear に代入することで行う。 この代入する Code Gear を入れ替えることで振る舞いは同じで処理は別の実装を複数表現することが出来る。 +また、実装された Code Gear は引数の Data Gear と 実装した Data Gear 以外にアクセスすることはない。 -実装された Code Gear は引数の Data Gear、実際に実装した Data Gear 以外にアクセスすることはない。 -また Interface で定義された API の Code Gear 以外の Code Gear も実装には定義出来る。 +Interface で定義された API の Code Gear 以外の Code Gear も実装することが出来る。 この Code Gear は Java の private メソッドのように扱われる。 -そのため、外から呼ぶのではなく、 Interface で定義された Code Gear から呼ばれる。 +そのため、外から呼ぶのではなく、Interface で定義された Code Gear から呼ばれる。 この Code Gear も外から渡された Data Gear に自由にアクセス出来る。 \coderef{singleLinkedQueue} は Queue Interface(\coderef{queueInterface}) を用いた SingleLinkedQueue の実装である。 -createSingleLinkedQueue(\coderef{singleLinkedQueue} 3-14 行目) は Queue Interface を実装した Data Gear の生成を行っている関数であり、 データ構造の初期化と実装した Code Gear の番号(enum)を Queue Interface で定義している Code Gear を示す変数に入れる(\coderef{singleLinkedQueue} 9-12行目)。 +Interface で実装した Data Gear の生成は関数呼び出しで行われる。 +\coderef{singleLinkedQueue} では 3-14行目のcreateSingleLinkedQueue 関数 で Data Gear の生成を行っている。 +この関数は生成する Data Gear の初期化(\coderef{singleLinkedQueue} 7-8行目)と、 実装した Code Gear を Interface で定義した Code Gear の代入(\coderef{singleLinkedQueue} 9-12行目)を行う。 +実際に実装する Data Gear(\coderef{singleLinkedQueue} の場合 SingleLinkedQueue) は Interface の型に包まれて生成される(\coderef{singleLinkedQueue} 6行目)。 +このように生成することで実装した Data Gear は実装以外の場所からは Interface の型として扱う事ができる。 \lstinputlisting[caption=SingleLinkedQueue の実装, label=code:singleLinkedQueue]{./src/singleLinkedQueue.cbc} \section{Interface を利用した Code Gear の継続} -Interface での Code Gear 呼び出しは ``goto interface-\textgreater method'' という構文で行う。 -ここの interface は createSingleLinkedQueue(\coderef{singleLinkedQueue} 3-14 行目) 等で初期化を行った Interface へのポインタ、method は実装した Code Gear の番号になる。 +Gears OS では Interface を利用した Code Gear の継続用に ``goto interface-\textgreater method'' という構文を提供している。 +Interface を実装した Data Gear は外からは Interface の型として扱われる。 +そのため構文の``interface`` は実装した Data Gear を Interface の型で包んだポインタ、method は実装した Code Gear に対応する。 \coderef{singleLinkedQueueTest} に Queue Interface を使用した Code Gearの呼び出し例を示す。 この呼び出しでは SingleLinkedQueue の put 実装に継続される。 @@ -82,8 +87,18 @@ \lstinputlisting[caption=Queue Interface での Code Gear の呼び出し, label=code:singleLinkedQueueTest]{./src/singleLinkedQueueTest.cbc} \coderef{singleLinkedQueueTest} は実際にはスクリプトによって \coderef{singleLinkedQueueTest_script} に変換されコンパイルされる。 +\coderef{singleLinkedQueueTest_script} でのデータの流れは \figref{goto_interface} のようになる。 + \coderef{singleLinkedQueueTest_script} 内の Gearef マクロは Context から Interface の引数格納用の Data Gear を取り出す。 この引数格納用の Data Gear は Context の初期化の際に生成される。 引数格納用の Data Gear を取り出した後は変換前の呼び出しの引数を Interface で定義した Code Gear の引数情報に合わせて格納し、指定した Code Gear に継続する。 \lstinputlisting[caption=スクリプトによる変換後, label=code:singleLinkedQueueTest_script]{./src/singleLinkedQueueTest_script.cbc} + +\begin{figure}[htbp] + \begin{center} + \includegraphics[scale=0.6]{./fig/gotoInterface.pdf} + \end{center} + \caption{Queue Interface で実装した put Code Gear の呼び出し} + \label{fig:goto_interface} +\end{figure}
--- a/paper/src/metaCreateTask.cbc Mon Jan 29 19:33:44 2018 +0900 +++ b/paper/src/metaCreateTask.cbc Tue Jan 30 04:48:12 2018 +0900 @@ -32,7 +32,7 @@ // set TaskManager->spawns parameter Gearef(context, TaskManager)->taskList = context->taskList; - Gearef(context, TaskManager)->next1 = C_createTask1; + Gearef(context, TaskManager)->next1 = C_code2; goto meta(context, C_code2); }
--- a/paper/src/parGotoCreateTask.cbc Mon Jan 29 19:33:44 2018 +0900 +++ b/paper/src/parGotoCreateTask.cbc Tue Jan 30 04:48:12 2018 +0900 @@ -1,4 +1,4 @@ -__code createTask(Integer *integer1, Integer * integer2, Integer *output, __code next(...)) { +__code code1(Integer *integer1, Integer * integer2, Integer *output) { par goto add(integer1, integer2, output, __exit); - goto next(...); + goto code2(); }