comparison delta.tex @ 31:d0d14c0a795b

Add examples of meta computation for program modification
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Thu, 12 Feb 2015 14:34:35 +0900
parents 67d79c18a276
children fc864841ab90
comparison
equal deleted inserted replaced
30:67d79c18a276 31:d0d14c0a795b
135 なお、中置関数 \verb/>>=/ で用いたコンストラクタによる処理の分岐はパターンマッチと呼ばれる。 135 なお、中置関数 \verb/>>=/ で用いたコンストラクタによる処理の分岐はパターンマッチと呼ばれる。
136 Haskell ではコンストラクタごとに関数を記述することでパターンマッチを実現する。 136 Haskell ではコンストラクタごとに関数を記述することでパターンマッチを実現する。
137 137
138 % }}} 138 % }}}
139 139
140 % {{{ Delta を用いたプログラムの変更の記述例 140 % {{{ Delta Monad を用いたプログラムの変更の記述例
141 141
142 \section{Delta を用いたプログラムの変更の記述例} 142 \section{Delta Monad を用いたプログラムの変更の記述例}
143 \label{section:delta_example}
143 プログラムの変更を表現するメタ計算に対応するデータ型 Delta が記述できた。 144 プログラムの変更を表現するメタ計算に対応するデータ型 Delta が記述できた。
144 145
145 実際に Haskell で Delta を用いたプログラムの変更例をリスト\ref{src:delta_example}に示す。 146 実際に Haskell で Delta を用いたプログラムの変更例をリスト\ref{src:delta_example}に示す。
146 147
147 \begin{table}[html] 148 \begin{table}[html]
205 \end{center} 206 \end{center}
206 \end{figure} 207 \end{figure}
207 208
208 % }}} 209 % }}}
209 210
211 % プログラムの変更に対するメタ計算の例 {{{
212
210 \section{プログラムの変更に対するメタ計算の例} 213 \section{プログラムの変更に対するメタ計算の例}
214 \label{section:delta_merit}
215 \ref{section:delta_example}節ではプログラムの変更に対して、変更前と変更後の挙動を保存した例を述べた。
216 \ref{section:delta_merit}節ではプログラムの変更に対するメタ計算の例を述べる。
217
218 まず最初に挙げられるものがプログラムの変更を保存するメタ計算である。
219 これは Delta Monad として実際に定義できた。
220 プログラムの変更を保存した場合、以下のような方法により信頼性の向上が見込めると考える。
221
222 \begin{itemize}
223
224 \item 異なるバージョンを同時に実行する
225
226 プログラムの変更列から任意のバージョン2つを取り出し、同時に実行するプログラムを構成する。
227 プログラムを同時に実行することで以下のようなメリットがある。
228 なお、任意の要素の組み合せは category において product として表現されるため、 product と対応があると考えている。
229
230 \begin{itemize}
231 \item 実行系とサブの実行系を実行することができる。
232
233 例えば、あるバージョンでリリースしたプログラムがあるとする。
234 変更を加え、ベータ版としてリリースしたいが動作が不安定である。
235 そこで、リリースしたプログラムからベータ版への変更から、2つのプログラムが同時に動くようなプログラムを構築する。
236 見掛け上は安定版として動作するが、安定版の実際の入出力を用いてベータ版をテストすることが可能となる。
237
238 \item バージョン依存のプロトコル間で互換を持つようなプログラムが作成できる
239
240 異なるバージョン間でプロトコルに互換が無いプログラムを考える。
241 バージョン間の互換を含めてメタ計算として定義し、全てのバージョンに対して互換を持つプログラムを構築する。
242 そうすることによりどのバージョンのプロトコルとも互換を持つような変換器を作成できる。
243
244 \end{itemize}
245
246 \item バージョン間の動作の比較
247
248 プログラムの各バージョンにつき、挙動を示すユニークなトレースが得られるとする。
249 トレースの比較をすることでバージョン間の動作を比較することができる。
250 トレースの比較により以下のようなものを検出できると考えている。
251
252 \begin{itemize}
253 \item 過去のバージョンの挙動を破壊する時を検出する
254
255 プログラムの変更の際、トレースを変えてはいけない部分が存在するとする。
256 変更の際にトレースが変更したことを検出することにより、トレースが保存される変更のみを受けつけるようにする。
257
258 \item トレースが変化していないことを確認する
259
260 プログラムの変更にはいくつかの種類がある。
261 例えば機能拡張の変更などであればトレースは変化するのが正しい。
262 しかしリファクタリングではプログラムが変更されてもトレースが変わらないのが望ましい。
263 トレース全体が変わらないような変更のみを受けつけることにより、リファクタリングを支援することができる。
264 \end{itemize}
265
266 \item Version Control System との対応
267
268 全ての変更を保存し、任意のバージョンを生成可能であるようなメタ計算を考える。
269 そうした時、プログラムの変更を蓄積するものは git や mercurial といった Version Control System の Repository に相当すると考えられる。
270 Delta により Repository を定義することがでるのならば、 branch や merge といった Version Control System の処理に対して形式的な定義を与えることができる。
271 また、 category における colimit と対応があると考えている。
272
273 \item 変更単位を用いた処理
274
275 変更を適用する際に、特定の処理を実行することもできる。
276 例えばプログラムの変更単位に対してテストを行なうことで、変更に応じてテストの結果の変動が確認できる。
277 プログラム全体に対応するテストを定義し、変更の際にテストが通る変更のみ受け付けるようにすることでテストベースの信頼性を確保できる。
278 \end{itemize}
279
280 他にもプログラムの変更そのものを処理するプログラムを定義することもできる。
281 この機構を言語処理系に組込むことにより、プログラムの変更方法も言語の仕様に含めることができる。
282 例えば、プログラムの変更は許可されたオペレーション内で行なうといった制約を含めることが可能となる。
283 さらにユーザによりプログラムの変更に対するメタ計算を自由に定義できるような言語処理系を作るとする。
284 その処理系ではこれまでに挙げた全てのメタ計算の例から使いたい機能を選んだり自分で追加することが可能となる。
285
286 このように、プログラムの変更を形式化することで多くのメタ計算が扱えるようになる。
287 さらに、メタ計算の内容によっては信頼性の向上に用いたり変更も含めた上でプログラムを作成することが可能になる。
288
289 % }}}