豊田 孝

 前回は,.NETの世界を理解するためには,「クラス」に関する知識が必要なことをお話しました。今すぐにでもクラスについて本格的な説明を始めたいところなのですが,今回は,10行程度の小さなサンプル・プログラムを紹介しながら,これまでのプログラミングの歴史の中で重要な役割を果たしてきた「関数」について説明します。一部の方は,関数の知識などは.NETの世界を理解するために何の役にも立たないのでは?と思っていることでしょう。本連載を最後まで読めば分かりますが,.NETの世界は,「関数の役割を変更している世界」でもあるのです。

本日のサンプル・プログラムの機能

 すべてのプログラムは何らかの目的を持っていますから,ここでは,次のような機能を持つサンプル・プログラムを作成することにします。

“連載名と連載回数を表示する”

 単純とはいえ,サンプル・プログラムに搭載する機能をはっきりさせました。次に,プログラムが動作するプラットフォームと開発環境について考えます。なお,第4回ではこの機能とまったく同じ機能を搭載するC++サンプル・プログラムを紹介することになっていますが,発想の転換が必要になることを覚えておいてください。

プラットフォームと開発環境

 本日のサンプル・プログラムがターゲットとするプラットフォームはWindows 2000/XPとし,開発する環境は,Visual Studio.NETとします。

 Visual Studio.NETは,コンソール・アプリケーション,Windowsアプリケーション,Webアプリケーション,そしてXML Webサービスまで開発できる巨大なプログラミング環境です。この環境では,Visual Basic,C/C++,JScript,あるいはC#など,複数のプログラミング言語が使用できます。

 なお今回は,Visual Studio.NETが提供する.NET対応プログラム作成機能とMicrosoft言語拡張機能を一切無効にしています。このため,本日のサンプル・プログラムを実行すると,ANSI(米国規格協会)仕様準拠のCコードを作成する旨のメッセージが出ます。

 開発時に作成したプロジェクト・ファイルはダウンロードできるようにしてありますから(ダウンロードはこちら),後日自分の目で動作を確認されてください。

 それでは次に,サンプル・プログラムの実装方針を決めます。

サンプル・プログラムの実装方針

 本日のサンプル・プログラムは,関数と.NETの関係を考える目的を持っていますから,次のような実装方針をとり,分かりやすいプログラムを開発することにします。

・プログラミング言語はCとする
・ユーザーからのデータ入力は受け付けない
・連載名と連載回数は標準出力装置(コンソール)に表示する
・エラー・チェックは行わない
・関数からの戻り値は一切無視し,条件判定や分岐は行わない
・関数は再利用部品であることをはっきり分かるようにする
・再利用部品としての関数は別ファイルに宣言し,定義する
・変数名と関数名はプログラミング初心者でも理解できるものとする

図1●サンプル・プログラムの実行画面
 ご覧のように,本日のサンプル・プログラムはC言語で記述したコンソール・アプリケーションとなります。それでは,完成したソース・コード(リスト1)と実行画面(図1[拡大表示])を見てみましょう。

リスト1●ソース・コード
#include "mainheader.h"

int main(void)
{
  int Kaisuu;
  Kaisuu = 2;

  checkcompilerinfo( );

  showVariable(Kaisuu);

  return 0;
}

 それでは,このサンプル・プログラムの特徴を“関数”という視点から説明します。

サンプル・プログラムの特徴

 このサンプル・プログラムでは,次のようなコードが使われています。

checkcompilerinfo( );

showVariable(Kaisuu);

 これらはいずれも関数です。一見すると分かるように,カッコ()の中に入っている情報に微妙な違いがあります。例えば,最初の関数checkcompilerinfo()のカッコの中には何も入っていませんが,2番目の関数はshowVariable(Kaisuu)となっており,カッコ内にKaisuuという情報が入っています。このような情報を引数と呼んでいます。

 一般に,関数は特定の処理を実行し,その結果を返すといわれています。これは,関数を使用する側の立場に立てば,関数内部でどのような処理を行っているかは重要なことではなく,結果さえ返してくれればよい,ということになります。また,関数は繰り返し使われる,つまり,再利用される便利なソフトウエア部品であるとも言えます。この再利用という考え方をさらに推し進めたのが,COM(Component Object Model)であり,.NETの世界といえます。

 ところで皆さん,実はここに紹介した関数以外にもう1つ別の関数があるのですが,分かりますか?それは,次の関数です。

int main(void)

 この関数と上に示した2つの関数の間にはたいへんな違いがあります。上の2つの関数名は親しみやすい名称を持っていますが,この関数の名称であるmainはどうでしょうか。実は,この関数名は,プログラマが勝手に付けられないのです。それどころか,このmain関数は,OSとの窓口という重要な役割も持っています。詳しくは本稿の最後で説明します。

 それでは,名前を自由に付けることができる2つの関数と特殊なmain関数の間には,どのような関係があるのか考えてみましょう。

 showVariableなどの通常の関数は,main関数の中カッコ“{ }”内に記述されています。これは,main関数が内部で2つの関数を使用していることを意味します。このように,関数がその内部で別の関数を使用することを,“関数を呼び出す”という言い方をします。それでは,ひとまずここで,これまでの説明内容を整理しておきましょう。

“基本的に関数は,引数という情報を受け取り,必要な処理を行った上で,処理結果を報告する再利用部品である。関数は別の関数を内部で呼び出すことができる”

 以上で関数についての説明を終了し,本日のサンプル・プログラムと.NETの関係を考えます。

Cサンプル・プログラムと.NETの関係

 先の関数の説明の中で,main関数という特殊な関数に触れ,その関数は内部で2つの関数を呼び出していると言いました。main関数は特殊ですが,関数であることに変わりはありません。ならば,このmain関数を呼び出すのはいったい誰でしょう?回答は次のとおりです。

“特殊な関数であるmain関数を呼び出しているのは,OSである”

図2●サンプル・プログラムをVisual Studio.NETのデバッグ環境で実行
 本日のサンプル・プログラムをVisual Studio.NETのデバッグ環境(より正確には,ステップ・イン・モード)で実行すると,図2[拡大表示]のような情報を得ることができます。

 図2は,サンプル・プログラムが動作を開始すると,main関数が最初に呼ばれることを示しています。このため,“main関数はOSへのエントリ・ポイントを提供する”と言うことがあります。そして.NET時代に入った今,このようなOSから直接呼ばれる関数を持つプログラムは,「アンマネージド・コード」と呼ばれます。アンマネージド・コードというのは,管理されないコードという意味ですが,多くの人は次のような疑問を持つはずです。

“本日のサンプル・プログラムは管理されないコードといわれるなら,いったい誰によって管理されないということなのであろうか?また,管理されないコードがあるならば,管理されるコードというのはあるのだろうか?”

 これらの解答は次回説明します。

 本日は,Visual Studio.NETの.NET対応コード生成機能とMicrosoft言語拡張機能を一切無効にした上で,コンソール・アプリケーションを作成してみました。作成したサンプル・プログラムは,単純であるがゆえに,OSとの密接な関係を端的に示しています。次回は本日のサンプル・プログラムを「マネージド・コード」(管理されるプログラムコード)に変換します。そのプログラムはいったい“誰によって管理されている”のでしょう。main関数とOSとの関係はどのような変更を受けるのでしょう。

 次回は,いよいよ.NETの世界に入ります。次回またお会いいたしましょう。ごきげんよう!