言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

ファイル。ソケット。パイプ。Squeak。

Perl では、ファイル、TCP ソケット、パイプを全く同じインタフェースで扱う事が出来る。これは非常に便利な機能で、全く同じプログラムがネットワークで動いたりフィルターになったりする。Squeak もこうだったらいいなーと思うのだが、何をどうしてよいやら分からず、とりあえず今の FileStream の実装を見てみた。

FileStream のうち、最も重要な要素は fileID だ、あらゆるファイル操作が fileID を元に行い、いわば「ハンドル」として扱われる。fileID の実体は SQFile 構造体を指すみたい。fileID は FileStream が close されると nil になる。fileID は外部リソースなので、当然一度 Squeak を落とすと意味の無い値になる。その場合ちゃんとエラーチェックをして close した物とみなされる。

(ちなみに、ODECo ではシャットダウンやレジューム時の処理を相当丁寧にやっている。ちょっと妙なポインタを参照してしまうと即落ちるから。FilePlugin はどう上手い事やってるのかな。)

実際のファイル操作。例えばオープンは C で書かれているのだが、よくわからないのが sqFileOpen(SQFile *f, int sqFileNameIndex, int sqFileNameSize, int writeFlag) がソースツリーに二つある所。sqFilePluginBasicPrim.c と sqWin32FilePrims.c にある。これ、まざらないのかな。多分 windows ではいかにも sqWin32FilePrims.c を使うのだろうけど、これがまた windows べったりのコードになっている。コメントを読むと WinCE の為らしい。win32 の事は良く知らないが、残念ながら vm のレベルでソケットやパイプを統一的に扱うのは却って面倒かも。