Theory of Otaku

Im not otaku.

プログラムとこの世の全ての話

プログラム

プログラムって限界まで拡大解釈すると人間の動きまでプログラムと言えますよね。つまりこの世はプログラムでほぼすべて再現できると言っても過言ではないわけです。

地球の自転、車の加速、電気の流れ、人間の手足の動き、人間の感情などなど。hello worldから始まるプログラムだけをプログラムというのは少し視野が狭いかなと感じます。

これを踏まえた上で、プログラムの書き方について考えてみようと思います。

命令の積み重ね

例えば、人間が歩くというアクションには、大雑把に以下のアクションに別れますよね。(もっと分けられるかもしれない)

  1. 片足を前に出す。
  2. 逆の足を1で出した足より前に出す。
  3. 以下繰り返し

この足を前に出すというアクションも、脳が足の筋肉とかに動けー!って命令を出すわけですよね。あとその脳からの命令を脊髄だとか、そういうのが足まで遠路はるばる伝えますよね。

これからわかるように、プログラムって複数の命令の積み重なりによってできているということです。いや当然でしょと言われると思いますが、当然です。

この当然のことをわかっていないと、まともなプログラムは書けないです。

プログラムでいうと

例えば、1~10の数字を並べて表示するfor文のよくあるをゴリ押しで書くと

  1. 変数numを作成する。
  2. numに初期値である1を代入する。
  3. numを出力する。
  4. numを+1する。
  5. numを出力する。
  6. numを+1する。
  7. ...

って感じでまぁゴミ見た目の悪いプログラムができました。for文とかの繰り返し文って、3と4を指定数回繰り返してくれますよね。つまり、numを出力して+1するという複数のプログラムをひとかたまりにして複数回実行してくれています。

これって、人が歩く動作である片足を出して逆の足を出すというものと考え方は同じですよね。しかも、numを出力したり+1するためにはコンパイラくんが色々頑張ったりしてくれているはずです。これは脳とか脊髄とか、そういう類のものと一緒です。

関数

命令の積み重ねと聞いて、「ああ、関数か」と思ってくれると嬉しいんですが。そんなことはないかもしれないですね。例えばjavaなら print(" hello-wowow "); というプログラムがあれば、このprintという関数がえんこらせとhello-wowowと表示するために頑張ってくれているわけです。

流石にさっきのfor文を関数として実用化するなんてことはないんですが、例えばAとBの値を入れ替える関数 swap( A, B ); とか。そうして入れ替えたものをそれぞれ足す sum( A, B );、これを出力する print ( result ); 、この3つの関数を書いてある大きな main 。mainの中に3つの関数がありますよね。これ全て関数を使わずゴリゴリコードを書くなんて、想像できませんよね。僕なら絶対やりません。

ここからわかってほしいことは、ほぼ全てのプログラムの塊は他のプログラムの部品になり得るということです。

つまり

今回の話で何を理解してもらいたいかというと、プログラムの仕組みについてもっとわかってほしい。ということです。頭を使わず random() とか toString() とかを使ったりしないでほしいです。全ての関数はプログラムであるということを頭に置いてプログラムを書いてほしい。別に中身のソースコードを理解しろと言っているわけではなくて、「random();?ランダムな数をなんか発生させてくれるやつね。」で済ませないでほしい。という話です。

今後書いてもらうメソッドはもしかしたらどこかまた別のプログラムで使うかもしれない。このプログラムは昔書いたものを使えば短くできるな。とか。足の筋肉は歩くためだけにあるわけじゃないし、走ったり蹴ったり踏んだり、つまりそういうことです。そういうものがあるという認識をするだけで、プログラムに対する考え方がきっと変わる気がします。

当然プログラムとはこれだけじゃないです。いかんせんこの世の全てをプログラムで再現できかねない世界ですから、もっとたくさんの法則や考え方があります。とりあえず今回はこういう話でした。