6/21/2009

C++における所有権

どうもJudaです。
今回はC++の所有権の問題について。この話は開発者にとってはもはや古典的であり、解決策も見つけられた基本的な事象です。
そのことについて、少しだけ反省交じりの後日談を書きます。

C++における所有権の問題というのは、アロケーションに関する問題である。つまりは動的領域確保によってヒープ領域に作られた領域を誰が所有して、それを最終的に開放するのかという問題である。
これに関しては、C++は特に何もしてはくれない。ただnewとdeleteをキーワードとして提供しているにすぎず、管理してはくれない。
大規模プログラムになるとこの問題はソースコードのモジュールごとの凝集性や普遍性の問題のなかで爆弾となる。誰がその領域を開放するのか。
この問題に対する解決策はすでにあり、BoostのSmartPointerなどを参照してみるのが、一番よいだろう。
この問題に対して、どのように考えるのかということを少し提起したい。
領域の開放をしないと、いつまでその領域が使えないという特性をもっているので、そのような領域でないという前提を排して、誰がという点に焦点をあてて考える。

・明示的にプログラマ
・暗黙的にプログラマ
・明示的にアプリケーション
・暗黙的にアプリケーション

軸を明確にすると設計者か実行環境か?あるいは言語特性か、特性ではないか?

C++という言語に話をあわせると、言語特性として、確保された領域を管理はしていないので、特性ではない。また実行環境でもこの開放をサポートしているのか、していないのかは、不明確だ。故に、プログラマに任されている、現状は。
しかし、この明示的にという部分は確かに多くの制御の自由が与えられているので、それはとても助かる。しかしこれは煩雑さの元でもある。抽象度の関連で、この領域の開放はより機械よりのアプローチである。期待される動きは、誰も使わなくなったら解放する、である。
そうであるので、このためには言語特性ではないので、ポインタをクラス化して、一枚層をかませるのである。これがスマートポインタにあたる。これによって、生のポインタと実際の使用している局面をつなぐクラスの必要性が理解される。また、この中間層の発明によって、より柔軟な解放シーケンスを提供できる可能性を提示する。
Boostの優良なライブラリの機能であるSmartPointerを知っておくことは実に重要だ。どこでも好きにつかえるライセンスだけど、中身を知っておく、使い方を知っておくことはとても有意義だ。まぁ、それが意外に大変です。なぜ基本的に与えられていないのだー。

そして実にC++という言語は、自由だ。(w
自由すぎて、涙でる(w

C++というものが如何なるものであるのかということに対して、最近の私は一つの信念をもっている。それは、C++は荒れた大地を提供するもので、そこで利用するものは神であるプログラマが多くを提供する必要があり、それを用いて構築物を作るしかない。
C#は、森を提供してくれている。だが荒地を使うには、煩雑で一度森を焼かなくてはならない。
この違いの表現は使ったものなら分かってもらえると思う。C++も神としてのプログラマが世界構築になれているなら、多くのものははじめから持ってこれるが、それは本当に万人と共通なのかどうか、という点では無理でしかない。

0 件のコメント:

コメントを投稿