[Gauche-devel-jp] Cとの連携

Back to archive index

Makoto Satoh makot****@yahoo*****
2003年 10月 2日 (木) 23:19:47 JST


佐藤です。

# へたれですいません。。。

Shiro Kawai <shiro****@lava*****> wrote:
> SchemeからC関数を呼ぶ際の引数・戻り値の受渡し
> 方法について言えば、そんなに難しくはないと思うのですが。
> (ドキュメントが無いという問題は別にして)
> 何がひっかかっているのか、具体的な例をあげてみてもらえますでしょうか。

えーと、spigotではVectorを用意してCでの計算結果をScheme側へ渡していたり、
pgではstubファイルでクラスを作っていたり、gauche.hを見ると似たような機能の
マクロがたくさん定義されているように見えたりと、Cの経験不足から混乱して
しまっていました。

> > 私には、例えば、SCM_MAKE_STRとSCM_MAKE_STR_COPYINGの違い
> > とか、MySQLのハンドルはどうやって渡したらいいの?とかが
> > 分かりませんです。
> 
> えーっと、これらは、SchemeオブジェクトからCオブジェクトを
> 取り出したり(unboxing)、CオブジェクトをSchemeオブジェクトに
> ラップしたり(boxing)する方法に関しての話ととってよいでしょうか。

そうです。

> (これは、SchemeからCを呼ぶ場合の引数/値の受渡しという話とは
> ちょっと異なる問題です)

うっ。SchemeからCを呼ぶとは、つまりJavaのJNIみたいなことでしょうか?

Cのライブラリがあるので、それをSchemeプログラムから使いたいのです。
具体的には、MySQLやMing、Sary、PDFlibあたりを考えています。
まあ、MySQLはDBI/DBDのような仕組みにしたいという話もありましたが。

> どんなスクリプティング言語でもそうですが、boxing/unboxingに
> おける注意点は、Cポインタを渡す場合のownershipです。
> Gaucheでは、Schemeオブジェクトは全てGaucheが所有します。
> したがって、C側で所有するメモリの内容をGaucheに渡したければ、
> SCM_NEW*等でGaucheのメモリをアロケートしてコピーするか、
> finalizerを登録してGaucheがそのオブジェクトを必要としなく
> なった時にownershipを返してもらうかしなければなりません。

なるほど。そういうことも考えなければならないのですね。
やはり経験不足が効いてます。。。

(snip)
> 例えば、C側でmallocしたchar配列からScheme文字列を作りたい
> 場合は、ownershipはC側にあってSchemeには渡せないので、
> SCM_MAKE_STR_COPYINGを呼び、その後でC側の配列をfreeしなければ
> なりません。一方、C関数内で SCM_NEW/SCM_NEW_ATOMIC でアロケート
> した文字列は、既にGaucheが所有しているので、SCM_MAKE_STRに
> 渡しっぱなしにできます。

このownershipについては、何となく分かるような分からないような
感じですので、もう少し勉強してきます。

(snip)
> MySQLのハンドルのように、Schemeにとって異世界である資源の
> 場合は、専用のクラスを作成してハンドルを包み込んでやるか、
> C側でテーブルを作って管理してやる必要があります。
> (後者はTclで使われています)。
> この場合、Schemeはオブジェクトの実体について何も知らないので、
> finalizerを登録してC側で後始末をつけてやるようにします。

MySQLについては、DBI/DBDライクな仕組みがやはり良いのでしょうが、
とりあえず自分ローカルでも使えないかなと思いましたが、ハードルが
高かったです。

英語MLでの拡張の話のときもTclの話が出てましたが、Tclは参考に
なる部分が多いですか?

--
Makoto Satoh




Gauche-devel-jp メーリングリストの案内
Back to archive index