K.Sasada's Home Page

こめんとのついか

こめんとこめんと!

message

please add long comment :).

_7(Wed)

yard というデバッガを教えてもらう。なんで有名じゃないんだろう。


BlackDogというものを知る。USBパワーで動作するLinuxマシンらしい。すげぇほしいかも。


やる気がなくなったんで(いつもだな...)、vncserver をいじってみる。inetd で起動するようにしたら、そもそも DISPLAY が何かわからんし。.vnc/xstartup も起動してくれないし(inetd のユーザは自分にしている)。.vnc/xstartup は vncserver が動かしてる気がしなくも無いが...。ということは、Xvnc じゃなくて vncserver を起動するようにすればいいのかなぁ。でも、inetd に bind してほしいのだから、なんか違うような気はする。

XDM なんか通さない(ローカルのVMwareにつなぎに行くので認証なんか要らん)ので -query オプションをつけないんだけど、だからなんかまずいのかなぁ。

手動で kde を立ち上げたらなんか動いた。


で、VNC をフルスクリーンモードにしたら、元に戻れないという驚愕の事実。がーん

Xvnc を殺して解決(?)。


うーむ、-query がない例が見つからない。

なんで shell script を inetd から立ち上げようとすると失敗するんだろう。


また next でエラーか....


でかいプレゼン買ってきた.

あとがきまで読んだ(あとがきだけ読んだ).こういうデザインなのねー.


アスペクト指向入門買ってきた.


ついでに,大人の科学 vol.9 買ってしまった.


shell のリダイレクトで,

の違いを知る.>&- とかも知る.何に使うか知らんが.

入門UNIXシェルプログラミングを読んでるんだな.shell 難しい.Ruby よりよっぽど難しいぜ.


1.times{
  while true
    class C
      begin
        break
      ensure
        break
      end
    end
  end
}

こんなのはなにが返るべきなんかねぇ(実は自明)。


p(while true
  class C
    begin
      break :foo
    ensure
      break :bar
    end
  end
end)

こんなのはどうですかね。ちなみに YARV ではエラーになってしまった。


原因はわかった。根本的に YARV ではこれ対応してないわ。どうしよ。

break があると stack を撒き戻すんだけれど、この例では撒き戻してはいけない。

で、撒き戻しを抑止する方法なんだが、コンパイル中に適切にその命令でのスタックの深さを測らないといけない。さて、これは可能か。いや、可能なんだけど、自動生成系と絡めたとき、可変長(命令オペランドで指定される数)、スタックを pop するような命令だと、きちんとできるようにするためには工夫が必要。しかもオペランド融合、命令融合したときにはもう目が当てられないわけです。さぁどうしてくれる(知るかよ)。


あぁ,一ついいアイデア,というか抜け穴を考えた.実行時に戻すスタックポインタを計算すればいいんだ.

何を当たり前のこと言ってるんだこの野郎,と思われるかもしれないけれど,一応,もうちょっと考えている.この問題は,SP を 0 じゃなく,もうちょっと進んだ状態にする,という話.

recv.method(a, begin
                 raise
               rescue
                 1
               end)

#=> このとき,スタックはこんな感じになる

recv, a # recv.method(a までやった
recv, a, self # recv.method(begin; raise までやった
recv, a, 1 # ) までやった

#=> 今の YARV だとこうなる
recv, a # recv.method(a までやった
recv, a, self # recv.method(begin; raise までやった
1 # ) までやった. つまり,recv, a が pop されてしまう

さて,ここでは例外から帰ってきたとき, recv と a は pop されて欲しくないので SP は 2 の位置からスタート,ということになる.つまり,2 という値が欲しい.

というわけで,begin の前に,sp の値(cont_spとしよう)をどこかに保存してあげればいい.ここで,例外テーブルにじかに書き込んでやればいいわけだ.多分.

一度書き込んでしまえば後はスルーしてもいいので,自分自身を nop に書き換えてしまえばよい.cont_sp を保存する必要がある場面なんて殆ど無い(と信じたい)ので,この命令自体の頻度は低い.

