図1●プログラミングの模式図。
あらかじめわかっていることと,調べてわかることを分け,処理すべきことを順序立てて並べる
図2●プログラム部品の利用イメージ。
Webブラウザと同じように,プログラム内で使うWebアクセス用の部品にもURLを与えたりページ内容を取り出すインタフェース(API:Application Programming Interface)がある
図3●一般的にはライブラリを利用してプログラムを作る
図4●Win32 APIの上に独自のライブラリを用意してプログラムを作る場合もある
図5●Visual Basic 6.0のユーザー・インタフェース
 パソコンを使っていて,自分が本当にやりたいことと,市販のソフトウエアでできることの間にギャップを感じたことはありませんか。もっと自由にパソコンを操作したい,思い通りに動かしたいと感じたことはありませんか。この連載ではそうした人に向け,プログラムで自在にパソコンを操る方法を解説していきます。

 プログラミングというと,とても難しいものと思いがちです。昔は確かに高度な知識と根気を要する作業でしたが,今では言語やツールの進化でずいぶん簡単になりました。

 それが証拠に,開発ツールをパソコンにインストールして,文字を表示するプログラムを作り,それがどれくらい簡単にできるかを実感してもらうというのが世の中の「プログラミング入門」の相場です。

 しかし,こうした表面的な知識だけでは決して上達しません。プログラムがどうやって動いているのか,その背後にある仕組みへの理解がどうしても必要です。そこで今回は,プログラムとは何かを考え,C#を支える最新のWindowsプログラミングの仕組みを説明します。

パソコンを使うことはアプリケーションを使うこと?

 パソコンを使って計算をしなさいといわれたらみなさんはどうしますか? Windowsパソコンならまずアクセサリにある「電卓」を使う方法があります。大抵のWindowsパソコンには標準で入っていますし,四則演算なら十分にこなせます。この電卓は関数電卓機能も持っているなどなかなか高機能です。

 では,2000万円を年利2.5%の30年ローンで借りた場合,月々の返済額がいくらになるかを知りたいといわれたらどうしますか? 計算方法を知っていれば電卓と「メモ帳」の組み合わせでなんとかなりそうです。しかし,さらに年利を変えて比較したり,借入額を変えてみたり,返済期間を変えてみたり…ということをしたいといわれたらどうでしょうか。電卓とメモ帳ではちょっと面倒そうです。こんなときには表計算ソフトを使えばずっと簡単に計算できます。

 多くのパソコン・ユーザーにとって,パソコンを使うということは,このように誰かが用意してくれたアプリケーションやサービスを使うことです。新製品や新サービスがどんどん登場していますから,パソコンを使ってできることもどんどん多彩になります。住宅ローンの管理だけでなく,現在の収入と支出の状況から,子供の成長までも考慮した人生設計を立ててくれるアプリケーションまであります。

 パソコンにちょっと慣れた人なら,複数のアプリケーションやサービスを組み合わせることもごく当たり前にこなしていることでしょう。例えば,パソコンからインターネットに接続できるなら,取引のある金融機関の住宅ローンの金利を調べ,最新の情報で比較することもできるでしょう。Webサイトにはほとんどの金融機関が最新の利率を載せていますし,ローン返済のシミュレーション機能そのものを用意しているところもあります。検索サイトなどを活用すれば,想定したものより有利なローンを見つけられるかもしれません。

便利な部品の組み合わせで作れる

 しかし,これがいつもいいやり方だとは限りません。確かに一回限りのローン計算なら,表計算ソフトとWebブラウザを立ち上げて金利を書き写すのが現実的です。でも同じ計算を毎日,あるいは毎週繰り返したい場合はどうでしょう。そのたびにホームページで金利を調べ,前回から変動があったかどうかを確かめて,変動があれば計算し直すという操作を金融機関の数だけ繰り返すことになります*1。一つひとつの操作は簡単なのに,たった二つのアプリケーションを組み合わせるだけでも繰り返し同じ操作をするのは結構な手間になることが想像できると思います。

 プログラムはこのような一連の操作を自動でこなしてくれる魔法の杖のようなものです。一度作ってしまえば,あとは一振り,命令するだけでパソコンが最新の金利を調べ,計算してくれるのです。データを集計してグラフを作ったり,メールで結果を知らせたりすることだってできます。

 先ほどのローン計算の例をもう一度振り返ってみましょう。最新の情報が知りたければインターネットに接続してWebページを読み込んで金利の数値を見つけ出し,これを計算式に代入して返済額を算出するといった手順に分けられます。これをプログラムで自動化するなら,銀行のWebページや返済額の計算式などあらかじめ調べておける材料を使って,実行するたびにこなさなければならない処理を順序立てて並べていけばいいのです(図1[拡大表示])。

 この杖は自分で作らなければなりませんが,心配はいりません。先ほどは表計算ソフトとWebブラウザという,完成品のアプリケーションを例にとってお話ししましたが,プログラミングの世界も考え方は同じです。ある程度まとまった機能を持つ部品が用意されているので,それを組み合わせればいいのです。

 例えば,WebブラウザでWebページを開くときには,URLを入力したり「お気に入り」のリストからページを選んだりします。プログラムの中でも「Webページからデータを読み込む部品」がWebブラウザと似た処理をしてくれます。この部品にURLを教えて,「ここからデータを取ってきてね」と指示すればいいのです。ちょっと工夫すれば「お気に入り」の機能も作れます。

 WebブラウザはURLの入力欄や「お気に入り」リストなどのユーザー・インタフェースからユーザーの指示を受け取って動作しますが,プログラムの中で使う部品にも指示を受け取るためのインタフェースがあります。このようなインタフェースのことを「API(Application Programming Interface)」といいます(図2[拡大表示])。「アプリケーションをプログラミングするためのインタフェース」というほどの意味です。

 プログラミングの最初のステップは,このようにあらかじめ用意されている部品をうまく組み合わせ,順序よくAPIを呼び出す方法を学ぶことです。一つひとつの部品が実現している機能は様々です。ウィンドウに表示されるメニューやボタンなどは見た目にも部品というイメージでとらえやすいですが,Webサーバーと通信する部品のように画面には現れないものもたくさんあります。表計算ソフトの機能を丸ごと部品にしてしまった部品もあります。

 自分の欲しい機能を持った部品が用意されていなければ,既にある部品を組み合わせて新しい部品を作り出すこともできますし,ニーズの高い部品ならば,それ単体で製品として売られていることもあります。

