私が愛した?OS達(黎明編)

x86CPUの誕生から使い続けて30年のKASAです。

 

 

還暦を直前にして、今までかかわってきたOS(オペレーティングシステム)について語ってみようかと思います。
今回は初回ということでOSではありませんが、
私の原点とも言えるPC-98の8086ニーモニックから。

 

私が大学の卒業研究をしていた頃は、PCが16Bit化されその上でDOSが動くという世界でした。
その年NECが最新のPCとして、
Intel8086CPU互換の16BitCPUを搭載したPC-9801というその後日本を席巻するPC98シリーズの初代が発売された年だったと思います。
Intel8086は今のパソコンのCPUの直接の祖先ですね。
(x86の86はここから来ています)
ゼミではその最新のPCを購入して研究に利用することになったのですが、
貧乏なゼミだったのでPCを買うのに予算を使い果たし、
コンパイラを購入する予算がありませんでした。
研究内容は行列計算の類なのですが、
グラフィック(GUI)担当のメンバーはN-98Basicというインタプリタでなんとかなりそうでしたが、
肝心のデータ演算部を作るのにコンパイラがない、
かといってBasicなんかで作ってたら遅すぎて使い物にならない…
そこで教授から言い渡されたのは
「KASA君申し訳ないがPCに元々ついているニーモニックでやってくれ」
の一言。
これはもう非情の一言でしたね、
二ーモニック≒簡易アセンブラ(機械語)ということですから。

 

高級なアセンブラならジャンプ先にラベルが使えたり、
変数名が使えたりします。
しかし98のニーモニックはジャンプもアドレス指定、
メモリ参照もアドレス指定、
辛うじて命令とレジスタ名だけが文字でOKというほぼ機械語直打ちに近い状況だったのです。
この状況で行列計算をするというのは、
ある程度知識のある人なら絶対にやりたくないと思うでしょうね。
この日から配列をどうメモリアドレスに割り付けるか、
コンパイラがやってくれる作業を人力でコツコツやることになりました。
研究内容は、当時の大型コンピュータでやっているものを、
非力なPC(PCとしては最新)でさせてみようという結構無謀な挑戦でした。
(16BitCPUで5MHzで駆動、128KBのRAMという非力なものでした)
もちろん元になる公式も高速化に寄与するものでしたが、
それだけでは不十分で最適化も併せて考える必要もありました。
基本的に行列計算はメモリを大量に必要としますし、
計算コスト(回数)も多いです。

 

やってみるとわかるのですが、
実際は配列上のデータで実際有効なのはその一部に過ぎないですし、無駄な計算も多いです。
通常は汎用的に実装するため無駄を含んだままプログラムします。
(公式をそのまま実装する)
少ないリソースで動かすため公式を書き直し、
配列上の利用しないエリアを見つけてメモリにマップしないように、
メモリに乗せていないエリアを計算で参照しないように(スワップ処理)と、
OSでするような部分も実装しました。
もちろん計算方法も高速化しました。
工夫の結果、教授が考えていたレベルを上回る結果となり学会発表を勧められましたが、
夏休みに原稿を作る必要があり、
どうしても遊びたかった私は丁重にお断りしました。
学会発表してたら大手企業に就職できたかもしれませんが、
その時は学校の先生を目指してましたので気にしてませんでした。
結局とある事情で教員採用試験には合格するも教員免許が取れない、
という間抜けな結果となり現在に至るのですが(笑)
おかげ様でこの時の経験からコンピュータの動作を細かく知ることができ、
プログラミングする上でより深い知識の元になりました。
気合をいれればOSなんかなくてもなんとかなると思えましたし
(今となっては複雑過ぎて無理ですが(笑))
この経験がなければそれ以降のOSのポーティングやドライバ開発なんてできなかったと思います。