Mercurial > hg > Papers > 2024 > matac-master
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}{}%
--- 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;