どのコンパイラで FreeDOS カーネルを作るべきか

というような検証を先週末にダラダラやってたり。しかも出先で。

内容は FreeDOS の kernel 2035a を各種コンパイラコンパイルし、そのファイルサイズとメモリ常駐量(というか起動時の空き基本メモリ)を比較する、というものです。

とりあえず kernel.sys のファイルサイズから。ふたつ数値が並べてありますが、UPX圧縮時/無圧縮時のサイズとなっております。
当然ながらファイルサイズの小さいほうがよりうれしい結果となります。

Turbo C 2.0Turbo C++ 1.01Borland C++ 5.0Visual C++ 1.52OpenWatcom 1.3
FAT16,808642288/7334842482/7350842177/7275843956/7290242967/64557
FAT16,18642147/7142842271/7141241898/7042243642/7111642758/63333
FAT16,38642601/62389
FAT32,808644534/7812644850/7841444455/7753646336/7728045378/68602
FAT32,18644395/7614244608/7623844204/7513645985/7543045192/67326
FAT32,38645074/66158

続いて各カーネル起動時の基本メモリ。これは起動時に vmap で表示されたコンベンショナルメモリの最大空きエリアのサイズ。数値が大きいほどうれしい。
config.sys は以下の通り。

rem dos=high
rem device=fdxms.sys (or himem.sys)
files=20
buffers=20
rem screen=0x12
Shell=a:\command.com a:\ /P /E:256

command.com は ke3035a 付属の FreeCom 0.82 pl 3 XMS_Swap を使っています。XMS ドライバも何も突っ込んでないので FreeCom 全体がメモリに残りまくり(約80Kバイト)。
参考として MS-DOS 6.2/V と Windows98SE 日本語版の結果も載せておきます(条件を同じにするため、DOS 付属の COMMAND.COM ではなく FreeCOM を使用しています)。

Turbo C 2.0Turbo C++ 1.01Borland C++ 5.0Visual C++ 1.52OpenWatcom 1.3MS-DOS 6.2/V (FAT16)
Win98SE JPN (FAT32)
FAT16,8086504416504048504720507104510656510880
FAT16,186505680505408506240508240511344
FAT16,386511984
FAT32,8086499856499312500112502928506704494032
FAT32,186501168500752501696504128507440
FAT32,386508272

やや主観的な不等号づけで評価すると、こんな感じでしょうか。(左側にいくほどよい評価)

  • カーネルサイズ(無圧縮):WC<<<<<BC5<VC15<TC2<TCPP
  • カーネルサイズ(UPX 後):BC5<TC2<TCPP<WC<<VC15
  • 基本メモリの空き容量  :WC>>VC15>>BC5>TC2>TCPP

OpenWatcom で作った FAT16 カーネルMS-DOS に匹敵する空きメモリ量だったりすることにやや驚いたのでした。意外とやるもんですね。UPX 時の圧縮率がいまいちですが、メモリが手狭な DOS 環境では空きメモリの多さが正義と申せましょう。
ということで個人的には OpenWatcom おすすめ。

…ねむすぎる。すこし仮眠を――起きられるのか?