プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

初めて感銘を受けたプログラム


gbadev の News を見て、GBAUNIX を移植した人がいることを知る。


http://www.kernelthread.com/publications/gbaunix/


しかもだたの移植ではなく、PDP-11のエミュレーションを行い、古い UNIX System のファイルシステム及びアプリケーションがそのまま動く。
そのままだと遅いので、DMAを使ったり、いろいろ性能改善。
世の中にはすごい人がいっぱいいるものです。。


初めてUNIXカーネルのソースコードを見たのは、会社に入って数年ぐらいしてからだった。
それまでUNIXどころかOSそれもカーネルのソースなんて見たこともなかった私は、OSは非常に複雑なもので、そんなに簡単に理解できるものではないと思っていた。
そんなUNIXカーネルを自社のワークステーションに移植する仕事を任された私は、この先に待ちかまえているであろう困難に暗い気持ちになっていく。
まだ会社に入って数年であり、仕事に対する自信もなかった時代だ。


だが、実際に目の当たりにしたUNIXカーネルは、私が想像していたような「化け物」ではなかったのだ。
例えばPIDに対応したプロセス構造体のポインタを返す関数pfind()は以下のような感じだった。
(昔の記憶なので、実際のコードはちょっと違うかもしれない)

/*
 *	Find the process
 */
struct proc *
pfind(pid)
	pid_t pid;
{
	struct proc	*p;

	for (p = pidhash[PID2HASH(pid)]; p; p = p->next)
		if (p->p_pid == pid)
			break;
	return p;
}

もちろんこんな単純なルーチンばかりではなく、カーネルを理解するのは簡単なことではない。
プログラムばかりではなく、UNIXシステムの思想たるものを様々な角度から学ぶ必要がある。
ここではなぜこんな処理をしているのか。深く考えないでいじると、たいてい後でしっぺ返しをくらうことになる。
UNIXは移植性が高いという話からハードウェアへの移植を甘く考えていた我々は苦労してUNIXを移植した。


苦労はしたものの、そこにはカーネルやUNIXの思想といったものがシンプルに表現されていた。
シンプルでありながらクラッシュしたりしない、安定したカーネル。(クラッシュするのはたいてい移植のミスだった)
単純なだけでなく、ハッシュやキャッシュを使って、性能にも注意が払われている。
コードからシステムコールや考え方を理解したことも一度や二度ではない。


「優秀なプログラムほどシンプルで、理解するのも難しくない」
それがUNIXのソースから私が学んだことだ。


それまで優秀なプログラマは常人には理解できないプログラムを操るものと思っていた私は、だんだん仕事のスタイルも変わっていく。
UNIX移植の経験が自信となって、次第に活躍の場も増えていく。
幸いカーネルの構造というものはOSが変わってもそれほど大きく変わらないので、この時の知識は今でもとても役だっている。
この時の経験が今の私を支えていると言っても過言ではない。


GBAUNIXを移植する。
昔の腕はまだ衰えていないかな?
そのうち挑戦してみようかと思う私であった。