できるだけわかりやすく説明をしてみるという実験
2016年07月17日
よく、物知りの人のことを「あの人は人間データベースだ」などというが、この「データベース」とは何なんだろう?
これだけ世間一般に使われている言葉でありながら、「データベースって何?」と聞かれると、「データを蓄積するもの」という答えになるだろう。
「データを蓄積するもの」という答えは50点。
データベースはデータを蓄積するのは当然として、「その蓄積したデータを検索して取り出すことができる」ということが重要である。
ある規模以上のコンピューターのプログラムはそのプログラムで扱うデータを管理するためにデータベースを使う。
たとえば何らかの商品をネット上で売るシステムがあるとする。
このとき、ありうるデータとしては顧客データと商品データ、それと購入履歴データが考えられる。
続きを読む
これだけ世間一般に使われている言葉でありながら、「データベースって何?」と聞かれると、「データを蓄積するもの」という答えになるだろう。
「データを蓄積するもの」という答えは50点。
データベースはデータを蓄積するのは当然として、「その蓄積したデータを検索して取り出すことができる」ということが重要である。
ある規模以上のコンピューターのプログラムはそのプログラムで扱うデータを管理するためにデータベースを使う。
たとえば何らかの商品をネット上で売るシステムがあるとする。
このとき、ありうるデータとしては顧客データと商品データ、それと購入履歴データが考えられる。
続きを読む
myinnerasia at 18:09|Permalink│Comments(0)
2016年07月15日
2016年07月14日
前回の「できるだけわかりやすく説明してみるという実験」シリーズでは、サブルーチンについて説明した。
プログラムの大きな流れの中で、繰り返し何度も出てくる一連の処理を、「サブルーチン」という共通に使うことができる処理にして、それを各所で使う、という知恵であった。
続きを読む
プログラムの大きな流れの中で、繰り返し何度も出てくる一連の処理を、「サブルーチン」という共通に使うことができる処理にして、それを各所で使う、という知恵であった。
続きを読む
myinnerasia at 18:01|Permalink│Comments(0)
2016年07月13日
プログラムによって、コンピューターに処理をさせるための手続きを書く。
たとえば下記のような処理Aから処理Fまでの流れがあるとする。
これらのひとつひとつ処理は、ここでは「処理◯」と抽象的に表しているためイメージしづらいかもしれないので、もう少し具体的に処理の内容を例えてみれば、、、
処理A:ユーザーが入力したユーザー名を受け取る
処理B:(受け取った)文字をメモリに記憶する
処理C:その文字をデーターベースに照合し、ユーザーを特定する
処理D:ユーザーが入力したパスワードを受け取る
処理B:(受け取った)文字をメモリに記憶する
処理E:データベースから、該当するユーザのパスワードを取得する
処理B:(取得した)文字をメモリに記憶する
処理F:入力されたパスワードとデータベース上のパスワードが一致するか照合する
ここで、「処理B:文字をメモリに記憶する」という処理が3度登場している。
この共通の処理を何度も書くことはプログラムが冗長になる(長ったらしくなる)し、同じものを何度も書くということは、そこに変更が起こった場合、それらをひとつひとつ全部書き換える必要性が出てくる。
そこで処理Bをひとつにして、処理中の複数の箇所で共通して使おう、という考え方がある。
これを「サブルーチン」という。
ルーチンとは"routine"と書き、英語で「日課」などと訳されるもの。つまりここでは一連の流れ、とでも考えればよい。
「サブ」というぐらいだから、「メイン」があると思うはずだがそのとおり!
処理Aから処理Fまでの大きな流れをここでは「メインルーチン」と呼び、処理Bをサブルーチンにして、共通にしてしまおう、としたものが下記である。
線がちょっとぐちゃぐちゃになってはいるが、処理の流れ自体は冗長性が取り除かれて、すっきりしたものになっている。
ここで、もし処理Bに変更があった場合のことを考えてみる。
「文字をメモリに保存する」という処理が、何らかの事情により「メモリに領域が足りないから今回は毎回ディスクに書き込んでください」ということになった場合。
最初の処理Bを毎回書いていたもの、つまり処理Bをサブルーチンにして共通にしなかったものの場合、プログラム中の3箇所を書き換える必要があった。
プログラムを書き、そして書き換えるのが人間である以上、間違えは起こりうる。人間だもの(by みつを)。
「メモリに保存する」を「ディスクに保存する」に書き換える箇所が3箇所あるのに、最後の1箇所を書き換え忘れた場合、コンピューターはそのプログラム通りに処理を実行する。つまり、3回めの書き込みを(本来意図していなかった)メモリ上に書いてしまうことになる。これによってバグが発生してしまう。
処理Bをサブルーチンとして共通化した場合、このような間違いが起こりにくくなる。
変更は一箇所で行えばよい。
また、処理Aから処理Fまでのメインルーチンの中で「メモリに保存する」という実際の手続きを書く必要があったものを、単に「処理Bを呼び出す」と抽象化して書くだけでよくなり、処理の大きな流れを俯瞰して読みやすくなる。
以上のような理由により、サブルーチンという考え方はプログラムにとって非常に大切な知恵である。
たとえば下記のような処理Aから処理Fまでの流れがあるとする。

