Categories Books | Hard | Hardware | Linux | MCU | Misc | Publish | Radio | Repository | Thoughts | Time | UNIX | Writing | プロフィール
GCCプログラミング工房の原稿に使用するコードがまだ完成していない・・。数時間仮眠を取って、いざコーディング。追加するコードは VGA カード上における、アドレス変換の意味を理解するためのものだ。
「画面にテキスト文字が出る」、これはまるでリンゴが木から落ちるぐらい当たり前のことだ。しかし、なぜ文字が浮かび上がるのか?この問いに答えられる人は本当に少ない。恐らく、プログラミング人口の0.1%にも満たないことだろう。
なぜか?答えは簡単だ。ほとんどのプログラマーは、そのような仕組みを知る必要がない。printf と OSが全ての作業を肩代わりしてくれるからだ。
しかし、必要がなければ知らなくても良いのだろうか?確かにほとんどのアプリケーションプログラマーにとって、VGA テキストの技術背景はオタク的知識以外の何物でもない。VGA の存在すら、意識する必要はないだろう。けれども、プログラミングの対象がデスクトップから、組み込み機器に移行すれば、そのような悠長なことは言っておられない。
組み込みの世界に printf という便利な代物はなく、自分の手で作り上げる必要があるからだ(もっとも最近は、組み込みの世界にまで統合開発環境が浸透しており、この限りではないが)。この時必要になるものは、メモリーマップや VGA register programming など、ハードウェアに立脚した知識である。日頃鍛えた「ライブラリー操作術」は、このような場面では、なんの役にも立たないことに驚く人も多いのではないだろうか。
昨今は、オブジェクトやデザインパターンといった抽象的概念が大流行しているようである。若い人が「先輩、ぼくアセンブラーというものを勉強してみたいんですけど、何から読めばいいですか?」と聞こうものなら、「そんなもので飯が食えるか!つべこべ言わずに、Java や Ruby でコードを書けるようになれ」、こんな返事が聞かれることだろう。
確かにそうだ。現代のプログラマーにとって、重厚長大なクラスライブラリーを使いこなせるかどうかは死活問題であるし、物事を抽象化して捉えるトレーニングも必要だろう。しかし、これだけで良いのだろうか?
歳を重ねるごとに痛感することがある。それは「全ての応用は基本の延長線上にある」ということ。基本の体得なくして、応用はあり得ない。
実例を挙げてみよう。オブジェクトや変数は、しばしば「箱」に例えられる。機械語の知識のない読者に対して、古来この「箱」は極めて有効な解説手段として使われてきた。しかし、多くの著者達が行ってきた、この安易な「逃げ」こそが、数多くのプログラマーの卵達を挫折に追いやったのではないだろうか?
箱モデルで、正確に変数・オブジェクトを解説することは不可能である。優秀な学生であれば、箱モデルで書かれた解説を読めば、その矛盾に悩むはずだ。変数への代入、ここまでは分かる。しかし、ポインター変数とは何なのか?参照演算子とは一体何物なのか?共用体ってなんなのよ?「箱モデル本」が、これらの問いに答えてくれることはない。なんという無責任さだろうか。読者はもっと、怒るべきである。
機械語レベルから変数・オブジェクトを捉えると、次のようになる。
変数・オブジェクトの実体は「メモリー」であり、オブジェクト参照の正体は、「間接アドレッシング」である。
「変数・オブジェクト」という抽象概念は、本来アセンブリ言語レベルの知識があって初めて了解することができるものなのだ。それにもかかわらず、誰も「君の頭の中のモヤモヤは、機械語を勉強することで、すべて解決する」とは言ってくれない。今や、機械語を知らずに教壇に立ったり、執筆を担当する人間の方が多いのであるから、無理もないのかもしれないが・・。
私は、自分の頭の中にモヤモヤを抱えることを一番のストレスと感じる人間である。プログラミングにおいて、Blackbox の存在は到底許すことが出来ない。そして、このモヤモヤを解消するためには自力で答えを見つけ出す必要があること、世の中の教科書やインターネット上の情報は殆どあてにならないことを経験的に知っている。
Blackbox を解体し、そのメカニズムを明らかにするためには、膨大な労力と時間が必要である。最深部まで到達することができず、挫折を経験することもしばしばだ。しかし、自力で頂上を制覇した時の快感たるや、言葉では表現できないものがある。文字通り世界は変わる。そして、次なる頂が視界に入ってくる。これが Linus Torvalds 氏が JUST FOR FUN で語っていた「Let there be light!」である。
私は、この感覚を一人でも多くのプログラマーに体験してもらいたいと切に願っている。VGA register programming は、「光」を見るために必要な道のりのひとつ。しかし、敵は手強い。メモリープレーンの切り替えに失敗しちゃったよ・・涙。という具合で、日曜日の朝を迎える。