[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends] Re: ポインタと参照
前橋です。
ばかすかメイルを書いてたら、さっそくSubject:を直すのを忘れて
る... 鳥頭でした(_o_)
小薮さん:
>>(3)Javaには、ポインタ演算はない。
>
>これは非常に重要な事です。
>Cではillegalなポインタを簡単に作れてしまいますが,
>Javaでは,でたらめなところを指す参照はどうがんばっても
>作れません。ソフトウェアの信頼性に大きく寄与する
>仕様だと思います。
そう思います。配列のレンジチェックも入りますし、下向きキャス
トに実行時チェック入るし。
ファイナライザ中で thisをこそっと staticな変数にキープすると、
結局解放し損なう、ってのも、こうしないと不正なポインタになっ
てしまうからですよね(そんなことするかどうかという話は置いといて)。
ただまあ、ポインタ演算ってのは、最初にC言語のコンパイラを作
ろうとした時にオプティマイザで手を抜くために付けた、極めてイ
レギュラな機能のようにしか見えないので、こんなものがある
C/C++が妙なだけ、ないのが当たり前でしょう。
>> (1)と(2)って、どうもGCの実装を簡単にするためにこうしたように
>> しか見えないのですが... 実際の所どうなんでしょう?
>
>int a, b, *p;
> :
>a = 1;
>*p = 2;
>b = a; ・・・(1)
>
>というコードがあったとき,(1)をb=1;と最適化したい
>ところですが,もしpの初期化が
>p=&a;
>という形で行われていたらそれができません。
>・・・という話を聞いた事があります。
>つまり,ポインタの自由度の高さは,C/C++の欠点の
>一つだということだそうです。
ポインタがからむと最適化が阻害される、というのは事実でしょう
けど、それ以上に、現状のJavaでは、ポインタ(参照)といえば、全て、
「ヒープ上に存在するメモリブロックの先頭を指す」
と限定できますよね。これが大きいのでは、と思います。
もし、基本型のポインタを取れるようにすると、ポインタがスタッ
クやstaticやヒープのブロックの真ん中を指せることになります。
また、オブジェクトや配列を、スタックやstaticに取れるようにす
ると、今度はそれをポインタ渡しする時(配列の実体渡しはオーバ
ヘッドが大きいから避けたいとして)に、ポインタがスタックや
staticを指すことになります。
そうすると、mark-sweep する時に、面倒なことになりそうです。
また、コンパクションについてですが、「Java言語入門」によれば、
Javaでは「やわらかいポインタ(間接参照ポインタ)」を使っている
のでコンパクションが楽なんだそうですが、これも、ポインタとい
えば必ずヒープのブロックの先頭を指している、という前提の上で
ないと、結構面倒そうです。
# そういえば、JavaのGCって、今でもconservativeなのでしょうか?
もっとも、私は別に言語処理系のプロではないですし、JVMのソー
スを読んだわけでもないので、全くの推測でしかないのですけれど。
この辺について詳しい知識をお持ちの方、是非ご教授願えませんか。
>(5)Javaでは*や&などの演算子を使わない
>というのもあります。
>ノーテーションの問題は小さくないと思いますよ。
>実際,C++で参照が導入されているのもswap(a,b)と書きたいという
>のが大きな理由だったりしませんでしょうか?
そうなんでしょうが、逆に、コードを読む時に、ここで a, bの値
が変更されるかどうかがつかみづらくなります。
notation は慣れますが、巨大なプロジェクトで、他人の書いたコー
ディングをだーっと読みながらデバッグする時、「ローカル変数が
変更される可能性のある箇所」を限定するために、呼んでる関数の
プロトタイプまで調べなければならないというのはどうも... です。
------------------------------------------------------------
前橋 和弥 maebashi@xxxxxxxxxx
中部ソフトエンジニアリング(株)
〒450 名古屋市中村区名駅4-10-25(名駅IMAIビル 5F)
Tel:(052)583-4511(代) 内線 252 Fax:(052)583-4566
------------------------------------------------------------