[Anthy-dev 1529] Re: uim-scm.h APIについて

Zurück zum Archiv-Index

YamaKen yamak****@bp*****
2004年 12月 31日 (金) 08:37:12 JST


ヤマケンです。

custom APIの改訂に伴ってuim-scm APIも位置付けが変わりつつあるの
で最近の変化を紹介しておきます。

現在のlibuimはSchemeインタプリタのsiodをuim向けに改変したものに
べったり依存する形で書かれているんですが、これを整理してuim-scm
APIによってSchemeインタプリタを抽象化し、直接siodの関数を呼ぶ代
わりにuim_scm_*()を介して呼び出すように変えつつあります。siodが
公開しているシンボルは他のライブラリ等と衝突しやすい短かい名前な
のでuim_scm_プリフィクスを付けてそれを回避する目的もあります。

これはlibuim内部利用の他、IMプラグイン内でCからSchemeインタプリ
タにアクセスする際にも使われる事を意図しています。以前のuim-scm
APIはGCまわりのハンドリングがまずかったため実用になりませんでし
たが、後述の改変によりある程度安全に利用できるようになっています。
スタック上のlispオブジェクト保護のためにはちょっと特殊な作法が必
要なのでドキュメントが必要ですが。

libuimとSchemeインタプリタ間のインタフェイスが十分細くなって抽象
化された時点でTinySchemeやGaucheに挿し替えられるようにしたいと思っ
ています。siodは標準仕様に沿っていない、ライブラリが少ない等の問
題があるので。また、Gaucheのような大きめの実装は十分なリソースの
用意できない環境では利用しにくいのでそのままでは標準にはできない
と思いますが、リッチなプログラミング環境を生かしてのプロトタイピ
ングには有用だと思います。

uim/uim-scm.c:
#if 0
/*
  To avoid namespace pollution, all siod functions should be static
  and wrapped into uim-scm.c by direct inclusion rather than linked
  via public symbols. After uim_scm_* abstraction, the Scheme
  interpreter implementation can be switched to another one such as
  uim-scm-tinyscheme.c or uim-scm-gauche.c. But uim/*.[hc] and
  scm/*.scm are still depending on siod in several ways. At least full
  test suite for *.scm files are required to migrate to another Scheme
  implementation.  -- YamaKen 2004-12-21
*/
#include "slib.c"
#endif


At Sun, 03 Oct 2004 18:35:45 +0900,
yamak****@bp***** wrote:
> Schemeの実装の話になったのでついでに触れておきますが、現在のsiod 
> では repl_c_string() → callback → repl_c_string() のようにnest 
> した形でrepl_c_string()を呼ぶとGCがおかしくなるため、uimでは
> callback queueを使ってこれを回避していますが、repl_c_string()の
> 内部で呼ばれているrepl_driver()の実装をいじって、stack_start_ptr 
> の初期化を最初のrepl_c_string()呼び出し時に限って行う事でこの問
> 題を回避できるんじゃないかと考えています。実際の検証はまだですが、
> repl_c_string()がnested reentrantだとAPIの設計自由度が増すので、
> uim-scm API(とcustom API)の改訂時に実験してみようと思っています。

これもr86, r88, r89で対応し、一応の正常動作を確認しました。

今まではこの制限のためSchemeからcallback関数を呼んだり、Cの呼び
出し側スタック上にlispオブジェクトを置いたりする事が自由にできな
かったんですが、両方とも可能になったので今後はそれを前提にlibuim
内部を柔軟でシンプルな形に再編・拡張してゆくつもりです。

手始めにcustom APIの「あるcustom variableが更新された時に呼ばれ
るC callback」を実現するために利用します。これは現在のcallback
queueでは実現できないため、callback queueの廃止が前提です。廃止
のスケジュールは以下のように予定していますが、何か関連する作業を
行っていたり問題を感じている方は意見ください。

0.4.6リリースまでの間、なるべく以下のコンフィギュレーションでテ
ストして頂けると助かります。もしバグがあった場合にはアプリごとク
ラッシュしますのでご注意ください。もちろん問題無い事を期待してい
ますが。

  configure --enable-scm-nested-eval --disable-callback-queue

------------------------------------------------------------------------
r86 | yamaken | 2004-12-31 05:41:21 +0900 (Fri, 31 Dec 2004) | 30 lines

* This commit adds nested Scheme evaluation feature described
  below. The feature will be enabled by default once tested enough.
  - nested Scheme evaluation from C (i.e. C -> Scheme -> C -> Scheme)
  - protect lisp objects on the caller stack from GC

------------------------------------------------------------------------
r89 | yamaken | 2004-12-31 07:32:55 +0900 (Fri, 31 Dec 2004) | 49 lines

* This commit removes callback queue from libuim to simplify the
  internal implementation. Whether use the callback queue or not is
  still configurable at compile time:

  - The old code using callback queue

    configure --disable-scm-nested-eval --enable-callback-queue

  - The new simplified code without callback queue

    configure --enable-scm-nested-eval --disable-callback-queue

  - The new simplified code without callback queue, but sometime
    crashes the application process. Exist only for testing purpose

    configure --disable-scm-nested-eval --disable-callback-queue

  Please test the second configuration. The second will be default for
  uim 0.4.6 if no fatal behavior is reported. After 0.4.6, the old
  codes enclosed by #ifdef UIM_CALLBACK_QUEUE will be removed to
  prepare further libuim simplification. If the callback queue is
  completely gone, we can simplify other codes affected by the
  callback queue such as uim_eval_string()

-------------------------------
ヤマケン yamak****@bp*****



Anthy-dev メーリングリストの案内
Zurück zum Archiv-Index