Rubyによるプログラミング ほんの入り口(その2)

ここではプログラミング言語Rubyを用いて演習を行います。少ない履修時間でプログラムとは何であるかを原理的に理解することを目的としています。本格的なプログラミングを学ぶためにはそれぞれのプログラミング言語の演習を履修することをお勧めします。

1.再帰呼び出し

前回、フィボナッチ数列や階乗計算のプログラムを例題として示して解説しました。それらは元々再帰的に定義されています。プログラミング言語によっては再帰的に定義された数列等を再帰的なプログラムで表現できる機能を備えています。Rubyにもその機能はあり、例えば次のようにしてフィボナッチ数列や階乗計算を行うプログラムを記述することができます。

def fib(x)

if x == 0 then

0

elsif x == 1 then

1

else

fib(x – 1) + fib(x - 2)

end

end



def fact(x)

if x == 0 then 1;else x*fact(x – 1);end # 改行の代わりに「;」で区切っている

end

このように、fibfact自身の定義の中でまたそれらを呼び出すことを一般に再帰呼び出しと呼びます。これもプログラミングにおける重要な概念の一つです。前に例題とした再帰呼び出しによらないプログラムと比較してみてください。ただしfibについては、再帰呼び出しのプログラムの方は非常に効率の悪いものとなっていますが、同じ再帰呼び出しでも効率の良いプログラムを書くことも可能であることを申し添えておきます。

一見するとfibfactは他のプログラミング言語における函数のように見えますが、Rubyにおいては実は後で述べるメソッドの一種となっています。

2.タートルグラフィクス

画面に図形を表示する演習を行うと興味を引かれる人が多いようであるという理由で、ここではタートルグラフィクスによる演習を行います。タートルグラフィクスとは、タートル()の動きによりさまざまな図形を描くというグラフィクスの一方式です。いわゆるフラクタル図形等の描画を簡単に行うことができます。タートルグラフィクスは、それ自身を扱うのが容易で、しかもタートルグラフィクスの基本プログラムを記述するのも簡単なため、入門的なコースや説明でよく使われるものの一つです。

グラフィクスの表示にはRuby/tkというシステムを用いることにします。Ruby/tkは本来GUI(グラフィカルユーザインタフェース)のために存在しているので、グラフィクスのみに使用すると不必要な機能がたくさんあり、動作が遅くなりますが、簡単に使えます。ただしここの環境の場合、Ruby/tkWindows7の方にしかインストールされていないようです。自宅PC等で演習を行う場合には、Rubyの処理系に加えてRuby/tkも動作させておく必要があります(サーチエンジンによりインストール方法は簡単に見つかります)

タートルをRubyのようなオブジェクト指向言語で実現する場合、タートルをオブジェクトとし、マルチタートルグラフィクスとするのが自然です。後で解説するプログラムではそのように記述しています。

3.オブジェクトとは

ここで改めてオブジェクト指向プログラミングについて説明しておきます。オブジェクトという概念はできるだけ何にでも当てはめられるようなものですので、必然的に抽象的な概念であり、説明も抽象的なものとなります。したがってこの節の内容を実感を伴って理解できない場合、ざっと読飛ばすだけで十分であり、あとでプログラムの具体例を理解してから再読されるとよいと思います。

オブジェクトとは自分自身の局所的なデータを備え、計算を行うものです。また、他のオブジェクトとデータをやり取りします。やり取りするデータのことをメッセージと呼びます。

メッセージの解釈は各オブジェクトが自分自身で行います。各オブジェクトの局所的なデータは特に指定しない限り他のオブジェクトから見たり書き換えたりすることができません。局所的なデータを見たり書き換えたりできる場合があるといっても、それらもメッセージにより行います。基本的には見るためあるいは書き換えるためのメッセージへの反応の仕方を記述したプログラムは、メッセージを送る側ではなく、メッセージを受けるオブジェクト側が持っています。従って外側から見てあるオブジェクトの局所的なデータを操作しているように見えたとしても、外側からはそれらしく見えているだけであって実際にそうなのかどうかは当該オブジェクト自身にしかわかりません。

このように、データとそれへの操作方法をまとめて定義し、それらを外から直接見られなくすることをデータ隠蔽とかカプセル化と呼びます。このようにするとデータとそれへの操作のプログラムをまとめて取り替えることが可能になり、ソフトウェアの部品化が容易になるし、プログラマは部品の余計な内部構造まで考えなくてすみます。この概念はプログラミング言語の発展における重要な概念の一つです。

同種のオブジェクトをまとめたものをクラスと呼ぶ場合があります。すなわち、クラスが同じオブジェクトは、保持している局所的データの種類と個数が同じで、メッセージへの反応の仕方を記述するプログラムも同じです(実はやや細かいことを言えばRubyの場合には特異メソッドという例外があります)。メッセージにはメソッドと呼ばれる処理プログラムを表す一種のタグ(荷札)がついており、メソッドごとに処理プログラムを記述します。Rubyを含めてクラス概念があるプログラミング言語では、局所変数やメッセージへの反応の仕方を記述するプログラムを与えてクラスを定義します。

クラスを新たに定義する場合、既存クラスの記述を利用することが可能です。この機能をインヘリタンス(継承)と呼びます。Rubyの場合にはさらにMix-inという機能があり、継承の機能とあいまってプログラム中に共通する記述を柔軟に抜き出してまとめることが可能です。しかしそれらについてはこの授業では時間の都合とプログラミングの味見をする程度と言う授業の性格上解説しません。

4.タートルグラフィクスのプログラム

以下にタートルグラフィクスの例題プログラムを提示します。

タートルグラフィクスのプログラム turtle.rb

上を用いて表示した図形の例 turtle1.rb

同じく、フラクタル図形の例 turtle2.rb

これらのファイルはRubyのプログラムを格納し、プログラミング時に作業するディレクトリ(M:¥rubyなど)に入れてください。例えばコマンドプロンプトでそのディレクトリに行き、ruby turtle1.rbなどとして実行し、図形を指定する数字をコマンドプロンプトのウィンドウに入力すれば表示されるはずです。

ただし、Ruby/tkの処理系のバージョンの違い等によって、うまく動作しない場合がありえますので、そういう際にはTAなどの指示に従ってください。

これらのプログラム中の記述を題材としてオブジェクト指向についてもさらに授業中に具体的に説明します。

5.2つ目の課題

タートルグラフィクスのプログラムturtle.rbを冒頭でrequireして(turtle2.rbの冒頭参照)図形を描くプログラムを作成し、kadai10.rbとして提出せよ。図形は自分が選んだ、あるいは創作したものとしてよい。ただし描画のプログラムは自分で記述すること。また、コマンドプロンプトでruby ファイル名とすれば他に何もしなくても実行し、表示するものとすること。表示したウィンドウをキャプチャして画像ファイルとしたものを添付すること。提出先やsubject:の書き方は前回と同じである。

これまでに学習したプログラミングの技法以外の技法も用いてもよい。サーチエンジンでruby 逆引き、ruby 言語要素などを調べれば多数の解説サイトが見つかるので、それらを参照すればさまざまなプログラミングの技法やRubyの機能を知ることが可能である。