修正日:2013年02月03日(作成日:2013年01月22日)


第3章 道具と作成物

 本章では、論旨の主張のために開発する作成物(新しいメトリクスツール)と、その開発に必要となる道具(概念・環境・技術要素)について述べる。

開発の準備

要求

 これまでに述べた論旨二点の主張を目的とするソフトウェアの開発を行う。 「可食化の実現」を本願としながら、「枠組みの利用」により再利用性の高いメトリクスツールを開発することが目標となる。 従って、枠組み「メトリクスグラフ」の構成要素である「ノード」や「アーク」に相当する仕組みを、それぞれ可能な限り独立した機能として実現したい。 また最終的には、ソフトウェアプログラムからスパゲッティを得られるように、ツールを仕上げなければならない。

開発計画

 本開発では、大きく分けて二つの機能を実現しなければならない。 また、それらは独立しているものの、運用時には共に協調して動作するものであるから、一方の設計に大きな変更があった場合には、もう一方にも影響を及ぼす可能性がある。 そのリスクを吸収するというねらいから、アジャイルソフトウェア開発の一であるXP(エクストリームプログラミングの考え方を参考に開発を行う。 (cf. 参考文献[5]

 2012年10月25日から本開発を始動し、アイデアの捻出や反復開発を経て、要求事項の達成を年内(2012年12月末日まで)に遂げ、開発を収束させるものとする。

アイデア

 上記のメトリクスツールを開発するにあたり、その実現に向けて二つのアイデア(初期計画)を用意していた。それぞれを示しておこう。

制限事項

 これまで触れなかったが、本開発にあたりその制限事項について簡単に付け足しておく。

反復開発

 開発計画の通り短期的な開発の反復を基本として、また上記アイデアを基盤として、要求を充足する機能(ソフトウェア)の開発に取り組む。

第1期:言語設計とプラグイン設計

 以上の通り、SynapseScriptの言語設計とメトリクスプラグインの仕様設計を行い、実現に必要となる技術項目を洗い出すことができた。 ただし、この時点での言語設計及びプラグイン設計は変更される可能性があるということに注意されたい。(実際この後、仕様を変更することになる。) なお、第1期開発は、2012年10月25日から同年11月14日まで実施した。

第2期:字句解析構文解析

 言語の定義を終えたため、その言語処理系の実装を行う。 SynapseScriptで記述された表現を解析し、その構文木を得ることが目標となるが、これは既存の字句解析器生成系lex/flex)や構文解析器生成系yacc/bison)を用いることで容易に実現できる。 しかし、「はじめに - 三つの興味(言語処理系に関すること)」で述べた通り、処理系そのものにも興味を抱いていたことから、 字句解析器と構文解析器を独自に実装することにした。

 以上の通り、SynapseScriptの字句解析及び構文解析を実現することができた。 この開発に際して参考文献[10] [11]が大変役立った。 なお、第2期開発は、2012年11月14日から同年12月1日まで実施した。

第3期:Smalltalkからシェルの利用

 Smalltalk上でSynapseScriptを解析し、得られたメトリクスグラフの写像関係に従ってメトリクスプラグインを利用することになる。つまり、Smalltalkからmakeコマンド(シェル)を利用できなければならない。 その仕組みは標準で提供されてはいるのだが、不具合や不都合(マルチバイト文字の問題)が存在するため利用できない。そこで別の手段として、SmalltalkからCを経由してシェルを利用することにする。

図3-12 Smalltalkからのシェルの利用
図3-12 Smalltalkからのシェルの利用

 ひとまず、Smalltalkからのシェルの利用を実現することはできた。残されている種々の問題については、今後の開発で改善してゆくことが期待される。 なお、第3期開発は、2012年12月2日から同月12日まで実施した。

第4期:インタプリタ

 第2期開発の成果物を用いてSynapseScriptによる記述を解析できるが、そこで得た構文木に従ってメトリクスグラフを構築し、実際の写像処理を実行できるインタプリタを開発したい。 その開発にあたり、「SynapseScript」という名称の由来でもある「神経系」の構造を模して設計することにした。概念図を図3-13として示す。

図3-13 神経系を模した概念図
図3-13 神経系を模した概念図

 ノードニューロン(神経細胞)に喩えると、その神経線維(軸索と樹状突起)がちょうど繋ぎ役(コネクタ)となる。 ニューロンが神経線維を通して、他のニューロンに対して物質を伝達するように、ノードもコネクタを通して、他のノードに情報を伝達すれば良い。 伝達機能を持つオブジェクトを拵えた上で、構文木から神経構造(メトリクスグラフ)を構築すれば、再帰的に全ての写像を実行することができよう。

 この考えに基づいて「SynapseInterpreter」という名称でインタプリタを開発した。 動作テストとして、簡単なメトリクスプラグインを作成し、それを用いるメトリクスグラフを記述・実行したところ、確かに設計通りに動作することが確認された。 なお、第4期開発は、2012年12月15日から同月20日まで実施した。

