【雑文】

『たのしいDelphiプログラミング』

 このところ、Delphiでのプログラミングにちょっとハマッている。
 Delphiは、Windows上で動作するビジュアルプログラミング環境だ。こういった言葉にあまり馴染みのない人には「何のこっちゃ」だと思うが、要するにボタンなどの部品をマウス操作でペタペタ貼ることによってプログラムの枠組みを作ることが出来るプログラミングツールを、こんな風に呼ぶようだ。一口にビジュアルプログラミングと言っても実のところその内容は様々で、単に画面構成を対話的に作成できるというだけのものから、基本的には全くプログラムコードを書かずに各要素の論理的なつながりまでマウスで線を引っ張って指定するというものまである。Delphiの場合は、基本的にはObject Pascalのプログラムコードを本質としながら、かなりの部分までビジュアル環境が支援してくれるという作りになっている。
 他社の処理系で最も近い方向性のものはVisual BASICだと思うし、雑誌の記事などでもよく比較されているようだが、個人的にはDelphiとVisual BASICでは基本思想にかなり違いがあるように思う。Visual BASICはとにかくWindows上でプログラムを簡単に開発することが主眼であるのに対し、Delphiはあくまでも本格的なプログラミング環境としての機能、性能を持つことを前提としながら、それをいかに簡単に扱えるようにするかを追求しているという印象がある。つまり、到達点は近くても出発点が正反対なのじゃないかと思う。

 私は、このDelphiを使うまでマトモにWindows上でプログラミングをしたことがなかった。いや、したことがなかったというよりも、出来なかったのだ。DOS時代から愛用しているBorland C++という処理系は今ではWindows上でのプログラミングにもバッチリ対応しているし、プログラミング言語としてのC++に関してもある程度は使えるつもりなのだが、Windows上でプログラミングをするには、それだけでは話にならないのだ。そもそもWindowsというシステムの内部構造についてある程度知らなくてはいけないし、それに加えて実際にWindowsと対話するためにAPI(Application Programming Interface)と呼ばれる膨大な数の関数(手続き)群の使い方を覚えなくてはならず、本格的にアプリケーションを作ろうと思ったら更にMFCやOWL(どーでもいいので何の略かは書かない)というクラスライブラリにも馴染まなくてはならない。これらについての参考書や資料を余すところなく揃えたらローエンドのパソコンが楽に買えるくらいの金額が飛ぶし、読んで勉強すると言っても積み上げたら1mにもなろうかというボリュームの書籍群である。ある程度本気でプログラミングに取り組んでいたら結局これくらいの本は読むしこれくらいの出費はするものだと思うが、Windows上でのプログラミングではそれが最初にまとめてドーンと来るから厄介なのだ。要するに、最初の一歩を踏み出す部分の敷居が異様に高いのである。
 この敷居の高さを初めてある程度解決してくれたのがVisual BASICであって、これは文句なく画期的な処理系だと思う。しかし、Visual BASICはWindowsプログラミングの敷居を低くするために、色々なものを犠牲にしている。出来上がった実行ファイルの処理速度は遅く、実行時には実行ファイルに加えて専用DLLが必要だったりする。普通に考えれば、これだけ画期的にプログラミングが簡単になったんだからその辺りは仕方のないことだと思える。あちらを立てればこちらが立たないのは、ある意味当然のことだ。しかし、何が何でもWindows上でプログラミングする必要に迫られているわけではない私のような素人プログラマは、その辺が今一つ気に入らなかったりする。プロブラミング言語がBASICというのも、ちょっといただけない。そんなわけで、結局私は長いことWindowsプログラミングに手を出さないままでいた。これからは自分でツールやアプリケーションを作ることもなくなるのかな、などと思ったりもしていた。しかし、そこにDelphiが登場したのだ。
 DelphiはVisual BASICとほぼ同じ程度の簡単さでWindowsプログラミングが出来る。しかも出来上がった実行ファイルはVisual C++などで開発されたものと同程度の実行速度を誇り、実行時に専用DLLが必要になることもない。プログラミング言語はTurbo Pascalを拡張してオブジェクト指向を取り入れたObject Pascalである。はっきり言って、どこにも文句のつけようがない。Delphi1.0Jが発売された時、私はまだDOS環境をメインにしていてWindows自体をロクに使っていなかったにもかかわらず、迷わずこれを購入した。実のところ、マトモにWindowsを使うようになるのがかなり遅れた(95年12月)こともあり、この1.0Jはほとんどインストールしただけで腐らせてしまったのだが、それでも2.0Jが発売された時にはサルのように金を払ってバージョンアップした。諸般の事情でこの2.0Jもしばらく寝かせることになってしまったが、ボチボチとマニュアルを読んで少しずつ感じを掴み、やがてどうやら実際にプログラムを組むところまで到達し、ようやくここへ来て、最初の作品であるZINCが産まれた。…が、その時既に3.0Jの発売予告が雑誌に出始めていた。私は既に何も考えず、自動支払いマシーンと化して金を出し、バージョンアップを申し込んだ。そして…。

 というわけで、私は現在Windowsプログラミング初心者としてDelphi3.0Jとたわむれているわけである。今取り組んでいるのは、以前PC9801 + DOSという環境で作った間違い探しゲーム『うわっちゃー!』のWindowsへの移植。とくに必然性があったわけではないのだが、グラフィックの扱いを練習しようとMAGローダーを作ってみたら案外あっさり動いて面白くなってしまい、そのまま勢いでこういうことになっている。当初は16色画像のみに対応ということで作り始めたのだが、仲間内でのβテストの段階でフルカラー画像への対応を求める声が出て来たため、急遽JPEGにも対応した。一時はどうなるかと思ったが、Delphiに予めJPEG対応コンポーネントが用意されていたため、どうやらこれを継承してカスタマイズするだけで済んだ。MAGとJPEG両方に対応する方策も、コンテナクラスを使ったら実に素直に実現できた。DOS上でCやC++を使ってプログラミングしていた感覚からすると「こんなに楽チンでいいのかな」と思うようなことが多いが、こちらはこちらで以前にはなかった苦労が色々とあったりはするわけで、これはまあやはりこういうものなのだろうと思う。
 膨大な資料と格闘するのを恐れて手をこまぬいていた頃の状況に比べれば、Delphiでのプログラミングはまさにバラ色の環境だが、もちろんそれで全ての問題が解決というわけには行かない。まず困るのは、Windows(Win32)APIの日本語ヘルプファイルがないこと。Delphiにはかなり至れり尽くせりのコンポーネントライブラリが用意されていて、これには当然親切なヘルプファイルが用意されているが、やはり直接APIを使いたい場面は何かと出てくる。しかし、そのAPIの使い方が書かれたヘルプファイルは英語のものしかないのだ。自慢じゃないがこちとらWindowsプログラミングに関してド素人な上にDelphiに関しても初心者で、何とかかんとか手探り状態でプログラミングしているのだ。そこへ持ってきて必要となる情報が英語では、ひっくり返って手足をバタバタさせたくなっても無理はないだろう。英語が全く読めないということはないのだが、1ページ読むのにさんざん時間をかけた挙げ句に「こういうことだと思うけど、もしかすると全く逆の意味かもしれない」という不安にさいなまれたりするので、結果的には全然読めないのとあまり変わらないのだ。仕方なく翔泳社の『Windows95 APIバイブル』という高価で分厚い本を買って来た。この本は全3巻の構成になっていて、第1巻はWin32編、第2巻はダイアログ/メッセージ編、第3巻はマルチメディア編となっている。もちろん、それぞれ1冊でも充分に高価で分厚い。私は当初ケチって前の2冊しか買わなかったため、いざゲームに効果音やBGMを加えたいということになって困り、結局は後で3巻目も買う羽目になった。リファレンスマニュアルというのは、やはり全て揃っていてナンボというものなのだろう。(トホホ) 他にもDelphi関係の参考書などは何冊か読んだので、近いうちに感想など書き留めておきたいと思っている。

 何だかんだ言っても、結局WindowsでのプログラミングとはAPIを理解し、覚えるということに落ち着くようだ。色々とからめ手は存在するものの、このことから完全に解放されるというわけにはどうしても行かない。やがては観念するしかないのだ。
 同じように、DelphiでのプログラミングとはVCLを理解し、その使い方を覚えるということに落ち着く。VCLというのは「Visual Component Library」の略だ。要するにクラスライブラリなのだが、多くの部品(コンポーネント)を画面上で配置し、そのパラメータ(プロパティ)を対話的に設定することが出来るというところがウリだ。実際これはかなり便利で、簡単に使えるというだけでなく、コンポーネントの構造や使い方を理解しやすくする効果も上げているように思う。何しろ各種のプロパティが一覧で並び、それを一つ一ついじると即座に画面に反映されるのだ。これほど解りやすいことはない。
 しかし、VCLがいかに「びじゅある」であろうともそれがクラスライブラリであることには変わりがない。適切に使うためには論理構造の理解が必要だし、構造を理解するためには継承関係を理解する必要があり、更にそれを独自に継承して、再利用可能な形で適切にカスタマイズするためにはオブジェクト指向の考え方を理解している必要がある。DelphiもVCLも、一足飛びにWindowsプログラミングの核心にたどり着けるワープ装置では決してないのだ。
 「それじゃあ、結局は見かけ倒しで、勉強しないとプログラム出来ないんだから今までと変わりないんじゃん」と思われるかもしれないが、これはやはり違う。Delphiを使えば、実行するとウィンドウが一つ開いて、そこにあるボタンを押すと終了するというだけのプログラムならば、ほぼ何も知らなくてもすぐに作れる。従来のやり方だと、これだけのプログラムを作る時点でかなりの知識が必要だった。もちろん、こんなプログラムは何の役にも立たないわけで、これに何かの役に立つ動作や要素を加えなくては意味がないし、それにはそれなりの知識が必要になる。しかし、Delphiでプログラミングしているのならば、そこで必要になった部分を調べて覚えればいいのだ。つまり、Delphiを使えば、文字通り実際にプログラムを作りながら少しずつ勉強して行くことが出来るということである。これは凄いことだよ奥さん。
 例えるなら、Delphiは一気にプログラミングの高みに飛んでいけるワープ装置ではないけれど、目の前にそびえ立つ断崖絶壁を粉砕して階段にしてくれるブルドーザーのようなもの、と言えるのじゃないだろうか。結局自分で登らなくてはならないことに変わりはないのだが、Delphiは従来ニンジャかスパイダーマンでもないと登れそうになかった行程を、普通の人間でも一歩一歩確実に登れて、疲れたら途中で座って休んだりも出来るようにしてくれるというわけだ。ラリホー!

 Delphiにおけるプログラミング言語は、Object Pascalである。その名の通り、Pascalにオブジェクト指向を取り入れたものだ。実際には、PascalをBorlandが独自に拡張したTurbo Pascalの流れを汲んでいることもあり、オブジェクト指向の言語仕様にもBorland独自の部分が多いらしい(そもそもObject Pascalの標準規格が存在するのかどうか私は知らないのだが)。しかし、とりあえずそんなことはどうでもいい。Delphiに搭載されているObject Pascalは、とても使いやすくバランスの良い言語に仕上がっている。
 私はオブジェクト指向言語というとObject Pascalの他にはC++しか知らないのでどうしてもそれとの比較になってしまうが、修得のしやすさでObject Pascalが勝っているのはもちろんのこと、実用性においても優れている部分が多くあるように思える。
 Object PascalとC++には色々な部分に違いがあるが、私が最も重大な差異だと思うのは、クラスの扱い方である。どちらもクラスがユーザー定義の型であることに変わりはないのだが、その扱いと考え方はかなり違っている。C++ではクラスと構造体(Pascalにおけるレコード変数)の区別を事実上なくしてしまい、更に演算子のオーバーロードやユーザー定義の自動型変換を可能とすることで、クラスを既存の型(整数とか文字とか)と完全に同列のものとして扱うことが出来るようにしている。クラスのインスタンスを静的に確保することも出来る。そのため、インスタンスの確保/破棄時にはコンストラクタ/デストラクタが自動的に呼び出される。これによってクラスの使い方の自由度がとても高くなり、適切な実装をすればクラスを利用する最の記述性も非常に高くなる。ただし、その一方で演算子の呼び出しや型変換、コンストラクタ/デストラクタの振る舞いがどう自動処理されるかを常に把握しておく必要があり、これがC++の修得を難しくしている最大の原因だと思う。これに対してObject Pascalではクラスはあくまでもクラスという新しい型で、クラスとして宣言された型はクラス型という特別な型としてしか扱えない。クラス型として宣言した変数は内部的にはポインタ変数で、インスタンスは明示的にコンストラクタを呼び出すことによって確保される。デストラクタも明示的に呼び出す。C++に比べるとクラスの使い方がかなり制限されるわけだが、実用上全く問題はないと言っていいだろう。却って「クラスはこう使うべし」という規範がしっかりと用意されているわけで、迷いが生じる余地がないので修得が容易だし、使うときにも混乱する心配がない。
 どちらがスマートかというと、これは非常に難しい。C++の方が「スマートな記述が可能」なことは確かだし、Object Pascalの方が「キッチリと無駄を省いたスマートな言語仕様」と言えるだろう。C++はとにかく「何でも出来る、どんな風にも書ける」という方向で今でも発展を続けていて、非常にエキサイティングな言語だ。しかし、「ここまで理解すればバッチリ書ける」というラインがはっきりしているObject Pascalに触れていると、「いくら勉強してもまだまだ落とし穴が待っている」感のあるC++は、どこまで行っても「バッチリ書ける」ようにはなれない無限地獄のように見えてきてしまうのだ。それだけ、Object Pascalが実用性と修得のしやすさを兼ね備えたバランスの良い言語に仕上がっているということなのだろうと思う。

 DelphiのメーカーであるBorlandからは、Delphiとほとんど同じプログラミング環境でC++を使えるC++ Builderという処理系も発売されている。これは全くもってDelphiのC++版と言えるもので、統合環境の操作感も全く同じだし、付属しているVCLはDelphiのVCLそのものである。このため、VCLとの親和を図るためにC++の構文が少々独自に拡張されているし、VCLを扱う場合にはやや通常とは異なる記述が必要だったりする。しかし、だからと言ってDelphiをいい加減にC++に対応させたものというわけではなく、C++コンパイラとしてVisual C++などよりもしっかりとANSIに対応しているし、STLも用意され、その気になればMFCやOWLを使うことも可能という、本格的な処理系なのだ。更にはVCLを再コンパイルしたりカスタマイズしたりする場合のために、Object Pascalコンパイラも搭載されているという太っ腹ぶり。「C++で本格的なビジュアル・プログラミングがしたい」という願いを持っていた人には、垂涎ものだろう。
 実は私もこのC++ Builderをしっかりと買い込んでいるのだが、なんとまだインストールすらしていないのである。HDDの空き容量が心許ないというみみっちい理由もあるが、結局のところ現在はDelphiに満足していて、敢えてC++ Builderを使ってみたい気持ちが起きないのだ。だったら買うことないじゃないか、と言われると一言もないのだが、まあそこはそれ、趣味の世界というのはすべからくそういったもので、…ね?(汗)

 なんだか思いの外長々と書いてしまったが、結局言いたいのは「Delphiはイイぞ」ということだけである。それを言うのにこれだけキーボードを叩きまくったのだから、自分で書いていてもなんだかバカらしくなって来たが、とにかくWindows上でプログラミングする全ての人に、Delphiはお勧めである。とくに、プログラミングに興味がある(あるいはDOSや他のOSではプログラミングしていた)が、Windows上でのプログラミングにはちょっと気が退けているという人には、百万馬力でお勧めである。ぜひ! 試してみていただきたい。
 そして、一緒に勉強して、みんなでしあわせになろうよ。(笑)

余談:
 上記のように、ほとんど不満と言える不満もないDelphiだが、ちょっと首をひねっていることが一つある。どうも、Delphi3.0Jのヘルプの中にRTL(Systemユニットなどで定義されている標準手続き/関数)に関する記述がないようなのだ。あれこれと迷って探しても結局見つからなかったので、仕方なく今はDelphi2.0Jのヘルプファイルの一部を追加して使っている。まさか、RTLのヘルプが必要ないと見なされて削られたわけでもないと思うし、これは一体どういうことなのか。何か御存知の方はぜひお知らせください。

1997/11/13

to TopPage E-Mail