この投稿は、俺ことブログ主の考える、最高のプログラミング遍歴ではないかと思われることをつらつら書いたものです。事実に基づくようにも見えますし、妄想の産物かも知れませんが、そのへんは読まれる方にご判断をおまかせします。
あ、でもできるだけ役に立つことを書こうと思ったので、そう思って読んでいただければ幸いです。
今回は、高校生時代です。ほぼ40年前でしょうか。ここが、俺のプログラミング人生の一歩となったのです。数回に分かれます。
遍歴の全容は、ここに書いておきました。
東芝EX-80ではじまるプログラミング
高校生時代は、物理部というアマチュア無線(ハム)とコンピュータ(マイコン)を主たる活動にしているクラブに所属しました。原点はそこの備品の東芝のEX-80というワンボードマイコンキットでした。そのころ、NECのTK-80というトレーニングキットが一世を風靡しましたが、7セグLEDのみが出力デバイスであるTK-80に対し、EX-80はそれに加えてモノクロコンポジットTV出力とカセットテープ(CMT)への記録が可能という高機能版でした。CPUはインテル8080A、メモリは512バイトというスペックでした(これをクラブで1KBに増設していました)。
俺はEX-80がコンピュータとの出会いでしたが、皆さんは何でしたか?
眺めることからはじまるプログラミング
最初は、先輩たちがプログラムを入れたり、ロードしたりして実行するのを眺めていただけでした。TV画面(顧問の先生提供のモノクロソリッドステートTV)は横10文字、縦20行といった感じでしたが、グラフィックモードにすれば縦横80×20ピクセルの画面の完成です。この画面を用いて、「スタートレック」や「ブロック崩し」などを動かしていたので、当時の私としては「へーっ」という感じでしたね。
そう、プログラミングの一歩は、見るだけから始まるのです。まずは、完成されたプログラムが動くのを見て、そこで何が行われているのか関心を持つことです。
余談ですが、EX-80は電源として+12V、ー5V、+5Vを必要としており、必要な電源装置もごついものでした。これも、搭載デバイスがいろんな電圧を必要としていたからなのですよね。また、CPUなどの加熱が一定を超えると止まってしまうので、「お釈迦タイム」と称して冷却する時間が必要だったのを覚えています。
入れるだけからはじめるプログラミング
そのうち、自分でも何か入れて動かしてやろうという願望に駆られます。EX-80のマニュアルに載っていた「三山崩し」というプログラムは、誰も入力していなかったのでした。じゃぁそれを入れてやろうと思ってシコシコ入力を始めます。ちなみに入れるのは機械語と呼ばれる16進数の列で、それを0~9、A~Fのキーがある電卓の親玉のようなパネルで打ち込んでいきます。当然、意味なんかわかりません。
ひととおり入れ終わったところでカセットテープにセーブ(セーブの方法は先輩にに教えてもらった)、そして実行!しかし、期待どおりにはなりません。最初は、うんともすんともいわない、画面に変なものが出る、とかから始まります。
そう、次の一歩は、何か入れてみる、ということです。訳がわからなくてもいいんです、とにかく印字されているものを入れてみることです。まぁ、「写経」ですね。意味がわからなくても、何となく血肉になっているような気がする、それでいいんです。
間違いをつきとめることをはじめるプログラミング
さて、期待どおりに動かないときにはどうすればいいのでしょうか? まぁ、マニュアルに載っていたプログラムと、実際に入力されているプログラムを比較して、間違っていたら修正する、そんなことをちまちまやるしかないですよね。ミスは当然起きるものなので、見つかったら修正、セーブ、実行。そんなことを繰り返していきます。そのうち、期待どおりの動きをするようになってきます。
そう、さらなる次の一歩は、おかしかったら見直す、そして修正する、ということです。地道で厳しい作業ですが、これによってプログラムの表示、入力や修正のスキルがアップしていきます。入力速度は増し、チェックと修正も素早くできるようになってきます。これは、あとで自前のプログラムを入れていくときに役に立ちます。
改造することからはじめるプログラミング
期待どおりに動くようになってきました。実行すれば動くので、鼻高々です。先輩たちもほめてくれます。しかし、そんなのは最初の日だけで、すぐに「ふ~ん」になります。悔しい!じゃ、こいつを改造してすごくしてやろう!
そこでハテ?となります。改造といっても、何をどうすればいいのでしょう?そこではじめて、プログラムの中身ということが重要になってきます。何かをしたいときに、どこをどうすればいいのか? たとえば、「三山崩し」で移動スピードをアップしたいときにどうすればよいのか? こうなると、プログラムの意味を読み解くしかありません。
そう、さらなる次の一歩は、プログラムを読み解く、ということです。自分で組めなくても、そこにあるプログラムを読むことはできます。しかし、これは簡単ではありません。英語のわからない人に英語の原書を読ませるようなもので、そもそもどう読んでいいのかもわかりません。さて困りました。
英語なら英和辞書というものがあり、プログラムの世界にも辞書があります。そう、辞書と首っ引きで読んでいけばいいじゃん!とか思いますよね。でも、そんなことをやっていたら日が暮れてしまいます。もっと簡単な方法はないんでしょうか?
実は、プログラムの改造は、プログラムについての明確な知識がなくてもできる、ということなんです。え?これってどういうこと? 先ほどの英語の原書の例を出しましょう。そこに、「Mary, please put your apple on the table.」とあったとしましょう。もし、「Mary」というのが女性の名前だとわかっていれば、ここを「Kathy」「Margaret」に変えれば相手が変わる、とわかりますよね。「apple」を「orange」、「table」を「chair」でもよいです。
すなわち、変えれば意味や動きの変わるポイントがわかれば、そこをいじればいいだけです。このポイントを誰かが教えてくれればいいのですが(プログラミング言語の入門書ではそうなっていますね)、当時はそのようなものはなかったですから、ひたすらプログラムリストを眺めて、それっぽいところを探します。
詳細は、実際の機械語プログラミングの世界に入ってしまうので簡略化しますと、たとえばメモリ上で定数を置いている部分、レジスタに定数を代入している部分が怪しいとにらみます。とにかく訳がわからなくても、値を極端に変えてみたりします。0とか100とか。そして実行。何か変わりましたか?変わらないですか?変わらなかったら変更箇所を元に戻して、別のところを探したりします。
そうこうしているうちに、動作に影響を与える部分というのが出てくるので、そこを変えるとなぜ動きが速くなったり遅くなったりするのかを、突き止めていきます。それには、変更箇所の周辺のプログラムを見ていきます。
見るのがピンポイントであれば、先ほどの辞書を使って読み解き、プログラムが何をやっているのか、その意味を突き止めていくわけです。
そのうち、プログラムに書かれていることが命令レベルでわかってくるので、それがつながったときにどうなるのか、だんだんと理解の幅を広げていきました。その頃には、CPUにあるレジスタやフラグなど、基本的な知識も身についてきます。
次回は自分で何か作ってみる
さて、今度は何を作ってやろうかという無謀とも思える野望にとりつかれるのもこの頃です。そのお話は次回に譲りましょう。