KH-FDPL に関するメモ-0004
また整理(2015.02.09)
- いろいろ試行錯誤しています。基本的な目的(=やりたいこと)に変化はないのですが、それをどうにかしてシンプルに実現したいので、設計をがんばっています。
- (1) 高度なアクセス権管理は廃止になり、制限アクセスとしては単純なリードオンリーのみをサポートします。
- リードオンリーなオブジェクトに対しては、読み出ししかできません。書き足しも削除も名前(変数名、メンバ名)の変更も一切受け付けません。すべてエラーにします。
- さらにリードオンリーオブジェクトに対するリンク(つまり他のオブジェクトのメンバにすること)も認めません。これはライトもできるオブジェクトの中にリードオンリーなオブジェクトをリンクさせることで、管理が複雑になる事態を避けるためです。
- もちろん、リードオンリーなオブジェクトをフルコピーすることはできますので、フルコピーした上でそのコピーへのリンクを張ることはできます。しかしこのコピーをどれだけ改変しようとも、オリジナルは影響を受けません。
- (2) KH-FDPLでは全てのオブジェクトがメモリ上のファイルシステムみたいなものの一部として管理されます。
- 普通にmallocすると当然ながら名前を指定できないのですが、内部ではちゃんと適当な名前が割り当てられます(その名前をあとから取得することもできます)。どこのディレクトリにオブジェクトを置くかということも含めて、設定しておくことになります。
- たいていは(=デフォルトでは)スタックという名前のフォルダにオブジェクト類は置かれることになります(フォルダ名はスタックじゃないかもしれないけど)。関数から出るときに、このフォルダをフォルダごと消してしまえば、メモリリークする心配はありません。つまりいわゆるスタック変数はここに置くわけです。
- 関数を呼び出すたびにスタックフォルダが作られていくイメージです。
- 関数の戻り値などは、スタックフォルダに作ってしまうとうまくいかないので、戻り値を置くためのフォルダを関数に渡すことになります。たいていの場合、このフォルダは呼び出し側のスタックフォルダです。
- (3) setter, getter関数をより自然に書けます。
- 値をセットするときはsetter関数を、値を取得するときはgetter関数を使う、みたいなのがオブジェクト指向言語ではよくありますが、KH-FDPLでは「代入しようとしたときに呼んでほしい関数を登録しておく・値を参照しようとしたときに呼んでほしい関数を登録しておく」ということができるので、c = a + b; と書くだけでも、実はaやbのgetter関数が呼ばれてcのsetter関数が呼ばれる、ということができます。
- ちなみにただの変数オブジェクトに対しても添え字の付与や関数型呼び出しをすることができます。
- つまり a = 3; に対して、 a()やa(4)やa[5]などができます。いずれも値は3を返します(引数や添え字は無視される)。
- (4) copy-on-writeのサポートがあります。
- ここでいうcopy-on-writeのサポートというのは、つまり内容がよく似た配列やオブジェクトがあって、でも一部だけ違うみたいな場合に、消費メモリが単純に二倍にならずに済む、というものです。
- 内容が完全に同一なら、消費メモリはほとんど増えずに済みます。
こめんと欄
|