というわけで,コンパイラに手を入れずに簡単に対応できるね,って考えてみたんだけど,やっぱりコンパイル時点で決まったほうが気持ちいいなぁ,と思う今日この頃です.はい.

(この cont_sp 保存命令が必要か必要じゃないか,という判断には,そもそも cont_sp が 0 or over を判断しなくてはいけなくて,結局コンパイル時にスタックの位置を考えてあげなければいけない,という)

さて,簡単に出来ることだろうか.


node を traverse するときに(命令オペランドは決定するので)スタックの位置は決定するような気はする.だから,融合操作(とスタックキャッシング)をしなければスタックの位置はわかりそうである.

さて,融合操作のときにうまくそれが効くか.なんとなくうまく行きそうな気はするなぁ.オペランド融合ではスタックの位置は変わらないし,命令融合だったら,融合する前と後でつじつまが合えばいいのだから.


というわけで,基本命令についてきっちりスタックの位置がわかっているのならば,なんとかなりそうだということがわかった.

あとは,基本命令のスタックの位置の解析を手動でやるか,手でやるか,だなぁ.可変長の命令じゃなければ簡単だから,大部分のふつーの命令は自動で,そうじゃなければ手動でやるか.


Ruby を紹介するためにはどうすればいいのか,入門書を勉強してみるか.というわけで,楽しい Ruby を買うか.RubyWay とかも一応買わないといけないんだろうかなぁ.


勉強のために(何の)でかいプレゼンを読む.読みやすいですね.

よくかけてるけど,よくかけてるから,これしか読まない人が出てこないか不安.これはふつりなも同じ印象なんだよな.うーん.

ちなみに,最初のページの写真は dan さんが撮った写真です.こんなデジカメでも書籍に貼れるんだなぁ(でもやっぱりぼけてるな).


なんで読みやすいんだろう.

あと,短いのでゴールがわかりやすいってのもあるかなぁ.

_speakillof(Fri Dec 09 03:03:06 JST 2005)

 yard は使ったことがあります。実は結構で好きです。yard に興味があるなら http://www.mind.sccs.chukyo-u.ac.jp/~yyuu/rem/ はどうでしょう?

_shiro(Fri Dec 09 07:45:12 JST 2005)

継続はスタック全セーブ/リストアなんでしたっけ。Gaucheはフレームをひとつづつセーブして、継続起動時はヒープのフレームを直接参照するので、関数の頭でのspと途中の時点でのspとの間隔はコンパイル時に決まりません。この例のようなケースでは引数式の評価の前に継続フレームのpushを入れています。

_ささだ(Fri Dec 09 11:24:40 JST 2005)

 yard とか rem とか興味深いですね。もっとメジャーになればいいと思うのですが(誰か記事書かないかな...)。

_ささだ(Fri Dec 09 11:33:31 JST 2005)

 そうか、Schemeでは例外の起動は継続の呼び出しになるんですね。YARVでは簡単のためにスタック全セーブ / リストア にしてしまおうかと思っています(マシンスタック / YARVスタック双方)。Rubyでの例外発生とRubyでの継続実行のコストは違いがあるべきだと思っています(前者が圧倒的に高速でないといけない)。デザイン的には同じことを違う方法を使って行うので気持ち悪いんですが。

_なかだ(Fri Dec 09 12:25:39 JST 2005)
recv.method(a, &begin
                 foo(*ary, &raise)
               rescue
                 nil
               end)

みたいのは?


好きなだけ長いコメントをどうぞ。

お名前


back

tton 記述が使えます。YukiWikiな記述してりゃ問題ありません。

「行頭に#code」 と、「行頭に#end」 で挟むと、その間の行は pre で囲まれます。プログラムのソースを書くときに使ってください。

例:

#code

(なんかプログラム書く)

#end

リンクは

[[なまえ|http://www.example.org]]

とか

[[http://www.example.org]]

で貼れます。

$Date: 2003/04/28 10:27:51 $