1. HOME
  2. テックブログ
  3. プログラミングのわかり方 vol.1

プログラミングのわかり方 vol.1

以前インターンにお越しいただいた学生に企業のブログにどの様なものを求めるか?とお尋ねしましたら「プログラミングってなんなの?」ということを解説してほしいとご意見をいただきました。確かに具体的な技術についてはプログラミングのQ&Aサイトなどで解説がありますが、プログラミングという行為それ自体についての解説というのは意外と少ないかもしれません。もうすぐ小学生にもプログラミング教育が必修になるそうですね。良い機会をいただきましたので、自分なりの思うところをまとめたいと思います。

もののわかり方には2種類あります。繰り返すうちに、いつの間にか分かっていたものと、何かをきっかけにある日突然わかるものです。自分はプログラミングのわかり方はこの後者に近と思います。そのため、まだプログラミングを始めたばかりの方でも、この記事を読んで「なるほどプログラミングが分かったかも…」ということがあるかもしれません。その様な役に立てることを期待して書いていきます。

プログラミングは、コンピュータを操作するための方法

プログラミングは、コンピュータを操作するための方法です。一般に「コンピュータ使える?」って聞かれたとき、それはネットを調べたり、ブログを書いたり、表計算をしたりといった「ソフトウェアが使えるのか?」という意図のものが多いでしょう。これは厳密には「コンピュータを操作している」こととはちょっと異なります。ここでは文字どおりの意味で「コンピュータを操作する」ということを考えてみたいと思っています。それは何なのか?

このことを考えるために、先に「コンピュータ」について次の事実を知っておくと良いです。コンピュータは「状態機械」であるということです。状態機械というのは、その機械がある「状態」を表現できて、またその状態を機械自体が書き換えられる様なものと理解していただいて良いと思います。

その様な機械は、今このブログを読んでいるコンピュータ(MacやiPhone)の様に電気的なものでなくても構いません。例えば歯車やバネで動くカラクリ仕掛けの状態機械も可能ですし、コンセプチュアルには、決して間違えない人が紙と鉛筆で何らかの記号変換を行うこともある種の状態機械と言って良いでしょう。そして、この状態の書き換え方を機械に指定することがプログラミングと言います。

コンピュータの先祖ジャカード織機について考えてみよう

ジャカード織機 – Wikipedia

コンピュータの先祖である、ジャカード織機について考えてみましょう。ジャカード織機は「機織り機」です。機織りといえば縦糸横糸を交互に組み合わせていくことで、1次元的な繊維を2次元的な布に変換していくものです。その際に、繊維の色や編み方を変えることで、布に自由自在に模様を描くことができます。昔、この「編み方」はパンチカードと言って木片に穴を開けたものによって機械に指示されました。アウトプットしたい布の模様を考えて、そうなる様にパンチカードに穴を開ける作業。これはプログラミングです。

話を電気のコンピュータ(MacやiPhoneやDS)に戻していきましょう。機織り機はパンチカードの指示によって編み機構の状態を変化させ、布に模様をアウトプットします。このこととコンピュータの動作を対比させてみるとどうでしょう。コンピュータは、コードの指示によって「メモリ」の状態を変化させ、ディスプレイに模様をアウトプットするものです。ディスプレイと書きましたが、ここで特にディスプレイにこだわる必要はありません。例えばプリンターに出力した場合も一緒です。プリンターに出力する方が、機織り機のアナロジーからは、より理解しやすいかもしれません。

コンピュータのプログラミングで行いたいのは「メモリ」の操作

まとめますと、機織りのプログラミングが「編み機構」の操作である様に、コンピュータのプログラミングで行いたいのは「メモリ」の操作です。プログラミングは、メモリの状態を好きな様に書き換え、その結果、意図するパターンをプリンターやディスプレイにアウトプットしていく物と捉えると良いでしょう。そのため本当にコンピュータを良い感じに操作するためには、この「メモリ」についてある程度知っておかなければなりません。書き換える対象そのものですから。

メモリ

パソコンを買う時「ハードディスクが250GBで、メモリが8GB」と言った様に、ハードウェアとしてのメモリはみなさんも意識していることと思います。メモリとは電気的なスイッチがたくさん(上の例では8GB分)実装されたものです。
スイッチというのは1もしくは0の「状態」を表すことができるものです。またこれが電気的に作られているものですから、高速にオン/オフができるのです。メモリ中の特定の場所のスイッチのセットが、例えば「101」と並んでパターンになっていて、それが2進数で数字を表しているというのであれば、それは10進数では「5」になります。

以下はプログラミングのコードの例です。

let a = 5;

これを実行すると、コンピュータはメモリ内に「a」というラベルが指し示すためのスイッチのセットを用意して、その状態を「101」になる様に切り替えます。そして続いて次の様にコードを書くと…

a = a + 1    

コンピュータがこの手続きに基づいて計算を行い、aのラベルが指すスイッチのセットを「110(10進数の6を表すもの)」に書き換えます。(電気的なそろばんを弾いている様なものですね。)そして事前に、aの指すものをディスプレイやプリンターに出力する設定がされていれば、この操作によって数字の「6」が出力されるという様になります。

コンピュータのプログラミングのミクロの世界ではこのようなことが行われています。
この様にメモリ上に何らかのパターンを置いてそれを変形するという行為は、その解釈を拡大していくと「手で紙に何かを書いていること」と、実は大して変わらないのではないか…。この様な感覚を持った方がいらっしゃったら、すでにプログラムのことをずいぶん理解されていると思います。

しかし、このミクロの世界にだけ注目していてもゲームや、アプリなどは作れません。これをまた機織り機のアナロジーで言えば、編み機構が制御できて細かいパターンを織ることができても、布の全体に意図したパターンを展開するにはまた別の知識が必要になることと同じです。次回、このことについて考えたいと思います。

この記事を書いた人

大西 秀典
インターネットサービス事業本部 企画開発本部
大西 秀典

おすすめの記事