Shiro Kawai
shiro****@lava*****
2003年 10月 3日 (金) 06:02:54 JST
From: Makoto Satoh <makot****@yahoo*****> Subject: Re: [Gauche-devel-jp] Cとの連携 Date: Thu, 02 Oct 2003 23:19:47 +0900 > えーと、spigotではVectorを用意してCでの計算結果をScheme側へ渡していたり、 > pgではstubファイルでクラスを作っていたり、gauche.hを見ると似たような機能の > マクロがたくさん定義されているように見えたりと、Cの経験不足から混乱して > しまっていました。 とりあえず、引数の受渡し規則に関して言えば、genstubを使う限り、 あまり考えなくてよいです。Scheme側に渡された引数はそのままC関数の 引数に渡りますし、C関数の返り値がそのままScheme側の返り値となります。 また、genstubはboxing/unboxingもある程度は面倒をみてくれます。 Cに渡される引数のunboxing: stubファイルで型を指定した場合。 - char, int, long, float, doubleは値として渡る。 - Schemeのstringはconst char *として渡るが、ownershipはGaucheが持つ。 - その他のオブジェクトは原則としてSchemeオブジェクトの実体へのポインタ (シンボルなら ScmSymbol* 等) として渡る。 stubファイルで型を指定しない場合は全てScmObjで渡る。 Schemeに返す引数のboxing: stubファイルで返り値の型を指定した場合、 - char, int, long, float, doubleはそのまま返せる。 - stringは、Gaucheがownershipを持つconst char*を返せばboxしてくれる - その他のオブジェクトは原則としてC側でSchemeオブジェクトを 作成して返す必要がある。 C関数から複数の値をScheme側に返す場合は、全てをSchemeオブジェクトに ラップした上で、 return Scm_Values2(obj1, obj2); 等とします。 > このownershipについては、何となく分かるような分からないような > 感じですので、もう少し勉強してきます。 ownershipとは、誰がそのオブジェクトなり資源なりの後始末を するかということです。mallocしたものは誰かがfreeしなければ なりませんし、openしたファイルディスクリプタは誰かがclose しなければなりません。 メモリに関しては、Gauche側でアロケートしたもの (SCM_NEW/SCM_NEW_ATOMICでアロケートしたもの)は全てGaucheの GCが面倒をみます。外部のCライブラリを呼ぶ場合は、外部のCライブラリ 中でmallocする場合がありますから、そういうのはC側に所有されることに なり、C側で後始末をつけなければなりません。 > MySQLについては、DBI/DBDライクな仕組みがやはり良いのでしょうが、 > とりあえず自分ローカルでも使えないかなと思いましたが、ハードルが > 高かったです。 DBI/DBDはたぶん、MySQLのAPIをScheme側にexposeした上で、Scheme 上で組むことになると思います。 > 英語MLでの拡張の話のときもTclの話が出てましたが、Tclは参考に > なる部分が多いですか? オリジナルのTclは、全てをTcl側が所有する文字列として扱うという ことにしてAPIを非常に単純にしていました。それはそれで良かったのですが、 TclObjが入ってからは、かえって複雑になってしまっているような印象が あります。まあ、根本的な原理は同じですが、GCの戦略が違うと ownershipの管理のみかけがだいぶ違うので面食らうかもしれません。 --shiro