# HG changeset patch # User Yasutaka Higa # Date 1423719275 -32400 # Node ID d0d14c0a795bd7adfbf38206914f1d3407a15ec7 # Parent 67d79c18a276ccc788304645107305dc6ffd8207 Add examples of meta computation for program modification diff -r 67d79c18a276 -r d0d14c0a795b delta.tex --- a/delta.tex Thu Feb 12 12:39:57 2015 +0900 +++ b/delta.tex Thu Feb 12 14:34:35 2015 +0900 @@ -137,9 +137,10 @@ % }}} -% {{{ Delta を用いたプログラムの変更の記述例 +% {{{ Delta Monad を用いたプログラムの変更の記述例 -\section{Delta を用いたプログラムの変更の記述例} +\section{Delta Monad を用いたプログラムの変更の記述例} +\label{section:delta_example} プログラムの変更を表現するメタ計算に対応するデータ型 Delta が記述できた。 実際に Haskell で Delta を用いたプログラムの変更例をリスト\ref{src:delta_example}に示す。 @@ -207,4 +208,82 @@ % }}} +% プログラムの変更に対するメタ計算の例 {{{ + \section{プログラムの変更に対するメタ計算の例} +\label{section:delta_merit} +\ref{section:delta_example}節ではプログラムの変更に対して、変更前と変更後の挙動を保存した例を述べた。 +\ref{section:delta_merit}節ではプログラムの変更に対するメタ計算の例を述べる。 + +まず最初に挙げられるものがプログラムの変更を保存するメタ計算である。 +これは Delta Monad として実際に定義できた。 +プログラムの変更を保存した場合、以下のような方法により信頼性の向上が見込めると考える。 + +\begin{itemize} + + \item 異なるバージョンを同時に実行する + + プログラムの変更列から任意のバージョン2つを取り出し、同時に実行するプログラムを構成する。 + プログラムを同時に実行することで以下のようなメリットがある。 + なお、任意の要素の組み合せは category において product として表現されるため、 product と対応があると考えている。 + + \begin{itemize} + \item 実行系とサブの実行系を実行することができる。 + + 例えば、あるバージョンでリリースしたプログラムがあるとする。 + 変更を加え、ベータ版としてリリースしたいが動作が不安定である。 + そこで、リリースしたプログラムからベータ版への変更から、2つのプログラムが同時に動くようなプログラムを構築する。 + 見掛け上は安定版として動作するが、安定版の実際の入出力を用いてベータ版をテストすることが可能となる。 + + \item バージョン依存のプロトコル間で互換を持つようなプログラムが作成できる + + 異なるバージョン間でプロトコルに互換が無いプログラムを考える。 + バージョン間の互換を含めてメタ計算として定義し、全てのバージョンに対して互換を持つプログラムを構築する。 + そうすることによりどのバージョンのプロトコルとも互換を持つような変換器を作成できる。 + + \end{itemize} + + \item バージョン間の動作の比較 + + プログラムの各バージョンにつき、挙動を示すユニークなトレースが得られるとする。 + トレースの比較をすることでバージョン間の動作を比較することができる。 + トレースの比較により以下のようなものを検出できると考えている。 + + \begin{itemize} + \item 過去のバージョンの挙動を破壊する時を検出する + + プログラムの変更の際、トレースを変えてはいけない部分が存在するとする。 + 変更の際にトレースが変更したことを検出することにより、トレースが保存される変更のみを受けつけるようにする。 + + \item トレースが変化していないことを確認する + + プログラムの変更にはいくつかの種類がある。 + 例えば機能拡張の変更などであればトレースは変化するのが正しい。 + しかしリファクタリングではプログラムが変更されてもトレースが変わらないのが望ましい。 + トレース全体が変わらないような変更のみを受けつけることにより、リファクタリングを支援することができる。 + \end{itemize} + + \item Version Control System との対応 + + 全ての変更を保存し、任意のバージョンを生成可能であるようなメタ計算を考える。 + そうした時、プログラムの変更を蓄積するものは git や mercurial といった Version Control System の Repository に相当すると考えられる。 + Delta により Repository を定義することがでるのならば、 branch や merge といった Version Control System の処理に対して形式的な定義を与えることができる。 + また、 category における colimit と対応があると考えている。 + + \item 変更単位を用いた処理 + + 変更を適用する際に、特定の処理を実行することもできる。 + 例えばプログラムの変更単位に対してテストを行なうことで、変更に応じてテストの結果の変動が確認できる。 + プログラム全体に対応するテストを定義し、変更の際にテストが通る変更のみ受け付けるようにすることでテストベースの信頼性を確保できる。 +\end{itemize} + +他にもプログラムの変更そのものを処理するプログラムを定義することもできる。 +この機構を言語処理系に組込むことにより、プログラムの変更方法も言語の仕様に含めることができる。 +例えば、プログラムの変更は許可されたオペレーション内で行なうといった制約を含めることが可能となる。 +さらにユーザによりプログラムの変更に対するメタ計算を自由に定義できるような言語処理系を作るとする。 +その処理系ではこれまでに挙げた全てのメタ計算の例から使いたい機能を選んだり自分で追加することが可能となる。 + +このように、プログラムの変更を形式化することで多くのメタ計算が扱えるようになる。 +さらに、メタ計算の内容によっては信頼性の向上に用いたり変更も含めた上でプログラムを作成することが可能になる。 + +% }}}