処理A:ユーザーが入力したユーザー名を受け取る
処理B:(受け取った)文字をメモリに記憶する
処理C:その文字をデーターベースに照合し、ユーザーを特定する
処理D:ユーザーが入力したパスワードを受け取る
処理B:(受け取った)文字をメモリに記憶する
処理E:データベースから、該当するユーザのパスワードを取得する
処理B:(取得した)文字をメモリに記憶する
処理F:入力されたパスワードとデータベース上のパスワードが一致するか照合する
ここで、「処理B:文字をメモリに記憶する」という処理が3度登場している。
この共通の処理を何度も書くことはプログラムが冗長になる(長ったらしくなる)し、同じものを何度も書くということは、そこに変更が起こった場合、それらをひとつひとつ全部書き換える必要性が出てくる。
そこで処理Bをひとつにして、処理中の複数の箇所で共通して使おう、という考え方がある。
これを「サブルーチン」という。
ルーチンとは"routine"と書き、英語で「日課」などと訳されるもの。つまりここでは一連の流れ、とでも考えればよい。
「サブ」というぐらいだから、「メイン」があると思うはずだがそのとおり!
処理Aから処理Fまでの大きな流れをここでは「メインルーチン」と呼び、処理Bをサブルーチンにして、共通にしてしまおう、としたものが下記である。

