annotate 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
parents 86c42a4c8a0d
children 95dfc1e2622a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
1 \chapter{GearsOSのトランスコンパイラ}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
2
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
3 GearsOSはCbCで実装を行う。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
4 CbCはC言語よりアセンブラに近い言語であるため、 すべてを純粋なCbCで記述しようとすると記述量が膨大になってしまう。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
5 またノーマルレベルの計算とメタレベルの計算を、全てプログラマが記述する必要が発生してしまう。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
6 メタ計算では値の取り出しなどを行うが、 これはノーマルレベルのCodeGearのAPIが決まれば一意に決定される。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
7 したがってノーマルレベルのみ記述すれば、 機械的にメタ部分の処理は概ね生成可能となる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
8 また、メタレベルのみ切り替えたいなどの状況が存在する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
9 ノーマルレベル、メタレベル共に同じコードの場合は記述の変更量が膨大であるが、 メタレベルの作成を分離するとこの問題は解消される。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
11 GearsOSではメタレベルの処理の作成にPerlスクリプトを用いており、 ノーマルレベルで記述されたCbCから、 メタ部分を含むCbCへと変換する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
12 変換前のCbCをGearsCbCと呼ぶ。
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
8
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
14 \section{トランスコンパイラ}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
15 プログラミング言語から実行可能ファイルやアセンブラを生成する処理系のことを、一般的にコンパイラと呼ぶ。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
16 特定のプログラミング言語から別のプログラミング言語に変換するコンパイラのことを、 トランスコンパイラと呼ぶ。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
17 トランスコンパイラとしてはJavaScriptを古い規格のJavaScriptに変換するBabel\cite{babel}がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
18
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
19 またトランスコンパイラは、変換先の言語を拡張した言語の実装としても使われる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
20 JavaScriptに強い型制約をつけた拡張言語であるTypeScriptは、 TypeScriptから純粋なJavaScriptに変換を行うトランスコンパイラである。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
21 すべてのTypeScriptのコードはJavaScriptにコンパイル可能である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
22 JavaScriptに静的型の機能を取り込みたい場合に使われる言語であり、 JavaScriptの上位の言語と言える。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
23
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
24 GearsOSはCbCを拡張した言語となっている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
25 ただしこの拡張自体はCbCコンパイラであるgcc、 llvm/clangには搭載されていない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
26 その為GearsOSの拡張部分を、等価な純粋なCbCの記述に変換する必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
27 現在のGearsOSでは、 CMakeによるコンパイル時にPerlで記述された\texttt{generate\_stub.pl}と\texttt{generate\_context.pl}の2種類のスクリプトで変換される。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
28
12
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
29 \begin{itemize}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
30 \item \texttt{generate\_stub.pl}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
31 \begin{itemize}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
32 \item 各CbCファイルごとに呼び出されるスクリプト
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
33 \item 対応するメタ計算を導入したCbCファイル(拡張子はc)に変換する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
34 \end{itemize}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
35 \item \texttt{generate\_context.pl}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
36 \begin{itemize}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
37 \item 生成したCbCファイルを解析し、使われているCodeGear、DataGearを確定する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
38 \item これらの情報をもとにContext及びContext関係の初期化ルーチン、APIを作成する
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
39 \end{itemize}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
40 \end{itemize}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
41
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
42 これらのPerlスクリプトはプログラマが自分で動かすことはない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
43 GearsOSでプログラミングする際は、ビルドしたいプロジェクトをCMakeLists.txtに記述し、 移行はCMakeのビルドに移譲する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
44 CMakeはMakefileやNinja fileを生成し実際にビルドを行うのはmakeやninja-buildとなっている。
8
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
45
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
46 \section{GearsCbCのInterfaceの実装時の問題}
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 Interfaceとそれを実装するImplの型が決定すると、最低限満たすべきCodeGearのAPIは一意に決定する。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 ここで満たすべきCodeGearは、Interfaceで定義したCodeGearと、 Impl側で定義した privateなCodeGearとなる。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 例えばStack Interfaceの実装を考えると、各Implで\texttt{pop}, push, shift, isEmptyなどを実装する必要がある。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 従来はプログラマが手作業でヘッダーファイルの定義を参照しながら\texttt{.cbc}ファイルを作成していた。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 手作業での実装のため、 コンパイル時に次のような問題点が多発した。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 \begin{itemize}
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 \item CodeGearの入力のフォーマットの不一致
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 \item Interfaceの実装のCodeGearの命名規則の不一致
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 \item 実装を忘れているCodeGearの発生
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 \end{itemize}
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 特にGearsOSの場合はPerlスクリプトによって純粋なCbCに一度変換されてからコンパイルが行われる。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 実装の状況とトランスコンパイラの組み合わせによっては、 CbCコンパイラレベルでコンパイルエラーを発生させないケースがある。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 この場合は実際に動作させながら、gdb, lldbなどのCデバッガを用いてデバッグをする必要がある。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 またCbCコンパイラレベルで検知できても、すでに変換されたコード側でエラーが出てしまうので、トランスコンパイラの挙動をトレースしながらデバッグをする必要がある。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 Interfaceの実装が不十分であることのエラーは、 GearsOSレベル、最低でもCbCコンパイラのレベルで完全に検知したい。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
68 \section{Interfaceを満たすコード生成の他言語の対応状況}
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 Interfaceを機能として所持している言語の場合、これらはコンパイルレベルか実行時レベルで検知される。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 例えばJavaの場合はInterfaceを満たしていない場合はコンパイルエラーになる。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 InterfaceのAPIを完全に実装するのを促す仕組みとして、Interfceの定義からエディタやツールが満たすべき関数と引数の組を自動生成するツールがある。
6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
75
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
76 Javaでは様々な手法でこのツールを実装している。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
77 Microsoftが提唱しているIDEとプログラミング言語のコンパイラをつなぐプロトコルにLanguage Serverがある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
78 Language Serverはコーディング中のソースコードをコンパイラ自身でパースし、 型推論やエラーの内容などをIDE側に通知するプロトコルである。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
79 主要なJavaのLanguage Serverの実装であるeclipse.jdt.ls\cite{eclipse.jdt.ls}では、 LanguageServerの機能として未実装のメソッドを検知する機能が実装されている。\cite{eclipse.jdt.pull322}
8
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
80 この機能を応用してvscode上から未実装のメソッドを特定し、 雛形を生成する機能がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
81 他にもIntelliJ IDEなどの商用IDEでは、 IDEが独自に未実装のメソッドを検知、雛形を生成する機能を実装している。
6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
82
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
83
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 golangの場合は主に\texttt{josharian/impl}\cite{golang_impl}が使われている。
6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
85 これはインストールすると\texttt{impl}コマンドが使用可能になり、 実装したいInterfaceの型と、 Interfaceを実装するImplの型(レシーバ)を与えることで雛形が生成される。
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 主要なエディタであるvscodeのgolangの公式パッケージである\texttt{vscode-go}\cite{vscode-go}でも導入されており、 vscodeから呼び出すことが可能である。
6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
87 vscode以外にもvimなどのエディタから呼び出すことや、 シェル上で呼び出して標準出力の結果を利用することが可能である。
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
89 \section{GearsOSでのInterfaceを満たすCbCの雛形生成}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
90
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91
4
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
92 GearsOSでも同様のプログラマ支援ツールを導入したい。
6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
93 LanguageServerの導入も考えられるが、 今回の場合はC言語のLanguageServerをCbC用にまず改良し、 さらにGearsOS用に書き換える必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
94 現状のGearsOSが持つシンタックスはCbCのシンタックスを拡張しているものではあるが、これはCbCコンパイラ側には組み込まれていない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
95 LanguageServerをGearsOSに対応する場合、 CbCコンパイラ側にGearsOSの拡張シンタックスを導入する必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
96 CbCコンパイラ側への機能の実装は、 比較的難易度が高いと考えらる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
97 CbCコンパイラ側に手をつけず、 Interfaceの入出力の検査は既存のGearsOSのビルドシステム上に組み込みたい。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
98
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
99 対してgolangの\texttt{impl}コマンドのように、 シェルから呼び出し標準出力に結果を書き込む形式も考えられる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
100 この場合は実装が比較的容易かつ、 コマンドを呼び出して標準出力の結果を使えるシェルやエディタなどの各プラットフォームで使用可能となる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
101 先行事例を参考に、コマンドを実行して雛形ファイルを生成するスクリプトをGearsOSに導入した。
4
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
102
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
103
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 Interfaceでは入力の引数がImplと揃っている必要があるが、 第一引数は実装自身のインスタンスがくる制約となっている。
4
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
105 実装自身の型は、Interface定義時には不定である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
106 その為、 GearsOSではInterfaceのAPIの宣言時にデフォルト型変数\texttt{Impl}を実装の型として利用する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
107 デフォルト型\texttt{Impl}を各実装の型に置換することで自動生成が可能となる。
6
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
108
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
109
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
110 実装すべきCodeGearはInterfaceとImpl側の型を見れば定義されている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
111 \texttt{\_\_code}で宣言されているものを逐次生成すればよいが、 継続として呼び出されるCodeGearは具体的な実装を持たない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
112 GearsOSで使われているInterfaceには概ね次の継続である\texttt{next}が登録されている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
113 \texttt{next}そのものはInterfaceを呼び出す際に、入力として与える。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
114 その為各Interfaceに入力として与えられた\texttt{next}を保存する場所は存在するが、 nextそのものの独自実装は各Interfaceは所持しない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
115 したがってこれをInterfaceの実装側で明示的に実装することはできない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
116 雛形生成の際に、入力として与えられるCodeGearを生成してしまうと、プログラマに混乱をもたらしてしまう。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
117
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
118 入力として与えられているCodeGearは、Interfaceに定義されているCodeGearの引数として表現されている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
119 コードに示す例では、\texttt{whenEmpty}は入力して与えられているCodeGearである。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
120 雛形を生成する場合は、入力として与えられたCodeGearを除外して出力を行う。
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
121 順序はInterfaceをまず出力した後に、 Impl側を出力する。
7
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
122
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
123 雛形生成では他にコンストラクタの生成も行う。
9
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
124 GearsOSのInterfaceのコンストラクタは、 メモリの確保及び各変数の初期化を行う。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
125 メモリ上に確保するのは主にInterfaceとImplのそれぞれが基本となっている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
126 Interfaceによっては別のDataGearを内包しているものがある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
127 その場合は別のDataGearの初期化もコンストラクタ内で行う必要があるが、 自動生成コマンドではそこまでの解析は行わない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
128
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
129
12
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
130 コンストラクタのメンバ変数はデフォルトでは変数は0、ポインタの場合はNULLで初期化するように生成する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
131 このスクリプトで生成されたコンストラクタを使う場合、 CbCファイルから該当する部分を削除すると、\texttt{generate\_stub.pl}内でも自動的に生成される。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
132 自動生成機能を作成すると1CbCファイルあたりの記述量が減る利点がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
133
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
134 明示的にコンストラクタが書かれていた場合は、 Perlスクリプト内での自動生成は実行しないように実装した。
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
135 これはオブジェクト指向言語のオーバーライドに相当する機能と言える。
12
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
136 現状のGearsOSで使われているコンストラクタは、 基本は\texttt{struct Context*}型の変数のみを引数で要求している。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
137 しかしオブジェクトを識別するためにIDを実装側に埋め込みたい場合など、 コンストラクタ経由で値を代入したいケースが存在する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
138 この場合はコンストラクタの引数を増やす必要や、 受け取った値をインスタンスのメンバに書き込む必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
139 具体的にどの値を書き込めば良いのかまではPerlスクリプトでは判定することができない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
140 このような細かな調整をする場合は、 generate\_stub.pl側での自動生成はせずに、 雛形生成されたコンストラクタを変更すれば良い。
10
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
141 あくまで雛形生成スクリプトはプログラマ支援であるため、 いくつかの手動での実装は許容している。