shelarcy
shela****@capel*****
2004年 6月 24日 (木) 21:59:04 JST
On Thu, 24 Jun 2004 01:25:26 -1000 (HST), Shiro Kawai <shiro****@lava*****> wrote: > ところで、Gaucheが抽象度の高いルーチンではなくなるべくPOSIXレイヤを > 直接Schemeに見せているのは、私個人がスクリプトを業務で書いていて、 > しばしば「痒いところに手を届かせたかった」経験を持っていることに > よります。そこから類推すると、Gauche/win32はPOSIXエミュレーション > レイヤをがんばるよりも、WindowsのネイティブシステムコールをSchemeに > 見せる方向に向かう方が充実するかもしれません。 > > 「どちらでも動く」スクリプトのためには、Schemeレベルで抽象化レイヤを > 書いてがんばる、と。どのくらいそれが可能かどうかはわかりませんが。 結局この辺りに集約されますか。 今回のであれば pipe 的なプログラムを書くためのレイヤを作って、Windows とそれ以外で呼び出すスクリプトを変えると。 Windowsのネイティブシステムコールを出していくのなら、Windows でサポート できているものとできていないもので現在の syslib.c を分けた方がいいかも しれませんね。 >> 同様の問題は fork とか pipe の方でも起こりますが、解決策がありそうな >> のでこちらはどうにかしたいと思います。 > > fork, pipeはかなりきついと思うので、当面サポート無しでも良いのでは? > 特にforkは、Cygwinではかなりアクロバティックな方法をとっていたと思いま > す。 > コードを読んだわけではないんですが、ドキュメントのどこかでちらっと > 触れられていたような。 > >> Win32 pipeの覚書 >> http://nhiro4.ld.infoseek.co.jp/program/windows/pipe.html > > ここに書かれている方法だとすると使うのは難しいと思います。 > > まず、Unixのforkのセマンティクスは、現在実行中のプロセスの複製を > 作るというものです。CreateProcessは、fork+execに相当すると思います。 > fork()に相当するシステムコールはWindowsにあるのでしょうか? 確かにないですね。 > (現実には、スレッドとの絡みで、Schemeレベルからsys-forkとsys-execを > 別々に呼ぶことは推奨していません。fork+execをアトミックに行う > sys-fork-and-execというのを用意してあって、ほとんどの場合は > それで事足りるんじゃないかと思います。従って、sys-forkはサポート > せずにsys-fork-and-execだけをサポートするってのはありかもしれません。 > ただ、sys-waitのセマンティクスも難しそうな気がします) > > もう一つの問題は、上記の方法でパイプを作ったとしても、Schemeから > アクセス可能にするためには、HANDLEの上にポートAPIを構築しなければ > ならないということです。(GaucheはFILE*構造体を使うbuffered I/O > (fprintf, fwrite, fread, fgets, getchar, putchar等) を利用せず、 > Unixのファイルディスクリプタ上に直接I/Oルーチンを組んでいます)。 そこまでいくのなら、先に Gauche を動かせる状態にした方が良さそうですね。 > と、書いてて気づいたんですが、port回りは無事ビルドできたんでしょうか。 > ということはMinGWがHANDLEからfile descriptorへのアダプタレイヤを > 提供してくれているのかな。それなら何とかなるかもしれません。 > > 同様に、MinGWがfork()のセマンティクスも提供してくれているなら > 話は速いんですが。 その辺りは有野さんが頑張っていたからどうにかなったのであって、MinGW が持っているわけではないのでダメですね。 -- shelarcy <shela****@capel*****> http://page.freett.com/shelarcy/