entryポイント
entryポイント
entryポイントの形式は様々です。例えば、C言語ではmainという名前の関数がentryポイントになります。BASICなどはソースコードの先頭から実行していくのでファイルの先頭がentryポイントとなります。
Rice言語のentryポイントはアプリケーションにより異なります。mainクラスのopenメソッドは全てentryポイントになり得ます。
"mainクラス"や"openメソッド"といった言語の構成要素については後述します。
Rice言語のentryポイントについてCookerを例にして説明します。
プログラムの実行を指示されたCookerはソースファイルを読み込み仮想機械を生成します。そして、仮想機械がmainクラスのstart(browser)メソッドを呼び出します。start(browser)が無ければstart()メソッドを呼び出します。
これらのメソッドがCookerにおけるentryポイントです。
Cookerにおいてmainクラスの定義と適切なメソッドの定義は必須です。それらが定義されていない場合はスクリプトを実行できません。
1: | class main |
2: | open method void start() |
3: | endmethod |
4: | endclass |
上記はCookerにおけるmainクラスの定義の例です。start()メソッドにコードを追加していけばCookerで実行できるRiceスクリプトが作成できます。
Cookerにおいてstart()メソッドがentryポイントになるのは、Cookerがそのように実装されているからです。
前述したようにmainクラスのopenメソッドは全てentryポイントになり得ます。どのメソッドをentryポイントにするかはアプリケーションの実装に依存します。
exitポイント
プログラム実行の開始点がentryポイントと呼ばれるのに対して終了点をexitポイントと呼びます。アプリケーションによってはexitポイントが重要な場合があります。
entryポイントと同様にmainクラスのopenメソッドは全てexitポイントになり得ます。どのメソッドをexitポイントにするかはアプリケーションの実装に依存します。
exitポイントについてCookerを例にして説明します。
Cookerのプログラム実行の終了点はスクリプトの切り替わり時とアプリケーションの終了時です。
Cookerはスクリプトを切り替えて実行することができます。一時に実行されているスクリプトは一つですので、新しいスクリプトファイルを実行する際にはそれ以前に実行されていたスクリプトの後処理が必要になるかもしれません。
Cookerの終了時も同様です。アプリケーションを終了する前に実行されているスクリプトの後処理が必要になるかもしれません。
スクリプトの後処理が必要かどうかはスクリプトの内容に依存するので、アプリケーションがそれを判断することはできません。
Cookerは後処理が必要かどうか判断する代わりにexitポイントでmainクラスのend(browser)メソッドの呼び出しを試みます。それが存在しないならend()メソッドの呼び出しを試みます。それも存在しないなら何もしません。
つまり、end(browser)とend()メソッドの定義はオプションです。後処理が必要な時にだけメソッドを定義します。
1: | class main |
2: | open method void start() |
3: | endmethod |
4: | open method void end() |
5: | endmethod |
6: | endclass |
mainクラスの定義にend()メソッドを追加しました。このend()メソッドにコードを加えればexitポイントでのスクリプトの振る舞いを定義できます。
Cookerにおいてend()メソッドがexitポイントになるのは、Cookerがそのように実装されているからです。
mainクラスのopenメソッドは全てexitポイントになり得ます。どのメソッドをexitポイントにするかはアプリケーションの実装に依存します。
mainクラス
これまでに述べてきたようにmainクラスは"start"や"end"メソッドをメンバとして持つ重要なクラスです。Rice言語はmainクラスがアプリケーションとのインターフェースとして機能すること想定して実装されています。
これ以外にもmainクラスには重要な特徴があります。それは、mainクラスのインスタンスはシングルトンであるということです。
今、架空のユーザー定義クラスsomeclassが存在するとします。
1: | someclass newInstance = new someclass(); |
このような文を定義文といいます。この場合は変数newInstanceを定義しています。
この文が実行されると、変数newInstanceとsomeclassクラスのデータがメモリ上に確保されます。メモリ上にあるsomeclassクラスのデータのことをインスタンスと言います。
そして、newInstanceのメモリ領域にsomeclassクラスのインスタンスのメモリアドレスが書き込まれます。
mainクラス以外のユーザー定義クラスは生成される時に別々のインスタンスが割り当てられます。someclassクラスの定義文が十個あれば、十個のメモリ領域に個別のデータが割り当てられます。
これに対してmainクラスは別々のメモリ領域が割り当てられることはありません。mainクラスの定義文が十個あっても、全て同一インスタンスが割り当てられます。
このようなインスタンスをシングルトンインスタンスといいます。
mainクラスがシングルトンインスタンスであることには様々な利点があります。