ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
Hello, ANOTHER world!

メモリとデータとアルゴリズム

ソフトウェアは、アルゴリズムとデータからできています。アルゴリズムだけでは何もすることがないですし、データだけがあってもどうしようもありません。たとえば "Hello, world" のプログラム中では表示するメッセージの文字列がデータで、それを表示する関数の中にある手順がアルゴリズムです。
ソフトウェアはユーザーにとって意味のある情報を処理してはじめて意義があります。その処理の手順がアルゴリズムです。アルゴリズムはユーザーからの入力に何らかの変換をほどこし、その結果としてユーザーへの出力を行ないます。このとき入力も出力もユーザーにとって意味がある情報であるという点が重要です。
アルゴリズムは普通、処理の間に途中経過の情報を保持する必要があります。これがデータと呼ばれるもので、メモリやファイルに保存されます。データはアルゴリズムにとって意味のある情報である点に注意してください。
データとアルゴリズムは常に一体となって動作します。もう少し正確に言うと、動作を司るのはアルゴリズムであり、アルゴリズムはデータを必要とします。ユーザには見えませんが、ソフトウェアの中はいつもそうなっています。
アルゴリズムがメモリに格納したり取り出したりするデータは、あるときは数ですし、別のときには文字列ですし、また別のときには別の情報です。しかしメモリは単なるビットの集合体なので、本当はビットのかたまりしか記録できないのです。そのビットのかたまりをまず数値に見立て、その数値をまたいろいろなものに対応づけることによって情報を表しているのです。
文字列 "ABC" がメモリ上では(16進数で) 41, 42, 43, 00 という4バイトで表されるということは以前に説明しましたが、これは数値から文字への対応関係が ASCII Code という規格で決められていて、つまりどの数値がどの文字に対応するのかが取り決められていて、そのことをアルゴリズムが利用しているからデータが文字列として解釈されるのです。もしこの4バイトが別のアルゴリズムと結びついたとしたら、それは int 型の数かもしれませんし、20ビットと12ビットの数値を詰め込んだものかもしれません。ところが文字列として意味のあるメモリ中の数値を別の見方で見ても意味がありません。つまり、メモリに格納されたデータは、それと対になるアルゴリズムがあってはじめて意味を成すわけです。
アルゴリズムによってデータが違ってみえるということは、アルゴリズムはメモリの中身を自分にとって都合のよい構造をもったデータだと思って処理しているということです。データには構造があるのです。そう考えると、構造をもったデータはアルゴリズムから独立しても意味のある存在になりえます。データ自体に意味のある構造を想定し、それを取り決めとすることによって、それを処理するアルゴリズムをいくつも考えることができます。 ASCII Code や文字列の格納のしかたはそのもっとも単純な例のひとつといえるでしょう(文字列を処理する関数がたくさんあることを思い出してください)。
例をもうひとつ。ウェブページは HTML という言語で書かれてファイルに保存されていますが、これはブラウザに送られ、アルゴリズムによって処理されて構造をもったデータとしてメモリに格納され、それがまた処理されて画面に表示されます。また、HTML ファイルの中身も構造をもったデータです(メモリの代わりにファイルに格納されたのです)。データ自体に意味のある構造が与えられているので、いろいろなブラウザで読み込んで(それぞれ異なるアルゴリズムによって)処理することができるのです。
さて、データには構造があり、その構造を取り決めとすることによってアルゴリズム間をデータが行き来する可能性がでてくるということがわかったと思います。データが行き来するもっとも身近な例は、関数に受け渡すパラメータでしょう。"Hello, world" でも使われていますしね。次回はパラメータについて考えます。

("Hello, ANOTHER world!" は2001年11月から2002年11月にかけて作成されたコンテンツです。)