プログラムの構造


アセンブリ

値や関数をまとめた単位をモジュール[A]と言います。モジュールは以下のような形式をとります。

module SomeModule
{
   SomeValue = 42;
   SomeFunction(x : int) : int
   {
      x + 1;
   }
}

1 つないし複数のモジュール (あるいは他の型) をコンパイルしてバイナリ形式として .NET Framework で利用可能な形式にしたものをアセンブリと言います。アセンブリにはそれ自身で実行可能なプロセスアセンブリと,外部から利用されることを目的としたライブラリアセンブリがあります。

エントリーポイント

エントリーポイントとは,プロセスアセンブリの実行時に最初に実行される関数です。エントリーポイントは通常モジュール内に定義された Main という名前の関数です。 Main 関数の引数は文字列の配列もしくは引数なしで,戻り値が void もしくは int です。 int を返す場合は,プログラムが正常終了した場合に 0 を,異常終了の場合に 0 以外の値を返すのが普通です。

以下はエントリーポイントの例です。

Main() : void
{
}
Main(_args : array[string]) : void
{
}
Main() : int
{
   0;
}
Main(_args : array[string]) : int
{
   0;
}

Nemerle は関数のオーバーロードを許容しているため 1 つのモジュール中に複数の Main 関数を定義することができます。しかしエントリーポイントはプログラムの開始点であるため,複数の Main 関数が定義されている場合コンパイルエラーになります。

複数のモジュールに Main 関数がある場合,コンパイラはいずれの Main 関数がエントリーポイントであるかを決定できません。そのような場合には,コンパイラオプション /main を利用してエントリーポイントを指定します。

// program.n

module X
{
   Main() : void
   {
      System.Console.WriteLine("module X");
   }
}

module Y
{
   Main() : void
   {
      System.Console.WriteLine("module Y");
   }
}
ncc.exe /main:X program.n

Main 関数を定義する以外の特別な方法として, Hello World で示したような,ソースコード中に直接実行処理を記述する方法もあります。この場合,ファイル名から拡張子を除いた名前のモジュールに引数なしで void を返す Main 関数が定義されるのとほぼ同等になります[B]

脚注

  1. .NET Framework にもモジュールと言う単位がありますが,ここでは Nemerle のモジュールを指します。基本的に .NET Framework のモジュールについて言及することはありません。 []
  2. トップレベルにメイン処理を記述する方法では using 節が利用できないといった問題もあるので,この記法は問題がないと確信している場合を除いて避けた方が賢明かもしれません。 Visual Studio を使う場合はプロジェクト作成時にエントリーポイントを自動で作成してくれるので,特に負担はないでしょう。 []