[home] [back]


コンパイラに1円も払わない窓プログラミング

UNIXではgccがタダで使えるんだから、 WindowsでだってVC++になんか金を出せるか、と思っていた筆者だが、Borland C++ Compiler 5.5の無料配布をきっかけに、 こいつで窓プログラミングをしてみよう、と思い立った。 それに、Cygwinでだって窓プログラム書けるんでしょ? そうです書けます。

これは、そんな筆者によるメモです。 残念なことに、 このような情報は(特に日本語では)ほとんど存在しないようなので、 同じような境遇の人の助けになることと思います。

念のため付け加えておくと、この道はいばらの道です。 窓プログラミングを体験してみたいが金がないという場合にも、 投入する時間を考えるとVC++を買った方が安上がりかもしれません。 (とはいえ、筆者がかきわけた道を通るのは幾分楽なはずですが)

あ、UNIX触ったことがないとか、プログラム書いたこともないとか、 そういう方には(そうでなくても?)死ぬほど不親切なページだと思います。 ですが、自分用のメモ+αですので、この程度が限界です。 意見・質問等のメールは大歓迎ですが、 時間的・能力的に期待に沿えるとは限りませんのであしからず。


はじめに

Borland C++ Compiler 5.5(以下bcc)というのは、 Borland社が開発した Windows用開発環境Borland C++ Builder 5.5のうち、 コマンドラインツール(の一部)を無料で配っているものです。 これだけでWindowsのアプリケーションを作ることができます。

Cygwinというのは、UNIXのシステムコールを実現するようなWindowsのDLLを提供し、 UNIX用のソースを変更なしにコンパイルすることで Windowsで動くバイナリを作れるようにしよう、 というプロジェクトです。 gccやgdbが動いており、必要最低限のWindows用開発ツールも提供されています。

最初に両者の欠点について述べておきます。 耐えられそうになければ、VC++でも買ってください。

こんな感じでしょうか。 何か筆者の誤解している点がありましたら、ご連絡いただけると助かります。

この記事ではCygwinのツールを使うことをかなり前提にしています。 bccと、Windows標準のツールだけでも同じことができるはずですが、 その際には適宜読み替えてください(rmをdelとするなど)。 また、makeを使ったプログラム開発の経験も前提にしています。

参考までに筆者の環境を書きます。 Celeron466MHz/128M/Windows2000のマシンで、 shellはbashを使い、 コンパイルはGNU makeで行っています。 今のところbccもgccも同程度使っています。


必要なもの

これ以外のものを使っても構いませんけどね(例えば、Linux上でクロスコンパイラで開発とか‥)。


ダウンロード

この文章の最後のリンク集を参考に、必要なものをダウンロードしましょう。 bccは8M程度、Cygwinはsnapshotを含めて25M程度です。 Platform SDKはフルパッケージで550M程あります。 必要な部分だけダウンロードしてくれるインストーラもありますが、 ヘルプだけでも130M程あります。 接続状況的にどうしても無理ならあきらめましょう。 コンパイラだけあればコンパイルはできます。

bccのreadme.txtに書いてあるのですが、 Borland C++Builder documentation site からヘルプをいくつか取ってきた方がいいかもしれません。


インストール


プログラミング

初めてWindowsプログラミングをする方は、 本やウェブページなどを参考に頑張ってください。 MFCでへろへろ書いているものは参考になりません。 SDKとかAPIとかいうキーワードをたよりに探してください。 もしくは、Platform SDKのヘルプだけでも何とかなるかもしれません。

実際にプログラムを書いてみて困るのは、 ウインドウのデザインをどうやるかということです。 こればっかりはGUIの方がいいに決まってますが、 そんなものはbccにもCygwinにもついてきません。 一応、Platform SDKのツールとしてダイアログエディタがついてきますが、 これはWindows3.1時代の遺物で、動きはするものの使用に堪えません (置けるコントロールも限られていますし‥)。 現在はあきらめてテキストエディタでリソースファイルを書いてます。


コンパイル

適当なソースを拾ってくるなり、自分で書くなりして、コンパイルしてみましょう。 適当なものが見当たらなければこれでもどうぞ。


デバッグ

