MachiKania

MachiKania BASICのオブジェクト指向化について

2019年3月25日

MachiKania ver 1.2以降では、BASICでのコーディングに於いて、オブジェクト指向プログラミングが行えるようになった。ここでは、その実装方法について、メモを残しておきたい。

MachiKania BASICでは、クラスベースのオブジェクト指向プログラミングを採用している。その文法などについては、ダウンロードファイルの「class.txt」ファイルを参照して頂きたい。

MachiKania BASICにおけるオブジェクト指向プログラミングには、次の特徴がある。

1)オブジェクトは、フィールド(public もしくは private)とメソッド(public のみ)を持つ。
2)クラスの記述は別ファイルに於いて行ない、1ファイルに1クラスの記述とする。
3)複数のクラスを利用出来る。また、クラス中で別のクラスを利用出来る。
4)クラスの継承は、未実装。
5)フィールド名とメソッド名には、2文字以上6文字以内の英数字が指定出来る。

これらの特徴は、クラスライブラリーを供給してそれを使用可能にしようという目的ゆえんである。

Wikipediaによると、クラスベースのオブジェクト指向プログラミング言語には、一般的に以下の特徴があるらしい。

1)カプセル化
2)継承
3)多様性

MachiKania BASICでどの様に対応出来ているか、それぞれ順を追って検討してみたい。

カプセル化

「カプセル化」は、MachiKania BASICで厳密に実装されている。それぞれのクラスはメインプログラムとは別のファイル上に書かれる。ここで、長い名前の変数とサブルーチン用のラベルは、完全に内部隠蔽されている(これはclass.c内のdelete_cmpdata_for_class()の働きと、linker.cによるリンクが当該ファイル内でのみ成される事による)。また、フィールド及びメソッドの両方に於いて、パブリック・プライベートの区別が出来るように実装した(プライベートメソッドは、LABEL/GOSUBを用いて表現出来る)。

従来のバージョンのMachiKania BASICを大きく変更することなく、このカプセル化を実装した。まず、コンパイルとリンクは、ソースファイルごとに行なうようにした(file.cを参照)。これにより、ラベルの内部隠蔽が可能となった。次に、クラスファイル内におけるフィールド値へのアクセスは、長い名前の変数を介して行なうようにした。長い変数名のデーターを、クラスファイルのコンパイル後に破棄することにより、内部隠蔽が可能となった。スタティックフィールドの扱いは、この仕様のままで実装出来る。スタティックではないフィールドについては、オブジェクトごとにその値が設定されている。そこで、クラス内のメソッドを呼び指す際、まずオブジェクトのフィールド値を長い名前の変数に代入し(class.c内、lib_pre_method()を参照)、メソッドの実行を終えてメインプログラムに戻る際に、長い名前の変数値をオブジェクトのフィールドに戻すようにした(class.c内、lib_post_method()を参照)。この様な仕様にしたため、新たに追加した機能(METHODステートメントなど)でのみオブジェクト指向化を意識すれば良く、従来の実行エンジンがそのまま利用出来る形となった。

継承

初期のバージョンでは、まだ継承機能は実装されていない。MachiKaniaで作成可能なプログラムの規模で継承機能が有用になるケースが考えにくかったからである。また、VBScriptなど、オブジェクト指向でも継承機能が実装されていないプログラミング言語は、他にもある。将来的に、継承機能も実装されるようになる可能性はあり、どの様に実装するかについてのアルゴリズムは検討が始まっている。

多様性

多重定義(オーバーロード)は、実装されていない。これは、MachiKaniaにおける型の定義がそれほど厳密でないことに依る。ただし、メソッドに引き渡される引数をARGS(0)で調べることが出来るようになったため、引数の数によって異なる実行内容を選択することは可能になった。将来的には、引数が整数型か文字列型か実数型かを判断して多重定義するような実装が可能になる可能性が無くはないが、積極的には考えていない。

ポリモーフィズムに付いては、それぞれの変数が様々なクラスのオブジェクトとなりうる様な形で、実装しているとも言える(あまり、意識はしていない)。例えば、「A.METHOD1()」と記述した際、変数AがCLASS1クラスのオブジェクトの場合はCLASS1クラスのMETHOD1()が、CLASS2クラスのオブジェクトの場合はCLASS2クラスのMETHOD1()が呼び出される。これは、メソッド呼び出しの解決が実行時になされるからである(class.c内のlib_pre_method()関数による)。

クラスベース

MachiKania BASICは、クラスベースのオブジェクト指向言語である。Wikipediaでは、「多くのオブジェクト指向プログラミング言語ではクラスをデータメンバとメソッドの集まりとして記述する」とされている。MachiKaniaでは、データメンバを「フィールド」と呼んでいるが、やはり、フィールドとメソッドの集まりとしてクラスを記述する仕様である。フィールド・メソッド共にアクセス権の設定が、パブリックもしくはプライベートとして設定可能である。各オブジェクトは、パブリックフィールドに加えてプライベートフィールドの値も保持している。また、フィールド・メソッド共に、スタティックな物(クラスフィールド・クラスメソッド)とそうでない物(インスタンスフィールド・インスタンスメソッド)が区別出来る様にした。

MachiKania BASICの特徴とプログラミング時の注意点

MachiKania BASICは以上のように、必要最小限と思われるオブジェクト指向プログラミングの特徴を備えた、プログラミング言語である。その実装の方法としては、上で述べた、メソッド実行前にフィールド値が変数へ代入され、実行後に変数値がフィールドへ戻される点が、大きな特徴といえる。この動作を行なうのに一定の時間が必要であるので、速度が要求されるようなプログラムでは、少し注意が必要である。ただし、コンパイラーなので、ここで「一定の時間が必要である」と言っても、ほとんどのケースでは無視出来るような短い時間だと思われる。

フィールドの数は、少なければ少ないほど、オブジェクトのサイズも小さくなるし、実行速度も上がる。従って、必須ではないプライベートフィールドは避けるべきである。もし、スタティック変数で良ければ「STATIC PRIVATE」とする。

メソッド呼び出しは、オブジェクトのメソッドを呼び出すよりもスタティックメソッドを呼び出す方が、圧倒的に速い。従って、オブジェクトが一つだけの設計(シングルトン)の場合は、オブジェクトを作製するのではなく、スタティックフィールドとスタティックメソッドによる実装にしたほうが良い。ただし、これは速度のみを考えてのことなので、余り速度を意識しなくても良いようなケースでは、シングルトンの実装の方がコードがすっきりする様なケースはあり得る。

ローカル変数について。これは、クラスメソッドに限った話ではなく、普通のサブルーチンをGOSUBで呼び出した際にも言えることであるが、「VAR」ステートメントを用いてローカル変数を利用する場合、「VAR」ステートメントの実行にある一定の時間がかかる。従って、速度を重視するクラスの場合、「VAR」は使用せず、変わりにスタティックフィールドを用いた方が良い。

コメント

コメントはありません

コメント送信