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

アーカイブの一覧に戻る

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








Gauche-devel-jp メーリングリストの案内
アーカイブの一覧に戻る