Platform SDKに含まれるspyを使うと、飛んでいるメッセージを見ることができます。 自分のプログラムが思い通りのメッセージを出しているかを調べたり、 他のアプリケーションがどんなメッセージをやりとりしているのかを学べたりと、 なかなか有用なツールです。 しかし、VC++付属のspy++に比べると非常に使いにくく、 もう少しなんとかならんかったのか、という気がします。


ベンチマーク

コンパイラの性能はどうなのか、調べてみました。 以下は、やる気のないプログラムをコンパイルし、 timeコマンドで実行時間を測定した結果です。 測定はCeleron466MHz/128M/Windows2000なマシンで行いました。

gcc:         4m33.463s
gcc -O2:     2m28.964s
bcc -Od:     3m35.329s
bcc:         2m34.252s
bcc -O2:     2m21.093s
bcc -O2 -4:  2m21.854s
bcc -O2 -5:  2m36.225s
bcc -O2 -6:  2m23.366s

bccは、デフォルトで色々な最適化がされてしまうので、 最適化をさせないためには-Odオプションをつけなくてはなりません。 bccの-4,-5,-6はそれぞれ486,pentium,pentium pro用のバイナリを吐くのですが、 386用のバイナリよりかえって遅くなってしまっています。 -O2同士でならbccの方が速いバイナリを作れるようです。

次に、実際のアプリケーションについて見てみます。 mp3エンコーダーのlame 3.67betaを両者でコンパイルして、 手元にあった6分程度のwavファイルをエンコードしてみました。 どちらもコンパイルオプションは-O2のみとしました。

LAME version 3.67 (www.sulaco.org/mp3)
GPSYCHO: GPL psycho-acoustic and noise shaping model version 0.77.
Using polyphase lowpass filter,  transition band:  15115 Hz - 15648 Hz
Encoding ./hide/track_01.wav to ./hide/track_01.wav.mp3
Encoding as 44.1 kHz 128 kbps stereo MPEG1 LayerIII (11.0x)  qval=5
    Frame          |  CPU/estimated  |  time/estimated | play/CPU |   ETA
 13705/ 13705(100%)| 0:03:33/ 0:03:33| 0:03:34/ 0:03:34|    1.6801| 0:00:00
LAME version 3.67 (www.sulaco.org/mp3)
GPSYCHO: GPL psycho-acoustic and noise shaping model version 0.77.
Using polyphase lowpass filter,  transition band:  15115 Hz - 15648 Hz
Encoding ./hide/track_01.wav to ./hide/track_01.wav.mp3
Encoding as 44.1 kHz 128 kbps stereo MPEG1 LayerIII (11.0x)  qval=5
    Frame          |  CPU/estimated  |  time/estimated | play/CPU |   ETA
 13705/ 13705(100%)| 0:02:08/ 0:02:08| 0:02:09/ 0:02:09|    2.7866| 0:00:00

lameにはbcc用のアセンブリコードが含まれていませんので、 上の結果はその分bccに不利です。 gccでも、quantize-pvt.cで同じコードを使わせてみたところ、

LAME version 3.67 (www.sulaco.org/mp3)
GPSYCHO: GPL psycho-acoustic and noise shaping model version 0.77.
Using polyphase lowpass filter,  transition band:  15115 Hz - 15648 Hz
Encoding ../../../hide/track_01.wav to ../../../hide/track_01.wav.mp3
Encoding as 44.1 kHz 128 kbps stereo MPEG1 LayerIII (11.0x)  qval=5
    Frame          |  CPU/estimated  |  time/estimated | play/CPU |   ETA
 13705/ 13705(100%)| 0:02:51/ 0:02:51| 0:03:00/ 0:03:00|    2.0980| 0:00:00

となって、やはりbccの方が遅いという結果になりました (ソースを把握しているわけではないので、 他にもgccの方が有利な個所があるのかもしれません)。 コンパイルオプションをいろいろ試してみましたが、 あまり変わりませんでした。 他のアプリケーションでも試してみたいところです。


ほかに気づいたこと

gccでエディットコントロールを作るとゴミが出るような気が。 どうやらwindresのバグ‥というかsyntaxが違うようだ。 brc32でresファイルを作って、 windresでresからcoffに変換するとうまくいった。なんじゃそりゃ。


付録


リンク集

hanawa<y@hnw.jp>

$Date: 2003-12-10 03:12:22 $