第5期:プラグイン仕様の策定と再考

 第4期開発の動作テストでは、メトリクスプラグインの試作を作り利用していた。 その際も特段の問題は起こらなかったため、メトリクスプラグインの開発方法を具体的に定めて、ガイドラインとして策定することにした。

 ところが第6期開発に入って仕様の問題が発覚した。 メトリクスプラグインにデータを入力する際、makeコマンドにおけるマクロ定義として記述すると先に説明したが、入力データに特殊文字が存在する場合にエスケープ処理を施さねばならない。 また、そのエスケープはデータの受け渡しを行うごとに必要とされるため、「エスケープしたものをエスケープし更にエスケープする」といった複雑な処理を行う羽目になるのだ。

図3-14 幾段にも重なるエスケープ処理
図3-14 幾段にも重なるエスケープ処理

 そして、そのエスケープの施し方は環境により異なるため、特定の環境で正しく動作しても、別の環境で動作するとは限らない。これでは、再利用性を高くするというコンセプトにも反しよう。 統一的なエスケープ処理で済ませるために試行錯誤を重ねたのだが、具体的な方法を見出だせなかったため、その代案として、エンコード規格の一つ「Base64」を援用することにした。 どのようなデータも、Base64でエンコードすることで「エスケープを必要としない文字列」に変換できるため、データの受け渡しが幾段に重なろうとも問題は起こらないのである。

 本来ならデータをそのままの状態で扱い、その可読性を維持したかったのだが、重なるエスケープに頭を悩ませることこそ本質的ではないため、止むを得ず妥協に踏み切った。 ともあれ、ある種のメタ系(文字列で文字列を取り扱おうとする構造)の難しさを垣間見ることができ、学びとなった。 なお、第5期開発のうち、特に仕様策定は2012年12月21日のみ、また仕様再考とそれに伴う追加実装は同月29日から翌年2013年1月1日まで実施した。

第6期:可食化に向けたプラグイン設計と開発

 ソフトウェアプログラムをスパゲッティとして可食化するために、その写像を表現したメトリクスグラフ(図3-15)を用意した。

図3-15 スパゲッティへの可食化を表現したメトリクスグラフ
図3-15 スパゲッティへの可食化を表現したメトリクスグラフ

 また、このグラフを構成している各メトリクスプラグインについて、その実現方法を説明する。 ちなみにメトリクスプラグインは、開発者の好きな言語を利用することができる。そのことを示すため、以下に挙げるプラグインはそれぞれ異なる言語で実装している。

 なお、第6期開発は、2012年12月21日から翌年2013年1月6日まで実施した。

第7期:写像具合の調整

 プログラムの指標値からスパゲッティの指標値を算出するメトリクスプラグインとして四種類を実装したが、まだ「入力値をどのような出力値に対応づけるか」の調整が残っている。 ここまで取り組んできた調査結果に基づき何かしらの根拠を添えて、その調整を行いたい。ただし、この後に実施する予備実験の結果によっては、その写像具合を再度調整する可能性がある。

 また、実際に「良いプログラム」や「悪いプログラム」があれば対応付けの議論も楽になると考え、例題プログラムを五種類ほど用意した。(cf. 付録資料[4]) さらに、この対応付けを行うにあたり同輩に頼んで、彼らが数年前に拵えたというプログラムを提供してもらった。そのご厚意に心から感謝する。

図3-18 写像具合の調整の例
図3-18 写像具合の調整の例

 なお、第7期開発は、2013年1月7日から同月8日まで実施した。

第8期:予備実験後の再調整

 第4章 実験でも述べるが、予備実験実施後の検討で、再調整を要すると判断したメトリクスプラグインがある。以下に説明する。

 なお、第8期開発は、予備実験と同日である2013年1月15日に実施した。

現状での実績

成果

 現段階における成果について述べる。 当初の計画で定めた期間を超過してしまったが、写像役として提起した「メトリクスプラグイン」と、メトリクスグラフを表現するための「SynapseScript」を、それぞれ開発することができた。 これらを用いたメトリクスの実例をご覧に入れたい。

 以上、四種類のメトリクスが実現されたことを示した。 「プログラムからスパゲティへの可食化の実例」によって可食化が実現できたことを示し、 その他の数例を示すことによって再利用性の高いツールが実現できたことを示せたであろう。

 なお、このメトリクスツール(及び上記四題のメトリクス)を利用するには、以下の構成要素が不可欠となる。参考として、開発時に利用していたバージョンや条件を括弧内に付しておく。

問題と今後

 現段階のメトリクスツールが持つ問題点と今後の対処について述べる。

動作確認

 開発したメトリクスツールの検証を目的に、以下に挙げる環境で動作確認を実施した。