Mercurial > hg > Papers > 2021 > anatofuz-master
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 あくまで雛形生成スクリプトはプログラマ支援であるため、 いくつかの手動での実装は許容している。 |