Index: [Article Count Order] [Thread]

Date:  Mon, 02 Feb 2004 22:04:13 +0900 (JST)
From:  Susumu YAMAZAKI <yamazaki@....jp>
Subject:  [XP-jp:04873] Re: GC
To:  extremeprogramming-jp@....jp, yoshiki@....jp
Message-Id:  <20040202.220413.119724438.yamazaki@....jp>
In-Reply-To:  <401E016A.9060503@....jp>
References:  <JN20040131123837.600648677@....jp>	<20040202145728.590C.MURAYAMA@....jp>	<401E016A.9060503@....jp>
X-Mail-Count: 04873

山崎です.

> >「型情報を手作業で付けることができる」というだけでしょ?
> >Cのランタイムにはそういう機能はありません.
> 型情報を常に収集する必要はないですからね。
> 「型情報の収集すらパフォーマンスには邪魔」だから
> です。ユーザアプリを書くのにも使われるし、デバイス
> ドライバを書くのにも使われる言語ですからね。
> 
> 必要な時だけ手付けというのではだめなんでしょうか?

僕はそれも一つのアプローチでいいと思うのですが,型情報がついているオブ
ジェクトとついていないオブジェクトを意識して書き分ける手間がどうしても
かかります.それにはある程度高水準の技術が必要ですし,それを全てのプロ
グラマには強制できないという点には注意するべきでしょう.

> >念のため補足しておきますが,Javaのような言語では滅多に上記のようなことは
> >やりません.普通はスコープから外れた時点で何もせずとも参照は消えます.
> >null参照を明示的に代入するのはごく一部の例外的な場合のみです.特に
> >パフォーマンスのことを考えるならば,「明示的な代入は避けろ」とまで
> >言われています.(基本的に不要な処理であるため.)

僕からも補足ですが,メモリチューニングをする場合には,意識的に null を
代入することもあります.例えばコンパイラのように,構文木のような全ての
処理に共通のデータ構造に対して,段階ごとに情報を付加し,ある段階をすぎ
たところでそれまで使っていた情報が不要になることが分かるようなタイプの
プログラムの場合,普通に書いていると不要な情報がメモリ上に残ったままに
なるので,段階ごとに null を代入する,ということをします.

> JavaのC++に対するメリットって「リッチな中間層」で提供されているものです
> よね。中間層を増やして柔軟性と機能を追加していくのがソフトウェアの基本的
> 性質なら、C++はパフォーマンスのためにあえてその辺りを全部とっぱらった言
> 語と言えます。中間層はあとから追加できますからね。そのかわり言語機能とし
> て規定されたものは引くことはできません。短時間で処理が終わるようなプログ
> ラムで、かつマルチタスクOSでメモリ空間が保護されているのならば、あえてメ
> モリを解放しないでプロセスの終了にまかせる、というトレードオフすらCやC++
> ではありえます。そんなコーディング作法は教科書には載ることはないでしょう
> けど。exact GCだって、newしたオブジェクトを全部shared_ptrに格納すればで
> きるんですから。タイプ数はちょっと多くなりますけど。

言語処理系レベルの最適化ということを考えますと,必ずしも C++ 流の方法
が性能がよいとは一概には言えません.全部 shared_ptr を使った C++ と,
Java とでは,恐らく Java の方が性能がよいでしょう.Java はメモリモデル
が単純で GC が全てで使われるため,最適化の効果が高く最適化の前提条件が
立てやすいので,研究が進んだ結果だと言えます.

                  山崎 進 --- yamazaki@....jp
                   福岡県産業・科学技術振興財団
                     福岡知的クラスター研究所