渋川です。XPに関係ない話が続きますがご容赦ください。
> SWIG については詳細をよく知りません.よろしかったら,詳しく聞かせてい
> ただけないでしょうか?
最後にまとめて書きたいと思います。
> それはその通りですね.確実にポインタだと分かっていれば,いろいろとやれ
> ることはあるでしょう.問題は,Cや C++ をそのまま使うと,ポインタなのか
> そうでないのか分からないメモリ領域が存在するために,保守的な GC を行う
> 必要があることです.
うまーくテンプレートを駆使すればなんとかなりそうな気がしますが・・・
shared_ptrのようなスマートポインタを自作することになると思いますけどね。
JNIとかは使ったことがありませんが、C/C++でJavaとか用のクラスを作る際はた
ぶん、GCにうまく適応するような処理コードを書かなければならないんですよね?
Javaを使ってコードを書くということは、すでにSUNの人とかがそういう手間を
かけてくれているからGCのことを気にしなくてもよいのであって、C/C++だって
そういう手間(きちんと回収されるように処理系に型を通知する手間)をちょっと
かければできるんじゃないでしょうか?Javaがexact GCできるならC/C++もでき
なくはない、と言えると思います。SUNの人があらかじめそういう仕込みをした
Javaがexactで、C/C++は自動的にはそうはならないからexactなGCができないと
いうのは不公平だと思います。
もちろん、exact GCさせない、という自由があるのもC/C++なんですけど。
# JNIで実装するときにそういう手間があるというのはあくまでも推測です。
# Pythonには少なくとも参照カウントを上げ下げするAPIがあったはず。
> つまり exact GC を採用することが原理的に可能だという以上のことは言って
> いません.
そうですね。
一応、事実関係を確認すると、手元の「オブジェクト指向スクリプト言語Ruby」
の説明(P408, P409)によれば、Rubyはマーク&スイープ法を採用しており、シス
テムのスタック領域の内容はどれがポインタでどれが数値かは分からないのです
べてポインタとみなす、という文が書いてあります。
SWIGの話
SWIGはC/C++のオブジェクトをスクリプト言語側からうまく扱えるようなインタ
フェースコードを生成します。スクリプト言語のGCなどが使えるように、C/C++
のオブジェクト自体は「void* で指示された何バイトかのメモリ」として扱われ
ます。これはたいていのスクリプト言語のC言語のAPIで用意されています。戻す
場合にはキャストしてもどしますが、継承しているクラスがある場合、例え親ク
ラスとして扱われる場合にも、きちんとキャストを行わないとスライシングが発
生してあまりうれしくない状況になります(多重継承している場合)。なのでSWIG
はそのメモリがどういうクラスなのか、という情報を持ち、また別個に構築して
ある型データベースの継承情報なども参考にしつつ適切にキャストします。
多重継承のキャストが内部でどういうことをしているのか、というのは以下の
URLが参考になると思います。Visual C++の実装内部のお話です。難しいです。
僕も完全には理解していません。
http://www.microsoft.com/japan/msdn/vs_previous/visualc/techmat/feature/
jangrayhood/
void*からのキャストだとコンパイラが型情報を失ってしまうので自前でなんと
かするしかありません。SWIGはC/C++のコードをそのまま使える、というのを最
大の目標にして開発されているのでこのような仕組みを備えています。お陰でC/
C++コードに対するラッパーを手書きしたり、boost::pythonといった他のツール
で構築するのに比べてパフォーマンスは出ないのですけどね。
> # 先のメールは僕にはそのように読めませんでした.僕の日本語読解力の
> # 問題かも.
いえ、酔っ払いの僕のせいです。
----
東京工業大学 国際開発工学専攻 上田研
_/_/_/ しぶかわよしき JA6HFA/1 yoshiki@....jp
_/ http://www.shibu.jp http://www.unittest.org