comparison paper/chapter/02-perl.tex @ 12:db147ba02e22

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Thu, 28 Jan 2021 11:43:40 +0900 (2021-01-28)
parents 86c42a4c8a0d
children 95dfc1e2622a
comparison
equal deleted inserted replaced
11:e703b90a5a16 12:db147ba02e22
24 GearsOSはCbCを拡張した言語となっている。 24 GearsOSはCbCを拡張した言語となっている。
25 ただしこの拡張自体はCbCコンパイラであるgcc、 llvm/clangには搭載されていない。 25 ただしこの拡張自体はCbCコンパイラであるgcc、 llvm/clangには搭載されていない。
26 その為GearsOSの拡張部分を、等価な純粋なCbCの記述に変換する必要がある。 26 その為GearsOSの拡張部分を、等価な純粋なCbCの記述に変換する必要がある。
27 現在のGearsOSでは、 CMakeによるコンパイル時にPerlで記述された\texttt{generate\_stub.pl}と\texttt{generate\_context.pl}の2種類のスクリプトで変換される。 27 現在のGearsOSでは、 CMakeによるコンパイル時にPerlで記述された\texttt{generate\_stub.pl}と\texttt{generate\_context.pl}の2種類のスクリプトで変換される。
28 28
29 \begin{itemize}
30 \item \texttt{generate\_stub.pl}
31 \begin{itemize}
32 \item 各CbCファイルごとに呼び出されるスクリプト
33 \item 対応するメタ計算を導入したCbCファイル(拡張子はc)に変換する
34 \end{itemize}
35 \item \texttt{generate\_context.pl}
36 \begin{itemize}
37 \item 生成したCbCファイルを解析し、使われているCodeGear、DataGearを確定する
38 \item これらの情報をもとにContext及びContext関係の初期化ルーチン、APIを作成する
39 \end{itemize}
40 \end{itemize}
41
42 これらのPerlスクリプトはプログラマが自分で動かすことはない。
43 GearsOSでプログラミングする際は、ビルドしたいプロジェクトをCMakeLists.txtに記述し、 移行はCMakeのビルドに移譲する。
44 CMakeはMakefileやNinja fileを生成し実際にビルドを行うのはmakeやninja-buildとなっている。
29 45
30 \section{GearsCbCのInterfaceの実装時の問題} 46 \section{GearsCbCのInterfaceの実装時の問題}
31 47
32 Interfaceとそれを実装するImplの型が決定すると、最低限満たすべきCodeGearのAPIは一意に決定する。 48 Interfaceとそれを実装するImplの型が決定すると、最低限満たすべきCodeGearのAPIは一意に決定する。
33 ここで満たすべきCodeGearは、Interfaceで定義したCodeGearと、 Impl側で定義した privateなCodeGearとなる。 49 ここで満たすべきCodeGearは、Interfaceで定義したCodeGearと、 Impl側で定義した privateなCodeGearとなる。
109 メモリ上に確保するのは主にInterfaceとImplのそれぞれが基本となっている。 125 メモリ上に確保するのは主にInterfaceとImplのそれぞれが基本となっている。
110 Interfaceによっては別のDataGearを内包しているものがある。 126 Interfaceによっては別のDataGearを内包しているものがある。
111 その場合は別のDataGearの初期化もコンストラクタ内で行う必要があるが、 自動生成コマンドではそこまでの解析は行わない。 127 その場合は別のDataGearの初期化もコンストラクタ内で行う必要があるが、 自動生成コマンドではそこまでの解析は行わない。
112 128
113 129
114 コンストラクタはデフォルトでは変数は0、またはNULLで初期化される。 130 コンストラクタのメンバ変数はデフォルトでは変数は0、ポインタの場合はNULLで初期化するように生成する。
115 このスクリプトで生成されたコンストラクタは\texttt{generate\_stub.pl}内でも自動的に生成することが可能である。 131 このスクリプトで生成されたコンストラクタを使う場合、 CbCファイルから該当する部分を削除すると、\texttt{generate\_stub.pl}内でも自動的に生成される。
116 しかし明示的にコンストラクタが書かれていた場合は、 Perlスクリプト内での自動生成は実行しないようになっている。 132 自動生成機能を作成すると1CbCファイルあたりの記述量が減る利点がある。
133
134 明示的にコンストラクタが書かれていた場合は、 Perlスクリプト内での自動生成は実行しないように実装した。
117 これはオブジェクト指向言語のオーバーライドに相当する機能と言える。 135 これはオブジェクト指向言語のオーバーライドに相当する機能と言える。
118 いくつかのInterfaceでは入力にContext以外のものを要求しており、こういった引数のAPIを変更する際もオーバーライドする必要がある。 136 現状のGearsOSで使われているコンストラクタは、 基本は\texttt{struct Context*}型の変数のみを引数で要求している。
137 しかしオブジェクトを識別するためにIDを実装側に埋め込みたい場合など、 コンストラクタ経由で値を代入したいケースが存在する。
138 この場合はコンストラクタの引数を増やす必要や、 受け取った値をインスタンスのメンバに書き込む必要がある。
139 具体的にどの値を書き込めば良いのかまではPerlスクリプトでは判定することができない。
140 このような細かな調整をする場合は、 generate\_stub.pl側での自動生成はせずに、 雛形生成されたコンストラクタを変更すれば良い。
119 あくまで雛形生成スクリプトはプログラマ支援であるため、 いくつかの手動での実装は許容している。 141 あくまで雛形生成スクリプトはプログラマ支援であるため、 いくつかの手動での実装は許容している。