comparison paper/chapter/04-interface.tex @ 82:3fb7c17d8e91

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 05 Feb 2021 09:53:09 +0900
parents 9974be9e2d1c
children 88ae1e4d83c6
comparison
equal deleted inserted replaced
81:9974be9e2d1c 82:3fb7c17d8e91
124 124
125 \subsection{Gears::Interfaceの構成} 125 \subsection{Gears::Interfaceの構成}
126 126
127 127
128 \section{Interfaceの実装のCbCファイルへの構文の導入} 128 \section{Interfaceの実装のCbCファイルへの構文の導入}
129 今までのGearsOSではマクロに似た\texttt{\#interface}構文で使用するInterfce名を指定した。
130 しかしInterfaceを実装する場合も、 InterfaceのAPIを利用する際も同じシンタックスであった。
131 この2つは意味が異なっている為、 シンタックスを分離したい。
132 Implementの型定義ファイルを導入したので、Interfaceの実装をする場合に別のシンタックスを導入する。
133
134
135 導入された構文をソースコード\ref{src:implHeader}に示す。
136 この例ではStack Interfaceの実装としてSingleLinkedStackを定義する宣言である。
137
138 Implementの宣言の構文では、 まず\texttt{\#impl}の後ろに実装したいIntefaceの名前を入れる。
139 続く\texttt{for}キーワードの後ろに、 Implementの型名を記述する。
140 宣言はgenerate\_stub.plが読み取り、 変換した後のCbCファイルからは該当する行が削除される。
141 \lstinputlisting[label=src:implHeader, caption=Intefaceの実装をする際の宣言]{src/implHeader.h}
129 142
130 \section{GearsCbCのInterfaceの実装時の問題} 143 \section{GearsCbCのInterfaceの実装時の問題}
131 144
132 Interfaceとそれを実装するImplの型が決定すると、最低限満たすべきCodeGearのAPIは一意に決定する。 145 Interfaceとそれを実装するImplの型が決定すると、最低限満たすべきCodeGearのAPIは一意に決定する。
133 ここで満たすべきCodeGearは、Interfaceで定義したCodeGearと、 Impl側で定義した privateなCodeGearとなる。 146 ここで満たすべきCodeGearは、Interfaceで定義したCodeGearと、 Impl側で定義した privateなCodeGearとなる。
225 238
226 239
227 コンストラクタのメンバ変数はデフォルトでは変数は0、ポインタの場合はNULLで初期化するように生成する。 240 コンストラクタのメンバ変数はデフォルトでは変数は0、ポインタの場合はNULLで初期化するように生成する。
228 このスクリプトで生成されたコンストラクタを使う場合、 CbCファイルから該当する部分を削除すると、\texttt{generate\_stub.pl}内でも自動的に生成される。 241 このスクリプトで生成されたコンストラクタを使う場合、 CbCファイルから該当する部分を削除すると、\texttt{generate\_stub.pl}内でも自動的に生成される。
229 自動生成機能を作成すると1CbCファイルあたりの記述量が減る利点がある。 242 自動生成機能を作成すると1CbCファイルあたりの記述量が減る利点がある。
230 243 generate\_stub.pl内で作製する場合は、 すでにメタ情報を含むコードに書き換えたものを作製する。
244 その為厳密には同じコードを生成する訳ではない。
231 245
232 246
233 明示的にコンストラクタが書かれていた場合は、 Perlスクリプト内での自動生成は実行しないように実装した。 247 明示的にコンストラクタが書かれていた場合は、 Perlスクリプト内での自動生成は実行しないように実装した。
234 これはオブジェクト指向言語のオーバーライドに相当する機能と言える。 248 これはオブジェクト指向言語のオーバーライドに相当する機能と言える。
235 現状のGearsOSで使われているコンストラクタは、 基本は\texttt{struct Context*}型の変数のみを引数で要求している。 249 現状のGearsOSで使われているコンストラクタは、 基本は\texttt{struct Context*}型の変数のみを引数で要求している。
283 このローカル変数の型と、CodeGearの定義の引数の型が、完全に一致しているかどうかのチェックを行うと、さらに強固な引数チェックが可能となる。 297 このローカル変数の型と、CodeGearの定義の引数の型が、完全に一致しているかどうかのチェックを行うと、さらに強固な引数チェックが可能となる。
284 ただし引数で渡す際に、例えばint型の値の加算処理などを行っていると、その処理の結果がint型になっているかどうかをPerlレベルでチェックする必要が出てしまう。 298 ただし引数で渡す際に、例えばint型の値の加算処理などを行っていると、その処理の結果がint型になっているかどうかをPerlレベルでチェックする必要が出てしまう。
285 299
286 300
287 \section{InterfaceのAPIの未実装の検知} 301 \section{InterfaceのAPIの未実装の検知}
288 パースした結果、ヘッダファイルにAPIの定義がなかった場合は11行目の\texttt{unless}に処理が落ち、 エラー終了する。 302 InterfaceAPI呼び出し時に引数の数以外に、そもそも実装していないAPIを呼び出してしまうことがある。
303 この場合はCbCがPerlスクリプトによって変換された後でエラーが出る。
304 内容はCbCコンパイラのコンパイル時にInterfaceの構造体に、APIに対応するフィールドがないエラーである。
305 コンパイル時に発覚できるので問題ないが、 これも変換する前に発見したほうがデバッグが容易である。
306
307 API呼び出し時の処理は、ソースコード\ref{src:parsedArgs}の処理そのものであるため、この処理の中に未実装のAPIを検知する様にした。
308 呼び出し元のInterfaceの情報パースした結果、ヘッダファイルにAPIの定義がなかった場合は11行目の\texttt{unless}に処理が落ち、 エラー終了する。
309 これによってInterface呼び出しの問題が、 Perlスクリプトによって変換する前に検知可能になった。
289 310
290 \section{par goto のInterface経由の呼び出しの対応} 311 \section{par goto のInterface経由の呼び出しの対応}