プログラミング雑誌の編集に携わるようになって,そろそろ3年になる。その間,いろいろな方に取材させていただいた。取材を振り返ってみると,一つの思いが頭に浮かぶ。「パソコンの草創期から経験を積んでいる人は強いなぁ」という思いだ。

 現在,筆者が所属する「日経ソフトウエア」は,Java,Visual Basic,C#といったオブジェクト指向言語や,Ruby,Python,PHPなどの動的型付け言語の記事を中心に記事を作っている。どれも現在流行の言語だ。

 これらの言語はコンピュータ・ハードウエアの動作原理をあまり知らなくてもプログラムを作れるようになっている。例えば,メモリーの確保/解放をプログラマにさせると,必ずどこかで間違いが起こってメモリー・リークにつながる,という考えから,まとまったメモリー領域の確保/解放は実行環境が自動的に処理してくれるようになっている。

 しかし,プログラミングを学んでいる方や,プログラマとして働いている方なら,先輩や上司に「ハードウエアの動作原理を理解することは大切だ」と言われたことがあると思う。日経ソフトウエアでもそのような趣旨の特集を何度か組んできたし,John L. Hennessy氏とDavid A. Patterson氏の手による名著「コンピュータの構成と設計(上/下:日経BP社)」など,ハードウエアの動作原理を解説した本は多い。新人のころにこういった本を教科書として学んだ,というプログラマの方も多いだろう。

 とはいえ,本を読むだけでは何となくすっきりしないと感じた方もいるのではないだろうか。このような解説書は,プログラマが抱えている仕事に直接役に立つとは感じにくいことが多い。JavaやC#など,仮想マシンの存在を前提にした言語を使っている場合は,余計にそう感じるだろう。

 仕事を抱えるようになると,書籍で勉強してもなかなか頭に入ってこないのではないだろうか。それに,コンピュータ技術を学習するには,本を読むだけではやはりダメだ。手を動かして,自分でプログラムなどの作品を作ってみないと,実感がわいてこない。

20年前のPCは簡易なOSしかなく,仮想マシンなど存在しなかった

 パソコンの草創期,今から20年以上前から経験を積んでいる人は,パソコンのプロセサやI/O(入出力機構),メモリーを直接操作してプログラムを作ってきている。

 そのころ,日本で主流のパソコンと言えば,NECのPC-9801シリーズだった。当時は市販のパッケージ・ソフトは少なかったので,必要なプログラムは自分で作らなければならなかった。そして,ちょっと複雑なプログラムを作るには,ハードウエアを直接操作する必要があった。当時からプログラムを作っている人は,その過程でハードウエアの動作原理を自然に身につけていることが多い。

 ハードウエアの原理を身につけていると,オペレーティング・システム(OS)がハードウエアを抽象化する意味や,プログラムごとにメモリー空間を割り当てる機能の意味を実感できる。メモリーの確保/解放を自動化してくれる仮想マシンのありがたみも理解できる。

今のパソコンは大規模なシステム,個人で全容を把握することは至難

 学習のために,今からPC-9801シリーズを入手することは難しいだろう。本体の生産はとっくに終了しており,中古品を手に入れようにも,きちんと動く品がなかなか見つからない。それに,学習用の資料を今からそろえるのも難しい。

 では,目の前にあるパソコンを使って,ハードウエアを操作する方法を学べないだろうか。これはそう簡単にはいかない。PC-9801シリーズの時代と比べると,現在のパソコンは複雑すぎるのだ。

 性能向上のため,プロセサは機能追加を繰り返し,ついに今のパソコン用プロセサは64ビットにまで進化した。人間がアセンブリ言語などでプロセサを直接操作しようとしても,そう簡単にはいかなくなった。さらに,現在のパソコンはグラフィックス・アクセラレータなど,20年前には存在しなかった複雑なハードウエアをいくつも搭載している。このようなハードウエアを直接操作することは至難の業だ。

 また,今のパソコンはハードウエアの上にOSが存在し,ハードウエアを抽象化している。OSが提供するAPI(Application Programming Interface)を使えば,プログラマは簡単なコードでハードウエアを利用できるようになった。だが,これではハードウエアを直接操作する感覚はつかめない。

 このように,現在のパソコンはハードウエアの動作原理を学ぶための教材としては複雑になりすぎてしまっている。

簡易なマイコンならすべてを把握できる

 そこでお薦めしたい教材がマイコンである。マイコンとはマイクロ・コントローラの略で,8ビットや16ビットの簡易なプロセサ・コアと一緒に主記憶用のRAM,プログラム格納用のフラッシュROM,各種I/O制御回路,アナログ/デジタル・コンバータ(A/Dコンバータ)などの回路を集積したものだ。

 このマイコンにLED(Light Emitting Diode:発光ダイオード)や感光センサーなどの部品を接続し,マイコン内蔵のフラッシュROMにプログラムを書き込むと,接続した部品を自由に操作できる。「組み込みプログラミング」の初歩とも言えるだろう。

 マイコン単独なら数百円で購入できる。ハンダ付けや組み立てに不安を感じる方なら,USBでパソコンと接続可能な評価ボードを利用できる。ボードにはマイコンのほかにLEDやボタン・スイッチなどが実装してあり,パソコン上で動作する開発環境から,USBを経由してプログラムを簡単に書き込める。これがあれば,すぐにマイコンを使ったプログラミングを始められる。

 マイコンでプログラムを動作させるには,マイコンのピンと部品の接続関係をつかみ,マイコンが内蔵するI/O制御機構などを利用してプログラムを書く必要がある。つまり,プログラムを書く過程で,ハードウエアの動作原理,操作法を身につけることができるのだ。

 プログラムはアセンブリ言語かC言語で作成する。機能を抽象化したクラスなど存在しない。メモリー上の特定ビットを操作するなどの方法で,プログラムを作っていく。

 こう聞くと,「ちょっと敷居が高い」と感じるかもしれない。しかし,マイコンはパソコン用プロセサとは異なり,構造が単純で機能が少ないので,簡単に全容を把握できる。20年前のPC-9801シリーズとはだいぶ形が違うが,機能が少なくハードウエアにアクセスしやすい,という特徴はよく似ている。マイコンはハードウエアを直接操作する感覚をつかむには,もってこいの教材と言える。

 最初のうちは,LEDを光らせるなど,単純なプログラムしか作れないかもしれない。だが,上達すればモノクロ液晶パネルを接続して文字を表示させるなど,いろいろなことができるようになる。さらに上達していけば,マイコン上にオープンソースのOSを実装することも可能だ。自分でOSを実装できれば,OSの役割について理解するだけでなく,実感もできるだろう。

 この記事の冒頭に「パソコンの草創期から経験を積んでいる人は強いなぁ」という私の思いを書いた。同じことを考えている若手プログラマもいるのではないかと思っている。そのような方にこそ,マイコンのプログラムを作ってみていただきたいと思う。20年前に先輩方がプログラムを作りながら覚えたように,ハードウエアの原理を理解できると思う。20年の経験差はすぐには埋まらないが,段々と近づいていくことはできるはずだ。

※          ※          ※

 日経ソフトウエアは2008年1月号の特集で「電子工作でプログラミングを楽しもう!」と題して,この記事で紹介したマイコン・プログラミングについて解説している。全国の書店で販売中なので,マイコンに興味を持たれた方は,どうぞお買い求めいただきたい。また,同特集で使うマイコン評価ボードは,ツクモロボット王国のWebサイトで販売しており,日経ソフトウエア読者限定の特典も用意している。詳しくは日経ソフトウエアのWebサイトをご覧いただきたい。