トップ 最新 追記

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2004-08-01 どんよりどよどよ…… [長年日記]

% 泣けてくる

ネイティブコードで使う ocaml 用 mpfc を FreeBSD で動かすためにうんうん悩む。ジュールの作成は Windows と同様のやり方で可能なんだが、それを使って簡単なサンプルコード(Windows では動いたもの)を動かそうとすると SEGV で落ちる。なんでだろーと激しく悩んで悩みぬいた挙げ句にやっと core を gdb に食わせれば良いんだと気付く。気付くの遅い。

で、gdb でスタックトレースを見てみると、なぜか _start 関数(たしか libc が main 関数を起動させる関数)が起動しちゃってる。ocaml のプログラムなのになぜ?と思ったが、ネイティブコードだとアセンブラレベルでは C と同等の扱いなんだろうと(とりあえず)納得して、続きを見ていくと、libwsx11.so にある main 関数が呼ばれてそっから次々と WideStudio の関数が呼ばれていってる。んで、ほんとはその前に(実はここがよくわからんのだが)初期化が必要なのに、それがされてないんで SEGV で死ぬ。

とりあえず、この main 関数から実行が始まっちゃっては困るんで、まず main 関数を削除した libwsx11nomain.so を作って、libwsx11.so の代わりにそれをリンクすることに。これでさっきのサンプルは動くようになった。よしよし。ところが…

昨日書いたちょっと大きめのサンプル(ぶっちゃけて言って wsinv の移植版なんだが)を動かそうとすると、なぜか WSDkeyboard::getKey() で SEGV が起こる。これがスタックトレースの結果(適当に折り返してある)。

(gdb) bt
#0  0x28448156 in WSDkeyboard::getKey() () 
    from /usr/local/tmp/ws-v3.80-3_test/lib/libws.so.3.80
#1  0x2850ce56 in _wrap_WSDkeyboard_getKey (args=135244520) at mpfc_wrap.cpp1:12088
#2  0x0807d54b in camlMpfc__fun_7359 ()
#3  0x00000005 in ?? ()
#4  0x83080d1b in ?? ()
Error accessing memory address 0x30a1c189: Bad address.

% いやいやいや、ちょっと待ちなさいあ〜た。そもそも、なぜ『起動直後に』この関数が呼ばれますか?明示的にゲームをスタートさせたあとじゃないと、この関数を呼んでるプロシージャは起動されないはずなのよ。ぬが〜ん。