ベースにある部品はOSプログラムで使うことは少ない

 Windowsプログラミングで利用できる部品は標準的なものだけでも数え切れないほどあります。C#プログラミングで利用できるものはその一部ですし,この連載で実際に使うのはそのまた一部に過ぎませんが,C#の良さを知るためにここで全体像を整理しておきましょう。

 アプリケーションを作るための最も基本的な部品はOS(Windows)そのものが提供しています。中でも一番の中核部分にあるのがコンピュータのハードウエアを制御する機能です。例えば,ハードディスク上にファイルを作りたければ,プログラムはOSのAPIを使って「ファイルを作ってね」と頼むだけでいいのです。パソコンにつながっているハードディスクがどこのメーカーのものでも,そして何GバイトのものでもWindowsは間違いなくファイルを作ってくれます。

 別のプログラムが同じハードディスクにファイルを作ろうとすると,OSはまだ使われていない領域を探し出してそこにファイルを作ります。既に作られているファイルを勝手に上書きしてしまうことはありません。これはいろいろなアプリケーションで共用しなければならないハードディスクをOSが区画整理して,どの区画にどのファイルがあるかを記録しておいてくれるからです。

 基本的なハードウエア制御機能のほかにもWindowsのAPIはたくさんあります。一つひとつに名前が付いていますが,全体をまとめて「Win32 API」と呼びます。Windows 95/NT以降のWindowsはすべてWin32 APIを搭載しています。バージョンアップで追加された新機能は新しいバージョンでしかサポートされませんが,それ以外の大部分のAPIセットは共通です。Windowsアプリケーションの多くが一本のプログラムで異なるバージョンのWindowsに対応できるのは,Win32 APIという共通APIがあるためです*2

 Win32 APIを使えばWindowsのすべての機能を利用できるのですが,実際にはWin32 APIだけを駆使してプログラムを書くことはあまりありません。Win32 APIは何しろ数が多すぎるのです。OSの機能が増えれば,それに対応するAPIが必要になるので,数が増えるのには仕方ない面もあります。しかしWindowsのバージョンアップごとに数が増えて,今では万単位で存在します。これではとても覚え切れません。しかも一つひとつの機能はとても単純なので,ちょっとした処理をするにも膨大なWin32APIを呼び出すプログラムを書く羽目になります。

ランタイム・ライブラリがプログラミングの難易度を左右する

 そこで,通常は「ランタイム・ライブラリ*3」と呼ばれる部品集を併用してプログラムを作ります。ライブラリにはボタンやメニューなどのユーザー・インタフェース部品をはじめ,多くのプログラムで共通して使える部品が含まれています。これらは米Microsoftを含めた開発ツールのメーカーが作ることが多く,大抵はいずれかの開発ツールと一緒に使うことを前提に設計されています。

 ライブラリの設計をどのようにするかは各メーカーの設計者の腕の見せ所で,ただ一つの正解と呼べるようなものはありません。時代とともにその受け止め方も変わっていきます。そもそもWin32 APIにも,当時広く使われていたCやPASCALなどの言語から利用しやすいというメリットがあったのです。

 現在は「オブジェクト指向プログラミング」という考え方が広まり,これに対応したライブラリが広く使われています。C++言語での利用に適した形態です。メニュー・バーの付いたウィンドウ・アプリケーションやダイアログボックスなど,まとまった機能を持つひな形をライブラリ化しておき,実際のプログラミングではそのひな形を必要に応じてカスタマイズして使います。Windowsの世界ではMicrosoftの「MFC(Microsoft Foundation Classes)」や米Borland Softwareの「OWL(Object Windows Library)」がよく知られています。これらのライブラリがあっても,ライブラリ化されていない機能を使う場合にはやはりWin32 APIでのプログラミングが必要です。しかしライブラリで用意されているような,型にはまったアプリケーションならば効率的に作れます。実際に今でも様々なアプリケーションの開発に利用されています(図3[拡大表示])。

 一方,Win32 APIを全く使わずにプログラムを作れるライブラリもあります。例えばVisual Basic(VB)がこの形態を採っています。C++のプログラムにとって,ライブラリは必要に応じて利用すればよい受動的な部品に過ぎませんが,VBのプログラムにとっては,プログラムを動かすために不可欠なエンジンのような存在です(図4[拡大表示])。VBは「とにかく手っ取り早くアプリケーションを作れる」ことが特徴で,ランタイムだけでなく言語の仕様や開発ツールも簡単さを重視して作られ,多数のユーザーを獲得しています(図5[拡大表示])。