━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ いざというときに役立つMS−DOS 執筆:速星 千里 第85号(2007.08.02) 最小のプログラム ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ <目次> ■ はじめに ■ 最小のプログラム ● C言語で書いてみる ● DEBUGコマンドを使ってみる ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ はじめに ------------------------------------------------------------------------ 皆さん、お久しぶりです。速星です。 実に半年ぶりの発行となってしまいました。申し訳ありません。 ネタはいくつかあるのですが、暇がとれず、ずるずると執筆が先延ばしになって しまっていました。 第83号でも記しましたように、気まぐれな不定期発行にはなってしまっていますが、 休刊や廃刊にするつもりはありません。どうか気長にお付き合い願います。 (編集後記に続く) さて、今回のテーマは「最小のプログラム」です。久しぶりの発行ということで、 リハビリも兼ねて、軽めの話題をお送りします。 軽めの話題とはいえ、DOSの威力が良く分かるテーマだと思いますので、ぜひ、 実際に手を動かして試しながら読んでみて下さい。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ 最小のプログラム ------------------------------------------------------------------------ 読者の皆さんの中には、C言語やJavaなどといったプログラミング言語を使って プログラムを作ってみたことがある、という方も多くいらっしゃるでしょう。 プログラムを書いてみると、気になるのが実行ファイルのサイズです。 大した作業をしないプログラム、例えば「Hello, World!」を表示するだけのプロ グラムでも、コンパイルして実行ファイルにしてみたらファイルサイズが何キロ バイトもあって驚いた、という経験をお持ちの方もあるかもしれません。 では、実行ファイルのサイズが最小になるプログラムは、どんなプログラムでしょ うか? まず、実行内容からいえば「何もしないプログラム」が最小のはずですね。これは すぐに想像がつくと思います。 では、どんな言語でどんな書き方をした場合に、実行ファイルが最も小さくなる でしょうか? ------------------------------------------------------------------------ ● C言語で書いてみる まずは、プログラムの内容の確認も兼ねて、C言語で書いてみましょう。 > void main(void){ > } はい、これだけです。わずか2行。簡単ですね。 けれども、コンパイルしてみるとあら不思議、実行ファイルは何十キロバイトも のサイズになってしまいます。 例えば、私の手元にある「Visual Studio 2005」でコンパイルしてみたところ、 ファイルサイズは44キロバイトになりました。 何もしないのに、こんなに大きなサイズになってしまうのはなぜでしょうか? それは、プログラムを実行するための準備作業をする部分、あるいは実行後の 後片付けをする部分などが自動的に付け足されるためです。 何もしないプログラムなので準備も後片付けもいらないはずなのですが、機械的 に付け足されてしまいます。 ------------------------------------------------------------------------ ● DEBUGコマンドを使ってみる では、先程と同じことをアセンブラ(アセンブリ言語)で書いてみましょう。 アセンブラには、幅広いバージョンのWindowsに標準装備されている、DEBUGコマ ンド(※)を使うことにします。 コマンドプロンプト上で、下に示した見本と同じようになるように入力してみて ください。 > E:\>debug > -a 100 > 34C2:0100 int 20 > 34C2:0102 > -n mini.com > -r bx > CX 0000 > :0000 > -r cx > CX 0000 > :0002 > -w > 00002 バイト書き込み中. > -q > > E:\> はい、お疲れ様でした。 C言語で書く場合よりも、ちょっと面倒だったかと思います。 それでは、カレントフォルダに実行ファイル「mini.com」ができていますので、 ファイルサイズを見てみましょう。 > E:\>dir > ドライブ E のボリューム ラベルがありません。 > ボリューム シリアル番号は FCB0-7832 です > > E:\ のディレクトリ > > 2007/07/31 17:47 . > 2007/07/31 17:47 .. > 2007/07/31 17:47 2 MINI.COM > 1 個のファイル 2 バイト > 2 個のディレクトリ 10,737,418,238 バイトの空き領域 > > E:\> わずか2バイト! ファイルサイズはC言語で書いたときの2万分の1以下と、アセンブリ言語の圧勝 です。 実はこのプログラム、DEBUGコマンドで作成したというところに、からくりがあり ます。 DEBUGコマンドでは拡張子「COM」の実行ファイルしか作成できないのですが、 この「COM」ファイルの場合、先ほどC言語で作成した「EXE」ファイルと異なり、 プログラムを実行するための準備作業をする部分や、実行後の後片付けをする 部分などを付け加える必要がないのです。 付け加えなかった部分の作業は、実行時にDOSが肩代わりしてくれます。 おそらくこの「2バイト」というのが、機械語のプログラムファイルのサイズの 最小記録でしょう。 ひょっとして、一見時代遅れなDEBUGコマンドが新しいバージョンのWindowsにも 搭載されて続けているのは、この記録のため……なんてことはないですよね。 (※)用語解説 ・DEBUGコマンド DOS上でアセンブラ言語を扱うために用いるコマンド。 特別号参照: http://www.geocities.jp/tetrahedrane/column/dos/dos45a.txt ------------------------------------------------------------------------ 今回はここまでです。 お疲れ様でした! 実はこの「最小のプログラム」には別の答えがあったりします。 それについては次回発行で。 (「はじめに」の続き) 半年ぶりのメルマガ、いかがでしたでしょうか。 実は、発行スタンドとして利用させていただいている「まぐまぐ」には 「半年間発行していなかったら休刊扱いにする」 というルールがありまして、7月末で休刊ということになってしまっていました。 ということで、慌てて執筆した次第です(汗) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■ コメントをお待ちしています ------------------------------------------------------------------------ 皆さんからの感想・質問・要望をお待ちしています。 「こんなテーマを扱ってほしい」 「こんなことはできるの?」 「このへんが分かりにくかった」 「1回の分量を増やしてほしい/減らしてほしい」 など、掲示板(下記URL)まで気軽にお願いします。 http://otd9.jbbs.livedoor.jp/dos/bbs_thread (スレッド表示) http://otd9.jbbs.livedoor.jp/dos/bbs_tree (ツリー表示) メールでもコメントを受け付けておりますので、そちらもご利用下さい。 tetrahedrane@yahoo.co.jp なお、いただいたコメントは、本マガジン上で引用する場合があります。 (メールアドレスやお名前は一切公開いたしません) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● 感想・質問宛先 http://otd9.jbbs.livedoor.jp/dos/bbs_tree tetrahedrane@yahoo.co.jp ● 広告募集 当メルマガへの広告掲載をご希望の方は、下記アドレスまでお願いします。 tetrahedrane@yahoo.co.jp ● メルマガ交換広告募集 当メルマガとのメルマガ交換広告をご希望の方は、下記アドレスまでどうぞ。 tetrahedrane@yahoo.co.jp ● 登録・解除・バックナンバー http://www.geocities.jp/tetrahedrane/column/dos/ このメールマガジンは、『まぐまぐ』を利用して発行しています。 http://www.mag2.com/m/0000106066.htm (c) 2003-2007 Chisato Hayahoshi