ここで、もし処理Bに変更があった場合のことを考えてみる。
「文字をメモリに保存する」という処理が、何らかの事情により「メモリに領域が足りないから今回は毎回ディスクに書き込んでください」ということになった場合。
最初の処理Bを毎回書いていたもの、つまり処理Bをサブルーチンにして共通にしなかったものの場合、プログラム中の3箇所を書き換える必要があった。
プログラムを書き、そして書き換えるのが人間である以上、間違えは起こりうる。人間だもの(by みつを)。
「メモリに保存する」を「ディスクに保存する」に書き換える箇所が3箇所あるのに、最後の1箇所を書き換え忘れた場合、コンピューターはそのプログラム通りに処理を実行する。つまり、3回めの書き込みを(本来意図していなかった)メモリ上に書いてしまうことになる。これによってバグが発生してしまう。
処理Bをサブルーチンとして共通化した場合、このような間違いが起こりにくくなる。
変更は一箇所で行えばよい。
また、処理Aから処理Fまでのメインルーチンの中で「メモリに保存する」という実際の手続きを書く必要があったものを、単に「処理Bを呼び出す」と抽象化して書くだけでよくなり、処理の大きな流れを俯瞰して読みやすくなる。
以上のような理由により、サブルーチンという考え方はプログラムにとって非常に大切な知恵である。
myinnerasia at 18:02|Permalink│Comments(0)
2016年07月12日
コンピューターの用語には「低水準」と「高水準」というものがある。
コンピューターの基本動作により近いもの程、「低水準」と呼ばれ、その逆が「高水準」と呼ばれる。
例えば、、、
インターネットで何かを検索する時に、googleに検索文字を入力して結果を待つ、ということをする場合の裏でされていることについて考えてみよう。
話が難しくなりすぎるとアレなので、とりあえずは検索の仕組みについてはやめて、単に「文字をサーバーに送る」ということについて考えてみる。
googleの窓に入力した検索文字は、googleのサーバーに送られ、サーバーでは、そこに蓄えられたデータから結果を返す。
この際の「検索文字」は、ネット越しにサーバーに送られる際に、0と1で表される。
上記の例の場合の、「文字をサーバーに送る」というのが「高水準」で、それを低水準で表すと「文字を0と1で表して送る」ということになる。
ここでの「文字を0と1で表して送る」というものもまだまだ高水準で、それよりもまだまだ低水準な表し方があるのだが。
コンピューターでプログラムをする際には、「低級言語」と「高級言語」というものがある。
「低級言語」は初心者向けで簡単、「高級言語」は上級者向け、というわけではない。
「低級言語」は安くで手に入るが、「高級言語」は高く、桐の箱に入っている、というわけでもない。
ここでの「低級」は上記で書いた「低水準」と同義で、より基本動作に近い処理を扱う言語である。
たとえば「a+bを計算してcに代入する」という処理を考えた場合、「まずメモリの◯◯番地(メモリには番地が決められている)にaの値を置き、△△番地にbの値を置き、それらを足した結果をXX番地に書く」というように、非常に面倒くさいことをする。行数にすれば、これだけの処理でも数行書くことになる。
その最も低級言語に当たるプログラム言語では、実際にコンピューターのハードウェア上でされている処理をそのまま書くので、「機械語」という。
この機械語の低水準な処理を積み重ねることによって、より人間に分かりやすい言語にしたものが「高級言語」である。上記の「a+bを計算してcに代入する」というのは単に「c=a+b」と一行で表される。
「高級言語」で書かれたプログラムは、「低級言語」に翻訳され、最終的には「機械語」に翻訳された後に処理される。つまり「c=a+b」という高級言語で書かれたプログラムは、最終的には上記の「まずメモリの◯◯番地にaの値を置き」というものに翻訳されて処理されるのである。
言語の低級、高級は2つに分かれるというわけではなく、高級言語の上位にはさらに高級な言語があったりする。
たとえばオブジェクト指向言語というものは、コンピューターの基本的な処理からはかなり飛躍し、プログラマーがより抽象的にプログラミングをすることができるようなものである。
このオブジェクト指向言語も、低級言語に翻訳され、最終的には最も低水準な機械語に翻訳されて処理される。
より複雑に見えるものごとも、その低水準では非常に原始的で単純な原理によって成り立っており、それを積み重ねることによって複雑なものが構成されている。
コンピューターの基本動作により近いもの程、「低水準」と呼ばれ、その逆が「高水準」と呼ばれる。
例えば、、、
インターネットで何かを検索する時に、googleに検索文字を入力して結果を待つ、ということをする場合の裏でされていることについて考えてみよう。
話が難しくなりすぎるとアレなので、とりあえずは検索の仕組みについてはやめて、単に「文字をサーバーに送る」ということについて考えてみる。
googleの窓に入力した検索文字は、googleのサーバーに送られ、サーバーでは、そこに蓄えられたデータから結果を返す。
この際の「検索文字」は、ネット越しにサーバーに送られる際に、0と1で表される。
上記の例の場合の、「文字をサーバーに送る」というのが「高水準」で、それを低水準で表すと「文字を0と1で表して送る」ということになる。
ここでの「文字を0と1で表して送る」というものもまだまだ高水準で、それよりもまだまだ低水準な表し方があるのだが。
コンピューターでプログラムをする際には、「低級言語」と「高級言語」というものがある。
「低級言語」は初心者向けで簡単、「高級言語」は上級者向け、というわけではない。
「低級言語」は安くで手に入るが、「高級言語」は高く、桐の箱に入っている、というわけでもない。
ここでの「低級」は上記で書いた「低水準」と同義で、より基本動作に近い処理を扱う言語である。
たとえば「a+bを計算してcに代入する」という処理を考えた場合、「まずメモリの◯◯番地(メモリには番地が決められている)にaの値を置き、△△番地にbの値を置き、それらを足した結果をXX番地に書く」というように、非常に面倒くさいことをする。行数にすれば、これだけの処理でも数行書くことになる。
その最も低級言語に当たるプログラム言語では、実際にコンピューターのハードウェア上でされている処理をそのまま書くので、「機械語」という。
この機械語の低水準な処理を積み重ねることによって、より人間に分かりやすい言語にしたものが「高級言語」である。上記の「a+bを計算してcに代入する」というのは単に「c=a+b」と一行で表される。
「高級言語」で書かれたプログラムは、「低級言語」に翻訳され、最終的には「機械語」に翻訳された後に処理される。つまり「c=a+b」という高級言語で書かれたプログラムは、最終的には上記の「まずメモリの◯◯番地にaの値を置き」というものに翻訳されて処理されるのである。
言語の低級、高級は2つに分かれるというわけではなく、高級言語の上位にはさらに高級な言語があったりする。
たとえばオブジェクト指向言語というものは、コンピューターの基本的な処理からはかなり飛躍し、プログラマーがより抽象的にプログラミングをすることができるようなものである。
このオブジェクト指向言語も、低級言語に翻訳され、最終的には最も低水準な機械語に翻訳されて処理される。
より複雑に見えるものごとも、その低水準では非常に原始的で単純な原理によって成り立っており、それを積み重ねることによって複雑なものが構成されている。
myinnerasia at 18:09|Permalink│Comments(0)