changeset 26:905910e9fb04

interface
author matac42 <matac@cr.ie.u-ryukyu.ac.jp>
date Tue, 16 Jan 2024 17:17:25 +0900
parents ff89b92c159f
children f4b076177b9a
files Paper/master_paper.lol Paper/master_paper.pdf Paper/master_paper.tex Paper/src/SingleLinkedQueue.cbc
diffstat 4 files changed, 44 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/Paper/master_paper.lol	Fri Jan 12 20:06:21 2024 +0900
+++ b/Paper/master_paper.lol	Tue Jan 16 17:17:25 2024 +0900
@@ -2,5 +2,5 @@
 \contentsline {lstlisting}{\numberline {3.1}Queueのインターフェース}{12}{}%
 \contentsline {lstlisting}{\numberline {3.2}Interfaceの呼び出し}{13}{}%
 \contentsline {lstlisting}{\numberline {3.3}Queueのインターフェース}{13}{}%
-\contentsline {lstlisting}{\numberline {6.1}CopyRedBlackTreeの実装}{24}{}%
-\contentsline {lstlisting}{\numberline {6.2}CopyRedBlackTreeのアルゴリズム}{26}{}%
+\contentsline {lstlisting}{\numberline {6.1}CopyRedBlackTreeの実装}{25}{}%
+\contentsline {lstlisting}{\numberline {6.2}CopyRedBlackTreeのアルゴリズム}{27}{}%
Binary file Paper/master_paper.pdf has changed
--- a/Paper/master_paper.tex	Fri Jan 12 20:06:21 2024 +0900
+++ b/Paper/master_paper.tex	Tue Jan 16 17:17:25 2024 +0900
@@ -277,23 +277,23 @@
   \label{fig:context}
 \end{figure}
 
-\section{モジュール化の仕組みinterface}
+\section{モジュール化の仕組みInterface}
 
-Gears OSにはモジュール化の仕組みであるinterfaceという概念が存在する.
+Gears OSにはモジュール化の仕組みであるInterfaceという概念が存在する.
 モジュール化とはJavaのクラスのように複数のメソッドや属性を1つの機能として
 まとめて記述することである.
-GearsOSではinterfaceによって,DataGearやCodeGearを複数まとめてモジュール化する.
-interfaceは仕様と実装を分けて記述する.
-例としてqueue interfaceの仕様記述部分をソースコード\ref{src:Queue.h}に示す.
+GearsOSではInterfaceによって,DataGearやCodeGearを複数まとめてモジュール化する.
+Interfaceは仕様と実装を分けて記述する.
+例としてQueue Interfaceの仕様記述部分をソースコード\ref{src:Queue.h}に示す.
 
 \lstinputlisting[label=src:Queue.h, caption=Queueのインターフェース]{src/Queue.h}
 
-interfaceの仕様はC言語の構造体定義の形で記述する.
+Interfaceの仕様はC言語の構造体定義の形で記述する.
 2,3行目はDataGearを記述しており,DataGearは\texttt{union Data*}型で表現する.
-ここにはinterfaceにおいて,CodeGearが使用するDataGearを列挙する.
-5行目から10行目まではCodeGearの型を記述しており,\texttt{\_\_code}型で表現する.
-ここに列挙したCodeGearはinterfaceのAPIとして機能する.
-interfaceのAPIの呼び出し例をソースコード\ref{exinterface}に示す.
+ここにはInterfaceにおいて,CodeGearが使用するDataGearを列挙する.
+5行目から10行目まではCodeGearの引数型を記述しており,\texttt{\_\_code}型で表現する.
+ここに列挙したCodeGearはInterfaceのAPIとして機能する.
+InterfaceのAPIの呼び出し例をソースコード\ref{exinterface}に示す.
 
 \begin{lstlisting}[label=exinterface,frame=lrbt,caption={Interfaceの呼び出し}]
   __code odgCommitCPUWorker3(struct CPUWorker* worker, struct Context* task) {
@@ -303,7 +303,7 @@
   }
 \end{lstlisting}
 
-4行目でgotoによってqueue interfaceのtake CodeGearに継続するよう記述している.
+4行目でgotoによってqueue Interfaceのtake CodeGearに継続するよう記述している.
 takeのinputDataGearにはodgCommitCPUWorker4 CodeGearを指定している.
 ソースコード\ref{src:Queue.h}の仕様記述ではtakeにはqueue,data,nextがinputDataGearの型として指定されている.
 しかし,実際に呼び出す際にはnextに当たるodgCommitCPUWorker4のみを渡している.
@@ -318,11 +318,31 @@
 GearsOSでgotoする際は実際にはContextから必要な値を取り出す.
 よって,\texttt{...}は必要な値をContextから取り出すことを意味している.
 
-次にinterfaceの実装似ついて説明する.
-Queue interfaceの実装の一つであるSingleLinkedQueueをソースコード\ref{src:SingleLinkedQueue.cbc}に示す.
+次にInterfaceの実装について説明する.
+Queue Interfaceの実装の1つであるSingleLinkedQueueをソースコード\ref{src:SingleLinkedQueue.cbc}に示す.
 
 \lstinputlisting[label=src:SingleLinkedQueue.cbc, caption=Queueのインターフェース]{src/SingleLinkedQueue.cbc}
 
+3行目の\texttt{\#impl as}はInterfaceの実装を記述する際に指定する.
+implの直後に実装したいInterfaceの仕様を指定し,
+asの後ろには実装の型名を記述する.
+であるから,\texttt{\#impl "Queue.h" as "SingleLinkedQueue.h"}は仕様Queueの実装を
+SingleLinkedQueueとして定義することになる.
+7行目の\texttt{createSingleLinkedQueue}はSingleLinkedQueueのコンストラクタを定義しており,
+DataGearのアロケートやCodeGearを保持するメソッドの初期化を行っている.
+8,9行目ではnewでアロケートを行っている.
+アロケートのようなメタレベルの処理はノーマルレベルには記述されない.
+そのためこのnewはC言語のnewとは違うGearsOS独自の記述であり,
+実際にはメタレベルにアロケートを行う処理を挿入している.
+10〜16行目ではSingleLinkedQueueで使用するCodeGearとDataGearを
+queueのメソッドとしてセットしている.
+CodeGearはQueueの仕様で記述したCodeGearと一致している.
+\texttt{C\_}で始まる記述にはenum CodeにおけるCodeGearの整数を格納している.
+CodeGearはenum Codeで整数と対応付けられており,
+この整数を元にCodeGearが参照される.
+20行目以降では\texttt{putSingleLinkedQueue}や\texttt{takeSingleLinkedQueue}
+のように,仕様で記述されたCodeGearを実装している.
+
 
 \section{GearsOSのRedBlackTree}
 
--- a/Paper/src/SingleLinkedQueue.cbc	Fri Jan 12 20:06:21 2024 +0900
+++ b/Paper/src/SingleLinkedQueue.cbc	Tue Jan 16 17:17:25 2024 +0900
@@ -19,6 +19,15 @@
 
 //  ~~省略~~
 
+__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(...);
+}
+
 __code takeSingleLinkedQueue(struct SingleLinkedQueue* queue, __code next(union Data* data, ...)) {
     printf("take\n");
     struct Element* top = queue->top;