やっぱり以前、バイトコード用のモジュールをスタティックリンクで作ったときに感じたのと同様、関数の定義をするときに、なぜか一回問答無用で中身が実行されてしまうようだ。…なんでやねん(泣

副作用が無いってのが関数型言語の特徴らしいんだが、それでもそれなりには副作用がある関数だってあるのに、それなのにどうしてこんなことになっちゃうんでしょう。しかもその副作用が致命的なケースだっていうのに……

C++ 側が変な死に方しないのは、今のところバイトコード用のダイナミックリンク版モジュールだけ。なのにこいつは ocaml 側が変な死に方をする。ネイティブコードだと、もしかすると ocaml 側は変な死に方しないかもしれないが、そもそも C++ 側が速攻で死ぬからダメ。……八方塞がりです(泣


2004-08-02 うーんうーん、頭痛がイタい [長年日記]

% 欝モード突入でやる気無し

昨日の OCaml の件がよほど堪えたらしい(苦笑)。何もやる気がしません。どうしてもやらんきゃならんことだけ片付けて、あとはだら〜っとぷよぷよでもフィーバーしとくよ。ちなみに、なぜか今さらサイレントヒル2をやり直してるのも鬱に拍車をかけてるような気がするが(苦笑


2004-08-04 なぜか休みがどんどん減っていく…… [長年日記]

% mpfc for OCaml の現状

丸一日放置したら、いくらか頭も冷えたので、ちょっと今の状況と今後の展望を整理してみようかと。

実はその後、バイトコード版の方で mpfc への関数登録数を絞ったものを作ってやってみたんだが、どうも原因は ref_table overflow ではないようだ。わし、てっきり ref_table overflow が出たあとに SEGV が起こってるとばっかり思ってたんだが、実は先に C 側で SEGV が起こってその後、結果的に OCaml 側でもメモリの確保ができなくなって件のエラーが出ているという塩梅の模様。

んで、じゃあ、なぜ SEGV が起こるか…てのを ocamldebug (バイトコード版のデバッガ)で追ってみたところ……やっぱり WSDkeyboard::getKey() でした(泣

結局どういうことかっていうと、状況からの推測でしかないんだが、どうも OCaml の実行ファイル(ネイティブ版、バイトコード版問わず)って、一番最初に関数の型チェックとやらをやってるようなんだね。んで、定義してある関数が、実際に実行が始まる前に(つまり WideStudio 的な初期化をする前に)まず一度実行されてしまうようなんだな、これが。

せめて先にトップレベルの評価をしてくれれば……と思ったが、他で定義してある関数がそこで使われてたら話にならんからダメか。

まあ、ぶっちゃけて言って、最初に初期化処理がされてないとまともに使えない WideStudio の API と、初期化処理よりも先に型チェックのために一回実行してしまう OCaml は、大変相性がよろしくないというのが判明した次第。わりと泣けます。

とりあえずこれまでのまとめ。

○現在の状況
・スタティックリンクなモジュールだと、libwsx11.so (あるいは .a )の main 関数が
  (WideStudio の初期化前に)実行されてしまってよろしくない。
  ちなみに Windows の場合は、(X Window 環境での libwsx11.so に対応する) libwswin.dll に
  main 関数は無いので、問題が出ない模様。
  これはバイトコードの場合は C 側のファイルを完全にダイナミックリンクにすることで対処可能。
  ネイティブコードの場合はそれでもダメなので、結局 libwsx11.so から main 関数を
  削除するしかなさそう。ただし、これはそれほど面倒なものでもないので気にするほどではない。
・上記の問題をクリアしても、OCaml のプログラムが開始する際には、関数として定義した部分
  (WideStudio のアプリケーションを作るなら外せないイベントプロシージャの部分)が、
  WideStudio の初期化(WSGFdeviceInitialize など)処理の前に型チェックのために一度強制的に
  実行されてしまう。結果、WSGI* などのグローバルインスタンスにアクセスする関数や、
  その他もろもろ(多分ほとんどの WideStudio 関数)が呼ばれている関数で SEGV が起こる。
○じゃあどうするか?
・とにかく、WideStudio の初期化処理の前にもろもろの関数が呼ばれては困るわけで、
  そのためには、初期化以外の部分を後から(動的に)読み込むか、あるいは初期化が終わってから
  OCaml のプログラムが実行されるようにすれば良いのかと。
・バイトコードの場合だと、dynlink モジュール( OCaml のオブジェクトファイルを動的に読み込む
  ためのモジュール)を使えば、もしかすると行けるかも。
  ただ、ちょっと試してみた限りでは、このモジュールの使い方がよくわからなくて、
  行けるかどうかの判断はできなかった。
・ネイティブコードの場合は dynlink モジュールは使えない。
  実現可能かどうかはさっぱりだが、考えられる手段としては、C/C++ で WideStudio の初期化を
  する部分を書き、そこから OCaml の実行を開始させるという方法。
  どうやら ocamlopt (ネイティブコードコンパイラ)の仕事はアセンブリソースを出力するところ
  までで、それから先(アセンブルやリンク)は as なり ld なりに任せてるっぽいので、
  ocamlopt -S でソースを出力させて、中身を覗き、C での main に相当する箇所が
  見付けられれば、先の C で書いた初期化部分からそこを叩いてやって…などと思ったがどうか。
  つーか x86 のアセンブリコードなんか読めねえっての(苦笑
・実は、もし上記の対策が当たったとしても、いろいろと問題はある。
  だって、『実際に呼ぶ前に、問答無用で一度呼ばれる』ってことはだよ? INITIALIZE トリガで
  貼ってあるプロシージャ以外も、必ず最初に一回動いちゃうってことですよ。それってかなり
  ノーサンキューな感じじゃないですか。つーか返値が unit なら中で何やってようが
  関係ないんだから、型チェックなんてすっとばしてくれても良いじゃないかよぅ(泣
  ただ、もしかするとこの型チェックのときにやっているのは、定義してる関数内の個々の
  関数呼び出しをやってみてるだけなのかも知れない。だとすれば、プロシージャが丸ごと
  実行されてしまうわけではないのかも。うーん、どっちかと言うと、こっちの方がしっくり来る?

% と言ったわけで、わりと行き詰まり気味です。つか、もう無理っぽ……あ゛ぁぁ鬱度が増してゆく〜

OCaml という言語自体はすごく良いのになあ…その良いところが今回の件では逆にあだになってるんだなあ、これがなあ、世知辛いなあ、わしの青春を返せって感じだなあ、もうわけわかんねえなあ……

% 投げやり気味な呟き

……いっそのこと実行ファイル形式にするのは諦めて、他のスクリプト言語のようにインタプリタ( ocaml コマンド)にソースを食わせてやる仕様にしちまうか?

……それは虚しすぎる(とりあえず、うまく行きそうではあるが)。

% C から OCaml を起動させる方法

まーなんつーの?アセンブリコードを眺めるより先に、ヘルプをじっくり眺めろと、そゆこってす。まだ試してないけど、とりあえずヘルプで覚えたやり方をサマリっときましょう。

1. ocamlopt で、各 OCaml オブジェクトファイルをリンクする際に、-output-obj オプションを
   付けると、実行ファイルではなく、C オブジェクトが作成されます。
   ocamlc でも同様のことができます。
2. main 関数を含んだ C オブジェクトと、リンクします。この時、OCaml の標準ライブラリ
   -lasmrun (バイトコードの場合は -lcamlrun)も一緒にリンクします。
   拡張ライブラリを使用している時は、それらも一緒にリンクします。(-lstr, -lunix など)
3. C プログラム中で、caml_startup 関数を呼んだ時点から OCaml プログラムが開始されます。

% さて、これでどうにかなると良いけど……どうだろうねぇ。


2004-08-05 伏線回収(?) [長年日記]

% サイレントヒル3を買ってまいりました

当然廉価版のやつ。とりあえず地下鉄に轢かれて死亡(爆

今回の主人公であるヘザーちゃんは、今までの奴らに比べるとわりとまともな気がします。落ちたら死ぬし(笑)。だからわけもなく底の見えない穴に飛び込んだりしません(苦笑)。あと、敵が倒れたあと、蹴っても一発で死にません(不経済)。ジェイムス(2の主人公)よりは体力があるのか(若さ?)走り回っても息が切れません。ただし鉄パイプをがんがん振り回すとハアハア言ってますが。

しかし、もう二時間ばかしやってるのに、謎解きらしきものはまだ一回しか出てきてませんが……バイオハザード3を踏襲してるんですか?主人公がタイトミニの女の子、弾が足りなめで逃げ回るバランス、謎解きよりアクション重視……などなど。さすがに "すたぁ〜ず" とか言いながらドア開けてまで追っかけてくる嫌っぽいやつは(少なくとも今のところは)出てきませんが、(ほとんど)倒せないでっかい敵が数匹まとめて追っかけてきたりはします。そういや、懐かしの巨大ミミズ(?)が出てきましたね。2のときはそもそも人間サイズの敵しか出てこなかったしなあ。でもミミズ君はそこらを歩いてるワンちゃん(っぽいの)よりも弱っちくて、ピストル5発くらいで死にました。あわれ。

ところで舞台がサイレントヒル(町の名前)じゃないような気がするんですが(最初の夢に出てきた遊園地はそれっぽいけど)、看板に偽りありでわ?つーか、4もそうらしいけど。ああ、でも1のときにもこんなようなショッピングモールが出てきてたし(しかもミミズはそこにいたはずだ)、やっぱりサイレントヒルなのかな…

でもやっぱり、裏世界の倒錯度は1が一番だと思うわしだったりしますが。つーかね、高所恐怖症のわしとしては、地面が網の鉄板(なんつーんだっけ?アレ)だけでできていて、その下には何も無いっていうだけでおしっこちびりモードでしたよ。高所恐怖症の人ならわかってくれると思うんだがなあ。

% サイレントヒル3その後

どうも1との関係がかなり深い話のようだねぇ。ヘザーの親父の名前がハリー(1の主人公だと思われる)だったり、地下道のマップなんてやたら1を思い出す作りだったり、裏世界の1の感じに似てたりと、1を愛するわしとしては、2よりもおいしいかも知れん。

いやあ、1もやり直したいんだが、さすがにあれを今見ると画面汚えからなあ(苦笑

あと、日本刀をゲットしたんだが、それの説明が『威力はそこそこで扱いも容易』ってのはどうなのよ?『刃渡り60センチの短めの刀』とはなってるけどさ、扱うのは女の子ですよ?でもまあ、ヘーちゃんはわりと力持ちさんで、トゲ付き鉄球の付いたハンマーをブンブン振り回したりしちゃうんで、平気のヘーなんでしょうかね(笑


2004-08-08 今年は暑いです。 [長年日記]

% せっかくの休みを…

だらだらと寝っころがって適当にゲームとかやりながら過ごしてしまっている不毛度 90% 突破気味なわし。なんかやりたいことは一杯あったはずなのにどうしてこないなことに?

つーかねぇ、暑いんだよ、暑いのもう。一体ここはどこなんだ?ってくらい。北海道の夏ってのはさあ、いくら昼間暑くても夜になるとぐっと過ごしやすくなるはずなのですよ。それが何?今年は。

まあ、それでも本州の人に比べれば平穏な夏を過ごしてるはずなんだけどねえ……文句言っても始まらないからおとなしくだらけてます(それじゃダメだろう)。


2004-08-10 誕生日には何かが当たる [長年日記]

% dicttools.rb

たぶん誰も使っていない(わし自身は、わりと使ってます)と思われるが、ひさしぶりに dicttools.rb を逃避モードでだらだら眺めてたら、有り得ないほど恥ずかしい(苦笑)ミスがあったんで、人知れず直しておきました。まあ、本来の目的である英辞郎の辞書を使う際には問題にならない問題なんだけども。・・・はあ、いかに適当なデバッグしかやってないかが露呈したなあ(笑

% 車、ぶつけられる

登り坂で信号待ちしてたらですね、前の車がとろとろ〜っと下がって来まして、それはもう有りったけの気合いでもってクラクション鳴らしたんですが、結局コツンと。

坂道の多い町に住んでると、その手のことで冷やっとすることって結構あるんで、わりと車間を空けて止めるクセがついてるんだが、その安全マージンも乗り越えてぶつかってきましたよ。やれやれだ。

まあね、わりと緩やかな坂道だったんで(だから当たるまで結構時間があったはずなんだがなあ)大した被害もなく、わしがちょっぴり恐めの風貌なせいか(中身はそんなことないんですよ)えらくすんませんすんません謝るんで、逆に可哀想になってしまって、やたらいい人風味で許してあげちゃいましたが・・・まあ良いか。

結局何が原因だったかと言うと、サイドブレーキかけて安心してたらしいです。んで音楽大ボリューム状態だったんで、クラクションが聴こえんかったと。・・・サイドブレーキを過信しちゃいけません。気をつけましょうね、みなさん。

% XFree86 4.4.0 にアップグレード中

Xorg が Ports に取り込まれたのに XFree86 は 4.3.0 のままで、/usr/ports/UPDATING には Xorg への乗り換えのすすめ(?)みたいなのまで書いてあったりして、もしかして Linux 陣営みたく 4.4.0 は無視して Xorg に全面移行ですか?と思ってたんだが、遅ればせながら 4.4.0 が Ports に入ってきたんで、別に GNU 信者でもないわしは素直に 4.4.0 を入れましょうってことで絶賛アップグレード中。

なんつーか、Xorg への移行がびみょーにめんどくさげだったんで二の足踏んでたんだけど、いやあ、優柔不断もたまには役に立つ(笑)。おかげで面倒無くアップグレードでけます。あとはなぜか Xorg の方のソースを必要としてしまう graphics/dri (XFree86-4-Server がこれに依存してるのよ)が、XFree86 の方のソースを使うように戻ってくれれば(分れるんでもいいけど)、万事オーケーなんだが……ちなみに気付かずに dri をアップグレードしてしまって知らないうちに Xorg のソース(わりとデカイ)をダウンロードされてたのが結構ブルーだったんで、dri はホールドしましたよ。XF86 のソースを使うように直らないうちはそのままにする予定。

つーか、個人的には dri なんて必要無い(というか、わしのマシンには意味が無い)んだから、強制的に依存するのはやめてくれって感じなんだがなあ。


2004-08-11 やっと北海道らしいカラっとした夏が…… [長年日記]

% おきゃむる日記日記

ちゅうことで(?)、OCaml ネタのページを更新しましたよ。手続き型言語にどっぷり漬かってしまっている人のための末尾再帰入門と、そっから派生した雑談です。


2004-08-15 欝モード継続中… [長年日記]

% モ、モニタが……

なんだか寿命な気配。はぁぁぁぁぁぁ(大溜息)。欝モードに追い撃ちですか。なんかやたら画面が暗いし、電源入れてから画面が見えてくるまで、ものすごく時間がかかるのです。15 分くらい経たないとまともに見えない。色もなんか黄色っぽいし。まあねえ、わりと無茶な使い方してたし(ずーっと電源入れっぱなしとか)、買ってから…えーと何年経つんだっけ? PowerMacG3 買ったときのだから、7,8 年ってとこか?まあ、こんなもんかもなあ。

問題はこれが無いとゲームができないってことなんですが(苦笑)、やれやれ、一応余ってるテレビが一台あるんで、当面はそれでしのぎますか。でも、最終的にはどうしたら良いんかなあ……


2004-08-17 涼しくなったらなったで体調を崩す…軟弱者め [長年日記]

% Proc クラス (2004/09/15 修正)

Ruby を使ってて関数ポインタ的なものを使いたい場合の選択肢は、基本的に Proc クラスを使うことですな。lambda とかって構文(?)もあるけど、実際上は Proc オブジェクトを作るシンタックスシュガーのようなもん(厳密に言うと引数の扱いが微妙に違ったりするらしいが…)だし。

最近 OCaml を触るようになったから…ってわけじゃなくて、もっと以前から思ってたんだが、関数ポインタを使えばすっきり書けるかも、って場面がそれなりにあって、そういうときに Proc を使うのってどうにも使いづらいというかなんというかなのよね。例えば…

def f1(x, y)
   x + y
end

% みたいな関数がすでにあって、これを Proc オブジェクトで使いたいって場合、いちいち…

proc1 = Proc.new { |x, y| f1(x, y) }

% なんてことをしなきゃいけない ←嘘でしたね (こちらを参照)。しかも使うときには proc1(x, y) ではダメで、proc1.call(x, y) と書かなくてはならん。個人的にはこーゆーときは…

proc1 = f1.to_proc
proc1(1, 2)

% てな書き方ができないもんかと思っちゃうんですが、そういうわけにも行かんのかなあ。こういうときだけ、Python に乗り換えようかしらとか思っちゃうんだけど、int() とかで萎え〜ってなって諦めるのがオチだったり(苦笑)。ちなみに Python では通常の関数もオブジェクトなので…

def f1(x, y):
   return x + y
proc1 = f1
proc1(1, 2)    #=> 3

% のような書き方が可能です。OCaml の場合は、こんなのは当り前のようにできてしまうんで、その辺も好みの部分ではあるのかも。

でもまあ、言語仕様の一貫性だとか、(特に日本人としての)使い勝手の良さとか、そういうところで Ruby に敵う言語は今のところ知らんので、生活用言語としての Ruby を捨てることは考えられません。

結局何が言いたかったのかと言うと……ただの愚痴(爆

% わりとおもしろそうなプログラミング言語 Soopy

OCaml の情報を集めてて知った新興言語。関数型言語の影響を受けた手続き型言語って感じ?言語仕様的に特にめずらしいものがある風でもないんだが、個人的にやたらと心惹かれる要素があって、それって何かと言うと、いわゆる char 型(文字型)の値がなんと TRON コードらしいのだな、これが(笑

いや、別に笑うところじゃないか(苦笑)。まだ超漢字では動かないが、ToDo には入ってるので、いずれは動くようになる可能性が高い。今のところ、いわゆる Lightweight Langage で TRON コードが使えるものって他に聞いたこと無いんで、結構期待してしまったりするわしです。超漢字用の Ruby で TRON コードが使えるようになるのも期待してたりするんだが、そっちはなかなか進んでない様子。OCaml に慣れてきたおかげで、文法的にも特に忌避感は無いし、これからが楽しみな言語です、Soopy。

まあ、とは言え、まだまだ仕様もがっちり決まってないような言語を使うほどのバイタリティは無いので(だから密かに興味をそそられてる D 言語なんかも手を出してないし)、しばらくは生暖かく見守る予定。関数の宣言自体に、例外処理に関係する部分が含まれてたりするのが、ちょっとおもしろいかも。

% おもしろいと言えば、こんなの

わしは覚える気無いですが(苦笑)。でも、プログラミング言語T(オフィシャルなページが見付からなかったんでこの辺で勘弁)なんかよりは、よっぽど日本語っぽく書けるみたいなんで、英語嫌いな人はいかが?

% soopy を FreeBSD でビルドしてみた

sourceforge.jp から tar ball を拾ってきて、Makefile をちょこっといじって gmake 。わりとすんなり完了。gcc のバージョン絡みっぽいエラーは出たが、適当にキャストしてやればオーケー的な問題だったんで、その方向でやっといたっす。

とりあえず、おもしろかったのは src/test/japan.sp というサンプルファイル。なんと、『soopyは、文字、文字列以外では、大文字・小文字・全角・半角を区別しない。』…んだそうですよ。このサンプル見ると、「すわ!! プログラミング言語 T !? もしくは日本語版 AppleScript !?」などと思ってしまいます(笑)。変数や関数名なんかが漢字になってたりして違和感バリバリ(苦笑

もしかすると、これは超漢字への展開を視野に入れた仕様なのかしら?個人的には気持ち悪いけど、全角半角の区別をめんどくさがる人も世の中にはいるんで、そゆ人には良いのかもね。


2004-08-18 冷房病がこわい [長年日記]

% 仕事しながら soopy をつついてみてたり

結構 Ruby に近いのかも…と思った。あらゆるものがオブジェクトで、基本的な操作が『オブジェクト(レシーバ)に対してメッセージ(メソッド)を送る』という形で一貫してるのが特徴。Ruby と違って関数もオブジェクトなんで、その辺は好み。

ブレース ( { } ) で囲んだブロックを無名関数として使えるんで、Ruby のブロック付きメソッド (ぶっちゃけてイテレータ) みたいな書き方が、特別な構文じゃなしにできちゃいます。結構おもしろいです。いわゆるクラスというものが無くて、このブロック ( NameSpace というらしい) を使って型を作ります。NameSpace はいわゆるハッシュテーブルなので、構造体のようにも使えます。各メンバに対するアクセス制限の手段は、まだ提供されてない模様。 ← ありました。嘘言ってごめんなさい。各要素の頭に private とか public と付けてやると良いようだ。

まだまだ発展途上だな〜と思う点として、ゼロ除算するとインタプリタごと死ぬ (at Win2k) っていう、ちょっと情けない問題が(苦笑)。ソースを見てみたら、計算関係の処理はほんとにただ計算させてるだけで、例外処理とか全然やってないみたいです。ま、地味な作業だしね、1.0 になるときで良いやっていう感じ?

% soopy のソース読み

まだ発展途上なおかげか、見通しが良くて読みやすいんで、ついつい(苦笑

garbage collection の仕組みが見当たらないんで、どうしてるのかな〜と思ったら、SpValue クラス (Ruby で言えば VALUE にあたるもの) のコンストラクタとデストラクタで SpObject (各オブジェクトの基底クラス) の参照数を増減させて、0 になった時点で delete してるようだ。簡易的な GC ってところか。ただ、これだとヘビィな使い方したときに、メモリ断片化が問題になりそうだね。compaction の仕組みなんかも特に用意されてないみたいだし。C++ って勝手にメモリコンパクションしてくれたりはしないよね、きっと?

ちなみに Ruby ではその辺どうしてるのかと思って gc.c 辺りを斜め読みしてみると……どうも適当な大きさのブロック単位で malloc して、そこから実際のメモリ割り当てをしてるみたい。たぶん。じっくり読んだわけじゃないからあれだけど、そのブロックが断片化したら (というか、メモリを確保できなくなったら) 新しいブロックを確保してメモリをコピーして、断片化したブロックは free するってなことをしてるんじゃないかと想像。あくまで想像だが(笑

% inline 関数

(C++ ではなくて素の) C 言語の場合、実装を include するな (要するにヘッダに実装を書くな) っていう鉄則…というかお約束?みたいなのがあると思うんだけど、C++ の inline 関数ってそれを台無しにしてくれるから個人的には嫌いだな。もちろんパフォーマンスのために有効なのは想像が付くし (スタック積まなくてよくなるってことだよね、たぶん)、存在を認めないわけではないんだけど。

でも関数の中身が見たくて実装ファイル (拡張子が cpp とかのファイルね) を見てるのに、そこで inline な関数が呼ばれてたりすると、おんなじクラス内の処理なのにわざわざヘッダを見なきゃならない。うぜぇ。

…あー、でもたしか "inline" って予約語があるよねぇ。あれを使えば実際にクラス定義の中に書かなくても inline 関数になる…ってことじゃないのか?

まあ、関数マクロの方が凶悪だって話もあるが…少なくとも自分ではよっぽどのことがないと使いたくないものの筆頭だしね。

% "(" が入力できない

いつの頃からか、文字入力が端末任せ(libreadline とか使ってない)な対話型アプリで、Shift+9 で "(" が入力できなくなってしまった。それどころか、なぜかバックスペースになっちゃう謎っぷり。具体的にどんなアプリが該当するかと言うと、/bin/sh とか 'perl -d -e 42' とか soopy とか。ただ、通常のコンソールではなんともないんで、X が 4.4.0 になった頃が怪しい。

でもまあ、OCaml で遊ぶときに大層お世話になっている ledit があれば、そこら辺は全然なんとかなってしまうんで、実害は別に無かったりするんだが(苦笑

ちなみに ledit は残念なことに FreeBSD の ports には含まれてないんで、自前で入れてます。OCaml で書かれてるんで、OCaml が必要です(当り前だけど)。まあ、これだけのために(使いもしないのに) OCaml をインストールするのはどうかと思うけど、もし OCaml を使っているんであれば、ledit は入れておいて損はしない逸品ですよ。黙って『ledit』で検索すると、(個人的にはどうでもいい) Windows 用のテキストエディタとかが引っかかりやすいんで気をつけましょう。他にも『お急ぎのときももう安心』とか変なのが引っかかるんで、そーゆーとこに間違って迷い込まないように(笑

% "(" の件、続き

なんとなく xterm で試してみたら何事もなく動いてる罠。じゃあ何か? uim-xim か?と uim-xim を外してみるがダメ。…どうやら、あまり考えたくないんだけど愛用する ja-aterm が問題みたいですな。はうぅ。とりあえず、ビルドし直してみたが改善しないんで、諦めてこのまま使います。実害無いし。たぶん X が 4.4.0 に上がった関係で何かが変わって、地雷を踏んだんでしょう。

……って言うかさぁ、『Shift+9 が BackSpace に変わる』地雷ってどんなんよ?謎すぎるって(苦笑

% 今気付いたが…

『jijixi』をキーワードにした検索結果からの referer が付いてて、ちとビビる。まあ、WideStudio のページとか、ここのサイトを間借りして公開してるから『jijixi』っていう(知らない人が見れば)謎の文字列もそれなりに露出してるんで、有り得ない話じゃないんだけど。

あとはまあ、アッチ方面ではこのハンドルで露出してるしね。あ、そういや soopy の wiki にツッコミ入れるときに間違ってこのハンドル使ったんだっけ(笑)。ほんとはそーゆーマジメなネタ方面では本名(か、それ系のハンドル)を使おうと思ってたんだけど。jijixi はバカやる方面用のハンドルなんで(苦笑

とは言え、最近じゃその辺の区別もどうでもよくなってる気がするんで、どっちでも良いや、もう。

% あーだこーだ文句言いつつ、はまってるっぽい soopy

まあ、期待大なのは間違い無いし、穴があるからおもしろいっていうひねくれた(と言うか技術屋ってそーゆーもんじゃないか?)論理からも、すっかりはまってる気がします(苦笑

以下、現状で ??? と思う部分を列挙。

・配列ってどうやって使うの?
  作り方はわかる。各要素へのアクセスもできる。でもなんか不便。そんな感じ。
  一応、ありがちな『配列の配列』による多次元化じゃなく、ほんとに多次元配列のようだ。
  サンプルを見てみるが、やっぱり泥くさくループで埋めてループで処理してる。
  今のところ、そういう使い方しかできないのか……
  せめて、List オブジェクトに定義されてる each とか map あたりのような
  メソッドが無いと、まともに使う気にはなれないなあ。今後に期待。
・なぜ seek が無いのか?
  ファイル IO や、String オブジェクトから作れる reader オブジェクトのような、
  シーケンシャルアクセスするオブジェクトに C 言語で言うところの fseek や fsetpos
  のようなメソッドが無いのが、ちょっとハテナ。
  まあ、多言語が絡むと位置の問題はわりと微妙そうなんで、seek は置いとくとしても、
  eof? (EOF か調べる) はあるんだから、せめて rewind 相当のものくらいは
  あっても良いんじゃないかと思うんだが…
  つーか、一旦 EOF まで読んじゃったら、あとは close して open し直すしかない…
  ってのもさみしいものがある気がする。
・オブジェクトを delete するタイミングがわりと微妙な気が…
  SpValue::ReleaseObject() でオブジェクトの参照カウントをデクリメントして、
  それが 0 になってたら delete するようになってるわけだけど、そのデクリメント
  あるいは RetainObject() でのインクリメントをする時は mutex でスレッドの
  排他処理をしている。(マルチスレッドには詳しくないので用語が変だったら失礼)
  んで、『参照カウントが 0 だったら delete』って部分が、この排他処理の外側に
  あるんだな。これって(可能性としては低いだろうけど)ロックが解除されてから、
  オブジェクトが delete されるまでの間に、他のスレッドで参照カウントが
  上がる可能性ってあるんじゃないのかしら。
  万全を期するなら、delete するところまで mutex でロックすべきなんじゃないかと
  思った……んだが、そのロックに使う mutex オブジェクトは delete されるはずの
  オブジェクトが持ってたりするんで、今のままでは無理ですな。
  まあ、ほんとにそういう危険があるのかは、ようわからんのだけど(苦笑
  そもそも参照カウントが 0 になった時点で、どのスレッドからも見えてないはず
  なんだから、気にする必要無いんだろうか。
  うーん、でもやっぱ不安だなあ。スレッドコンテキストの切り替えが、どういう
  タイミングで起こり得る(と言うか、起こり得ない)のかがわからんから。
  でもまあ、問題が起こるとしても、ものすごいレアケースだとは思うけどね。
  とりあえず、ad hoc に対応するなら、delete 予定になった時点でロック中に
  適当なマーキングをして、そのマークが付いてる場合は RetainObject() で
  例外でも上げるとかですかねえ。

% マルチスレッドってタイミングバグの宝庫って感じがするよね。人間の脳はマルチスレッドじゃないからさ、人間がマルチスレッドプログラムのデバッグをするのなんて、理論的に無理なんじゃないかと思ったりもする。少なくとも理路整然と対処するってのは無理なんじゃない?(笑


2004-08-19 言語マニア化しつつあるな(苦笑) [長年日記]

% 今日の新言語 Groovy

つっても、わしが今日初めて使ったってだけで、それほど新しいわけでもないのかも知れんが。ぶっちゃけて言って、JavaVM 上で動く JAVA の上位互換の Ruby もどき言語、って感じ。基本的には JAVA プログラマが簡単にコーディングできて、今までの(JAVA での)資産が完璧に活かせる…ってのがウリらしいので、JAVA プログラマではないわし(一応勉強はしたけど、好きになれなかった)にとっては、別になんてことない言語ではあります。ふ〜ん、って言うか Ruby で良いんじゃん?みたいな(笑

細かい部分はさておき、とっつきの部分では Ruby やってる人は結構すんなり入れそうな感じだね。個人的に Ruby より好みな部分としては Closure オブジェクト(Ruby での Proc に相当)を、通常の関数のように呼べること。あとは、制御構造とか関数定義とかの囲みが do..end じゃなくて { } のブロックなあたりとか。どうも end は好きくない。それなら endif とか書いた方がマシって気がする。

% ledit のために…

昨日 ledit のことを書いたら、なんだかやたら ledit が恋しくなっちゃって職場の Win2k マシンにも導入しようと試みる。…が、インストール済みの mingw32 版 OCaml では unix モジュールの実装が完全じゃないせいで動かない罠。そのまま勢いに任せて cygwin 版をビルドしてそっちを使うことにしましたよ。おかげで groovysh (groovy の対話型インタプリタ)で遊ぶときも行編集ができて嬉しい感じです。

% 多次元配列の存在意義って?

以前にも同じように悩んだことがあるが、今回は輪をかけて気になってしまって、暇さえあれば考えてる。『配列の配列(ネストした配列)』ではなく『多次元配列』であることの意義って何だろう。はっきり言って、いくら考えてもわからない(苦笑

で、結局実装レベルでの考察しかできないのが腑甲斐無い。でも実際、多次元配列でないとできないこと…なんてある?

さて、そんで soopy の配列はどんな実装がされてるのか見てみると…どうやら実体は一次元の配列(厳密に言うと vector<SpValue> なオブジェクト)で、添字アクセスの時には、それを包んでる SpObjectArray が添字に対応した値を返すようになってるだけ。(ところで vector クラスってのは便利機能が追加された配列…って認識でだいたいあってるよね?)

うーん、やっぱわからん(苦笑)。ちなみに、リストはやっぱり名前から連想されるように連結リストみたいです。頭に追加するのだけは簡単(OCaml にもある x::xs ってやつ)だとかってところからして、想像はついてたけど。

% んで、soopy の配列オブジェクトに足りない機能は何だろう

…というのも、昨日からあーだこーだ考えてる。大きなお世話かも知れんが(笑

Ruby の Array クラスのように、適当に切ったり貼ったりして、中身を使うときはイテレータでドン……って使い方をするならリストで間に合ってますって気がしないでもなくて、じゃあ soopy で(実は OCaml でもおんなじこと思ってるんだが)、リストとは別に配列が用意されている意味とは何だろう…と考えると……何なんだろうね。わしの貧弱な脳味噌じゃよくわからん。ものすごくでかいリストだったりすると先の方の要素にアクセスするのは時間がかかりそうだなあ、という気はする。大っきなデータベースみたいなのを作るなら配列の方が有利なのかね。

とりあえず、初期化を助けるためにも、生成時にブロックを渡せるようにするとか、破壊的な map 関数を追加するとか、そーゆーのが欲しいですね。どっちも Ruby のパクリくさいけど(苦笑

あと、map とか each みたいなのを追加するなら、関数を適用する深さを指定できると便利かも。

他には…任意の次元の任意の行(って言うのか?)をリストとして取り出せるとか。あ、でももし map が部分適用できるようになるなら、自分で書けちゃうかな。いや、逆か?任意の部分を切り出す方法ができれば、map の部分適用はそれを利用してできるようになるな。どっちが楽なんだろ。


2004-08-20 今日は肌寒い [長年日記]

% 今日の新言語 Jolt

情報は Matzにっきより。なんつーか、Ruby のユーザだから…ってんでもないんだけど、尊敬する人ランキングの上位に位置する人であるからして、たまに思い出したように訪れてはまとめ読みする…って感じだったんですが……最近は言語マニアモード(謎)なんで、わりと頻繁にチェックしてます。

んで、Jolt がどんな言語かってのは Matz 氏のコメントを参照してもらうとして、さらっとリファレンスマニュアルを斜め読みしてみた。つーか英語だから、じっくり読んでたりすると日が暮れます(苦笑

たしかに構文のところを見ると、かなり Ruby にそっくりなのがわかる。でも、無茶に多いクラスメンバの属性指定とか、演算子の違いとかから考えると、実際にコードを書いていくと Ruby のようには見えないんじゃないかな〜って気もするね。Groovy なんかは JAVA 寄りの機能を使わずに書いてれば、かなり Ruby っぽく見えそうだけど。

静的型付け言語として見ると、C++ の template がクラス定義の構文に組み込まれてるのが、わりと便利かも。つーか template って何なのかさっぱりわかってなかったんだが、最近 OCaml を勉強したおかげで何となくわかったよ。要するにこれって、型多相なクラスなり関数なりを定義するための仕組みなんだよね、きっと。

……で、結局わしが Jolt を使うことがあるか、と言うと……多分無いでしょう(苦笑)。静的型付けな Ruby ってのには心惹かれるものがあるんだが、これは何か違うんじゃないかなぁって気がします。そもそも do..end な書き方に惚れてるわけじゃないしなあ(笑

たぶん、わしが求めてるものって、静的型付け『も』可能で、文法がちょっとだけわし好みになってる Ruby なんじゃないかしら。そうすると何だ、Ruby のコードにコンパイルするコンパイラを作れば良いってことか?(つーか、こういうのはコンパイラじゃなくてトランスレータだろうか?) コンパイラかぁ、わりとチャレンジしてみたい分野ではあるんだけどねぇ……いかんせん脳の性能が(爆

% 今日の新言語その2 Aleph

これも Matzにっきから。日本限定で微妙に悪印象を与える名前な気がします(苦笑)。ちなみに www.aleph.org は、なんかユダヤ教関係(?)の団体のようだ。さらにちなみに www.ruby.org は net identity とかいうドメイン貸し業者(?)が保有してる模様。さらにさらにちなみに www.ruby.com は宝石商だったりする。くどいのでもうやめます。

さて、まだぜんぜん見てないんだけど、とりあえず『Aleph does not have a garbage collector. Aleph operates with a lazy, scope based, object destruction mechanism. Each time an object is no longer visible, it is destroyed automatically.』って書いてあるのが気になった。基本的には soopy と同じ方針ってことだよね。うーん、大丈夫なんだろうか。実は C に比べて C++ ではメモリ割り当てにかしこいアルゴリズムを使ってて、メモリの断片化がほとんど起きない…とかって事実でもあるんでしょうか?聞いたこと無いけど。断片化しにくいファイルシステム(UFS とか)ってのは聞いたことあるけどなあ。

% Aleph の続き

あー、ダメ、ダメなのよ、Lisp 系は……カッコ地獄コワい。前置記法キモチワルい。そんな感じで(苦笑

Programmer's Guide の最初の方だけ読んで見切りを付けたが、さすがにアレかと思って、一応ウリの一つであるスレッド関係のところあたりまでは流し読みしてみた。…が、ダメだ、やっぱ。いや、別に Lisp はダメな言語だとか言うつもりは毛頭無くて、ただ単にわしの肌に合わないってだけだってことですよ、念の為。


2004-08-21 齢三十も過ぎると… [長年日記]

% 若かりし頃には考えられなかったが、資本論なんかについて激論を交わしてみたり

まあ、三十過ぎると、そのくらいの話もしてみたくなります。…なるけど普通はしません。なぜかってあ〜た、そりゃさぶいからっしょ(苦笑

でもまあ、酔った勢いで語ったりするのも一つの方向。つか、素面じゃ絶対しませんが。あと、ここに論舌を広げたりもしません。だって色んな意味で不毛だしね。わしは、わりと悲観論者なところがあるので、わりとそういう方向の話をします。性善説は素晴らしいし憧れもするけど、現実ではないですよね。性善説によって構築された初期のインターネットは素晴らしいものだったと思う。そして、それを汚す数多の悪(表面的には Spam とかウイルスとか)の存在を憎みもする。

それじゃあ、そういった悪なことをする人間が、全て死に絶えたらどうだろう?…残念ながら何も変わらないでしょう。常に一定の割合で悪が存在する……それが群体としての人間だから。そんな悲観論。……論舌広げてませんか!?…広がりきらないうちに終了ってことで。


2004-08-22 駒苫優勝おめでとう [長年日記]

% いや〜、すげぇ試合だったねえ

実は高校野球ってあんまり見ないんだけど、北海道人としてはさすがに今日の試合は見逃せなかったんで、かぶりつきで見てましたよ。なんかメジャーリーグみたいな力のぶつかり合いだったね。乱打戦でもなくて投手がショボいんでもなくて、ほんとの意味での打撃戦…って感じか。

理詰めの野球も良いけど、こういうのも良いよなあ。興奮したよ。


2004-08-23 いつも眠そうな男、それがわし [長年日記]

% 今日の新言語 AIR

今どきめずらしい『オブジェクト指向じゃない』LightweightLangage 。なんか変なもんないかなーって Sourceforge.jp をうろちょろしてたら見つけた。極力 C とか AWK なんかの文法に似せながら、手軽に書ける言語にしようって感じのコンセプトらしい。わりとおもしろいとは思うけど、Ruby やなんかに慣れてしまった今、これを使うかって言ったら、ちょっと使わんなあ(苦笑

ちなみにゴミ集めには、w3m とかも使ってる BoehmGC を使ってます。

% Perl の納得いかないところ(笑

上記 AIR の開発者の Perl に対するコメントとか読んでて、ちょっと思い出しちゃったんで。

スカラとベクタの変数名を厳密に分ける(頭に $ か @ や % かってのね)ってのまでは、まあ分からんでもないんだ。それなりに利に適ってる。そこまではいいのよ。でもさ、配列の時は @ary なのに、配列の要素になった途端 $ary[0] になるのはどうなのよ。その要素を代入する先の変数が $ なんたらだってんなら分かるけど、どうも納得いかんのだよなあ。それでも、@ary と $ary って変数が同時に存在できないなら、ある程度納得するんだけどな。@ とか $ は変数名じゃなくある種の修飾子なんだと考えればつじつまが合う。でも実際は両立できるじゃん?ほんとに Larry Wall って言語学者なのか?(言いすぎ)・・・いや、言語学者だからこそ、『文脈が違えば意味も違う』とかって話になってくるのかね?

ただ単にパーザが手を抜くための仕様じゃないのか…とか思っちゃったりもするんだが……

% XFree86 4.4.0 の port が revision bump してたのでアップグレードしたら…

uim が動かねえぞ!つーか VJE も動かないから XIM 絡みが死んでるのか?実際には動かないわけじゃなくて、ちゃんとプロセスは起きてるから、多分 XIM の通信がおかしいんだろうなあ。あーもー、どーすんだよぅ(泣


2004-08-24 ああ、ヌルい… [長年日記]

% uim-xim が使えなくなったのは…

XF86 とは関係なかったっす。原因はわしのヌルさ。恥ずかしいから詳細は書きません(笑

% 今月のガンスリ

……痛死ぬところだった(苦笑

% 今月のよつばと!

「だれだ!?てきか!?みかたか!?」「敵よ!!」・・・息ぴったりだよな、この二人(笑

% uim-xim 騒ぎの副産物

aterm のせいかどうか切り分けが必要だったんで、適当な端末エミュレータが必要だなあと思って、今まで一度たりと好みの設定ができなくて捨ててた mlterm に再挑戦。…って言うか失敗してたのはいつも Debian での話で、FreeBSD で使うのは初めてだったりする。

んで、daemon モードってのに激しく惚れ込んでしまって常用決定。メモリ不足に苦しむわしにとってはとても嬉しい機能だ。あとは README 見ながらせっせと設定。とりあえず大好きな東雲明朝を使えるようにしたが、termcap のエントリが無いのが困ってる。termtype の設定は "mlterm" を推奨とか書いてるんだが、そのエントリがどこにも書いてないんだよな…つーか、/usr/X11R6/etc/mlterm/termcap にはそれっぽいのが書いてあるが、実際使いものにはならん。仕方なく kterm のエントリでしのごうと思ったら mutt や slrn で背景の色が黒にならないワナ(そういう設定にしてるんですわ)。結局、(default の) xterm に設定して様子を見ることに。

% 改修したい

…と前から思ってるのよ、dicttools.rb の。二分探索のくせに妙に検索時間に偏りがあるんで、たぶんどっかにボトルネックがあるんだと思うんだが、その辺を何とかしたいな、と。まあ、ちゃんと調べたわけじゃないけど、だいたいどこが悪いのか想像はついてて、どう直すかの案もあるんだが、なんかめんどくさがってしまってついつい放置。ダメだなあ。


2004-08-25 気になるんだから、しかたがない [長年日記]

% まだ気にしてるメモリ断片化の問題

soopy や aleph のやり方はほんとに大丈夫なのか?という疑問が払拭できないわしだったりします。まあ、大きなお世話なんだろうけど(苦笑

とりあえず、C++ の new は C の malloc よりも賢いアルゴリズムを使っていて、メモリの断片化が起きにくい…と前提してみよう。……それでも、やっぱり不安だよ。普通に C/C++ でアプリケーションを書くんなら気にするほどではないのかも知れないが、こういうスクリプト言語の実装では、通常のアプリに比べて、大量のオブジェクトをヒープに確保して、それらをどんどん使い捨てていくわけだから、あっと言う間に(…は言いすぎか?)ヒープ領域がぐだぐだになっちゃいそうな気がする。

メジャーな言語ではどうしてるんだろう?ってことで、前回の Ruby に引き続き Python のソースを見てみることに。で、Objects/obmalloc.c を見ると…やっぱり Ruby と同じようにまとめて malloc した領域からそれぞれのオブジェクトにメモリを割当てている。コンパクションの機能があるかどうかまでは見てないけど、これだけでもメモリの断片化防止には随分効果があるだろう。ただ、こういう構成なのは GC を実装するために有利だからってだけで、断片化に配慮してこうなっているというわけではない可能性もあるし、一概に必要なんだとは言えないなあ。うーん……

今度は(あんまり見たくないけど) Perl のソースでも見てみるかなあ。

% ほんとはやろうと思ってること、いっぱいあるのに

どうもまとまった時間が取れなくてなあ……結果、片手間でもできる『うだうだ考える』作業(作業か?)ばっかりやってるね。

それはそうと、Windows で uim なインプットメソッド作ってる人っていないのかなあ。最近すっかり Prime に慣れちゃって、skk (Windows では skkime を使っている)で入力するのタルいんですが(贅沢)。実際、キータイプの量が倍は違うよね。しかも Prime で打ってるときのくせで中途半端なとこで変換キー押しちゃったり、さらにそのまま確定しちゃったりして、修正する作業まで入れるとかなりばかにならない違いだぞ。いやぁ、予測入力って人間を堕落させるな(笑

% メモリ割り当ていろいろ

…について google 参りしてて見つけた論文。修士論文なんで、それほど突っ込んだ内容ではないけど、ヌルいわしにはちょうど良かった(笑

結局、今どきのパソコンでメモリの断片化を心配してるわしは、考えがみみっちいのかなあ…とか思ったりもするんだが(苦笑)、わりと脳が組込み志向と言うか、貧弱な環境で動くものに惚れやすいタイプなんでねえ。Teacube 欲すぃ(関係無い)。でも、T-Engine よりも μT-Engine の方が気になってしまう小物志向なわし。これとか。人工網膜カメラとか、めっさそそられる(笑)。まあ、「何に使うんだ?」って聞かれたら「さあ?」って言うしかないんだが(爆

% ドットピッチが細かい人のことも考えろ

font-size を絶対値で指定してあるスタイルシート(に限らないが)にはキレそうになる。んで、そういうのに限って IE を意識してるのか小さめのサイズにしてあるんだな、これが。見づれえっての!! IE のデフォ設定が腐ってるからって、それに合わせた絶対値設定とかすんな。

12px とかならまだ許せるが、10px とか指定されると読めねえよ。こんなん、お年寄りとかどうすんだ。そんで、ムカつきながら 150% とかにズームして見てると、他のページに飛んだ瞬間にのけぞるわけだ、『字ぃでけえ!』。

標準のフォントをでかくしてる人がレイアウト崩れたって、その人の責任なんだから相対値にしとけよ、まったく……

……はあ、やっぱ WEB は w3m で見るのが一番だよな。


2004-08-26 つれづれなるままに [長年日記]

% OCaml on Cygwin

…なんか腐ってる。ocaml コマンド(対話実行環境)でシンタクスエラーを出すと軒並み落ちるの。……いや、それ対話環境の意味無いから(苦笑

cygwin 環境ではプログラムが死んでもコアを吐いてくれないので、何がいかんのか調べるのはどうしたもんだかわかりません。なんか代わりにスタックダンプを吐いてくれるけど、メモリアドレスしか書いてないからどこで止まってるのかわからん。でも、かろうじて有用な情報として STATUS_ACCESS_VIOLATION という文字が。

調べてみるとこの例外(?)は w32api 関係のヘッダで定義されている。はあ、そーすっと OCaml のと言うよりは cygwin のバグなのか? cygwin における OCaml は完全に UN*X 扱いしてるっぽいんで、直接 win32api に触ったりしてなさそうなんだが。

とりあえず、win32api がエラーを出してるってことは、例えばコマンドプロンプトじゃなく rxvt で実行したらどうなのよ?…と思って試してみると……落ちない。どうやらコマンドプロンプトで Cygwin を使ってるのがよろしくない様子。はあ、ちとめんどいけど(設定が)、rxvt に乗り換えるかなあ。

% 今月のおお振り

なんだ、ラブラブだな、おい。って感じ(笑)。ホ○が好きな女子のみなさんからすれば、ネタにするなってのが無理な展開ではあるな(苦笑

まあ、それはともかく、いよいよ夏本番に向けて動き始めて楽しみになってまいりました。一年生ばっかりで結成間もないあのチームで、勝つ気まんまんなモモカンがステキ。

軟投派の三橋にとっての強敵って、実は強打者よりもミートがうまい選手だと思うんで、その辺をどう攻略していくのかが、個人的な見所。

それはそうと、雑誌の発売日前後が発売日の単行本を、『絶賛発売中』って書くのはやめてくれんかなあ。いなかだと単行本とかは大抵二日遅れなんだけど、発売中と書かれると(事前に発売日をチェックしてないと)実際にはまだ売ってないのに、一生懸命探しちゃうのよ。絶賛発売中(首都圏では)なのは良いけど、いつ発売になったのかもちゃんと書いてくれ、と、いつも思う。

% Rxvt のテスト

わりと良い感じに設定できた気が…

% cat ~/.Xdefaults
Rxvt*geometry: 100x30
Rxvt*font:     Terminal-18
Rxvt*mfont:    Terminal-18
Rxvt*multichar_encoding:   jis
Rxvt*scrollBar:   true
Rxvt*saveLines:   1000

% こんな感じで。なぜか multichar_encoding は sjis じゃなく jis なんだよね。実際は sjis なんだけど。

あとはショートカットのコマンドラインを、

C:\cygwin\bin\rxvt.exe -e zsh -l

% みたいにして起動してます。-e でシェルを指定してやらないと勝手に sh かなんかが動いてしまいます。

% ゴミ集めいろいろ

今日のお題は Perl ... じゃなくて OCaml にした。ソース読まなくてもちょうど良い解説見つけたから。ここ

簡単にまとめると、二世代型の GC で、通常 (minor GC) は若い世代に対して Stop&Copy 方式を使用し、それで足りない場合は古い世代に Mark&Sweep 方式を incremental に(処理を止めずに)使用する(major GC)。Stop&Copy ってのは昨日紹介した論文で言われているところの Copying 法を、処理を完全に止めたうえで行なうってことでしょう。

もう少しゲンミツに言うと……

まず minor GC で若い世代(生まれたばかりで、大抵の場合すぐ消える)のオブジェクトを対象に、そのうちの生きてるものを別のメモリブロックにコピーする(zone change)。と同時に世代分けのためのカウント(生き残ったものにマーク?)と、major GC の一部(おそらく marking phase)を行なう。

もしこのとき、zone change に失敗(空のメモリブロックが無い、あるいは新たに確保できない場合?)したら、一緒に起動した major GC を途中までではなく最後まで終わらせる(sweep phase まで行なう)。

それが完了できなかった場合……これがちょっとわからんな、どういう場合だろ?空きブロックが確保できなかったらってこと?……もう一度 major GC を行なう。たぶん、前回 incremental に行なった途中で削除対象になったものがあるかもしれないから…なので、このときは incremental ではなく処理を止めて行なうんじゃないかと思うが…

さらにそれが失敗した場合は、古い世代のオブジェクトを対象に (若い世代は copying 法で扱われてるので、おそらく必要無い…と言うか意味が無いんだろう) コンパクション(メモリの詰め込み)を行なう。

で、これが失敗すると、いよいよ打つ手が無いので(メモリ不足で)アプリケーション終了。

基本が copying 法だということは、やっぱりあらかじめ大きめのブロックでメモリを確保して、そこから実際の割当てをしてるってこと(…のはず)なので、メモリの断片化抑制に貢献してるよね。うーん、でも実は今まで見てきた言語(Ruby, Python, OCaml)って、どれも C++ じゃなく C で書かれてるんだよな。反面、心配してる soopy や aleph は C++ で書かれてる。ほんとはサンプルとしては C++ で書かれてる言語を見てみなきゃいかんのだろうけど…あるんだろうか……

% こっそり宣伝

三月に一生懸命書いてた本の発売がやっと見えてきましたよ。新刊案内はこちら。まだ正式な発売日は決まってませんが。ちなみに、共著者のうちのどれかがわしです。執筆当時は大層暇だったんで、かなりの分量をわしが書いてます。たぶん三分の一近く。

買ってください……高いけど(爆

本日のツッコミ(全1件) [ツッコミを入れる]

% randy [C++の場合、メモリの断片化が問題になってきたら、new&delete演算子を オーバーロードしてしまう、という手が..]


2004-08-27 売れると良いなあ・・・ [長年日記]

% Re: new&delete演算子をオーバーロード

あ、これはどうも randy さん、いらっしゃいませ。なんだかすいませんね、陰でぐちぐち言ってるだけなのに反応してもらって(苦笑

なるほど、new とか delete までオーバーロードできるもんなんですね。あとから GC を組み込むことになったら大工事になりそうだと思ってましたが、これならそれほど手間なくできそうだ。いや、もちろん GC を実装するのはかなり手間でしょうけど。

ともあれ、C はそこそこですけど、C++ はさっぱりわかってない人間なんで、あんまり気にしないどいてくださいな。これまでうだうだ書いてきてるのも、別に soopy に文句をつけてるわけじゃなくて、ただ単にわしがこの辺のこと調べるのが好きだからなんで(苦笑

% 『おお振り』の二巻

…買ってきた。たぶん今回の一番の見どころはカバー裏。こんなまじめに書いてるカバー裏まんがなんて、見たことねえ(笑

ゲンミツに言うと『カバー裏』ってのは変ですな。でもそう言うよなあ。ほんとにゲンミツに言うと…カバーをはずしたときの表紙…か?

ところで最近わしの prime ちゃんは『げん』まで入力すると『ゲンミツ』が候補に出ますよ。使いすぎ(笑

% 雑文新作

唐突に思い立って、なんと一年十ヶ月ぶりに雑文のページを更新した。

最近は思い付くそばから日記に書き流しちゃうから、なかなかまとまった文章にならなかったんだよね。

とりあえず、前半はコンピュータの勉強をしたこと無い人にとっては、わりと「へぇ〜」って感じで読んでもらえるんじゃないでしょうか。後半は…えーと、後半はなんじゃろ?一応まじめに書いてはいるんだけど、結局は……のためのネタだったり。まあ、暇な人はどーぞ。


2004-08-31 物欲 MAX [長年日記]

% iMac G5

やられた!!わしのストライクゾーンど真中。欲しすぎる。

はあ、Amazon のウィッシュリストに入れといたら、誰か買ってくれんじゃろうか。……夢見てないで、てめえで金貯めろ(苦笑


トップ 最新 追記

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com