ものがたり(旧)

atsushieno.hatenablog.com に続く

Sunがソフトをみんなfreeにするそうです。まあどっかの会社の人がそれは無理だろうとか言ってたのは無視するとして、この場合のfreeってどっちのfreeなんでしょうね。ビールの? それともビールの?

ひさしぶりにmonoランタイムのコードをいじっていた。ひさしぶりというか、バグフィックス以外では初めてかな。managed codeのcctor()で確保したバイト配列はいつfree()すれば良いの?とPaoloに聞いたら、そいつはmscorlib.dllだから呼び出さなくてもいいとか言われたりして、ひぇーとか思いつつおっかなびっくりコーディングしていた。まあ実質的にそうだろうなぁ。

MS.NETのCompareInfoの内部実装がどうなっているのかは分からないけど、.NET Framework 2.0では、アセンブリと同じディレクトリの中にsortkey.nlsとかいうファイルが入っていて、情報量としても数十KBなので、似たような内容なのだろう。他の拡張子.nlsなファイルの名前を見てみると、やはりサイズのでかいCJKのマッピングは別ファイルになっているようだ。

ていうかCompareInfoはLCMapString相当だと思っていたのだけど、しかもこのsortkeyを生成するコードはMicrosoftでも失われていたと思ったのだけど、何で.NET Frameworkにバンドルされているんだろう。謎である。

PaoloはランタイムのCヘッダにしてもいいし、バイナリファイルにしてmscorlib.dllのあるディレクトリ上から読み込む形にしても良い、みたいに回答していて、僕もどっちでもいいけど今からCヘッダにするのもバカバカしいし、バイナリリソースのままでいいやと思って後者にしたのだけど、よく考えたらChar.UnicodeCategoryみたいにランタイムのバージョンによって内容が変わるっていう奴があるから、たぶんCヘッダには出来ないだろう。mscorlib.dllはバージョンごとに違うけど、monoランタイムはひとつしかないので*1、ランタイムに組み込んでしまうとけっこうめんどくさいのだ。

将来的にはどうなるんだろう。もしかしたらmonoとmono2みたいに分けちゃったりした方が効率的なんだろうか。両方配布するなんて面倒な事この上ないか。

*1:いやもちろんmonoとmintは別物だけど、CLI metadataを扱うコードは同一のものだ。