K.Sasada's Home Page

Diary - 2005 October

研究日記

神無月

_31(Mon)

tDiary を騙し騙し、なんとか動かすことが出来たが、ほとんど速くならない。というか、遅くなった。まぁ、こんなもんかなぁ。


さすがに rucheme は速くなった。


うう。


StringIO はまだ使えないので、Ruby で gets と read だけある奴を書き直したんだが、それを使ったらえらい YARV が速くなってしまった。うーむ。

C の StringIO vs Ruby で書いたいい加減な StringIO で、だいたい同じ速度になってしまった。しかし、評価値としてこんなの載せられないしな。


諦めて、StringIO からでかいファイルを利用するようにしたら、なんか YARV が 2 倍くらい速い。謎過ぎ。GC か? 最適化を無効にしても同様だなぁ。--enable-pthread が、何か効いてる? うーむ。


ただ単に mswin32 base と cygwin base を混ぜて評価してただけだった。しかし、これは新たな知見だ。


rails の記事は、まとめれば金になりそうだしなぁ。るびまでやることではないのかも(るびまでやらなくてもほうっておいてもいいのかも)、と思わなくも無いのですが・・・。

ただ、やっぱり注目度も高いし、熱いし。書きたい人、歓迎します。


HTree の構築がどうにも遅くて、なぜだろうと思っていたんだけど、//o を、毎回生成していたからだった。まだ、厳密には対応できていないんだよな。


begin
  /#{raise}/o
rescue
  retry
end

今は無限loopなんだな。まぁ、実装を考えたら当たり前か。


eval_once は、関数的な挙動(何度評価しても値は変わらない)ことを明示するような名前がいいなぁ。なんか無いかな。


現在の YARV の //o は、定数キャッシュと同様の仕組みを利用しているため、定数定義が変わると再評価されるんですな。

def re
  /#{RE}/o
end
RE = 'a'
p [re, re.__id__, re.__id__]
RE = 'b'
p [re, re.__id__, re.__id__]

#=>
# Ruby
[/a/, 134693812, 134693812]
[/a/, 134693812, 134693812]

# YARV
[/a/, 134589020, 134589020]
[/b/, 134588756, 134588756]

なんとなく、YARV の挙動のほうが使いやすいかも、とかちょっと思ってみた。


うーむ、明日の資料が全然出来んなあ。

_みずしま(Mon Oct 31 07:21:29 JST 2005)

 ちょっと気になったんですけど、tDiaryの速さって、どういう風に測ってるんですか?

_ささだ(Mon Oct 31 08:21:07 JST 2005)

 index.rb を何度か繰り返し実行(プロセスは同じ)。

_ただただし(Mon Oct 31 10:02:07 JST 2005)

ほとんど速くならない。というか、遅くなった。

えぇ〜(泣)。 時間食ってるのはERBのはずなので、速くなってもいいはずなんだがなぁ。

_ささだ(Mon Oct 31 11:23:47 JST 2005)

 実は ERB は遅いことを発見しました。eval がちょっと遅いらしい。コンパイルが遅いから、という気もします。

_なかだ(Mon Oct 31 14:21:19 JST 2005)

 yarvなら、//oに限定せずeval_once希望。

_ささだ(Mon Oct 31 14:42:57 JST 2005)

 やるのはもちろん難しくないんだけど、文法・名前その他が。ちなみに、現在は inline cahce で //o を実現しているので、何かが定義・再定義されると再度評価される、ということで、厳密には Ruby の意味と違う。どうしたもんかな、これ。

_ささだ(Mon Oct 31 14:43:51 JST 2005)

 そういえば、eval_once 自体から途中で例外なりで大域ジャンプしたときどうなるのかしらん、という気はする。

_かん(Mon Oct 31 14:46:27 JST 2005)

 lilyなら早くなりますよ(とか言ってみる)

_のりつぐ(Mon Oct 31 15:09:33 JST 2005)

 るびまの記事は、まとめれば金になりそうだしなぁ。

_なかだ(Mon Oct 31 15:12:36 JST 2005)

 大域ジャンプしちゃったら完了してないわけで、再度評価せずに何かを返すことってできる? 例外?

_ささだ(Mon Oct 31 15:56:07 JST 2005)

 そうなんですけどね。例えば return なんかはそんなに自明でもないかな、とか。

_なかだ(Mon Oct 31 16:32:07 JST 2005)

 あと考えられるのは、ジャンプさせない(LocalJumpError)くらいかな。

_ささだ(Mon Oct 31 17:14:04 JST 2005)

 あと、排他制御とか。気にしないでいいのかも、だけど。

_なかだ(Mon Oct 31 18:46:22 JST 2005)

 いや、排他制御は必要でしょ。現行のでもすでに問題が出たりしてるし.

_ささだ(Mon Oct 31 19:15:39 JST 2005)

 う、排他制御嫌だなぁ。SEGV はしなさそうなんで、勘弁してもらえないかなぁ。

_yarvいぢめ(Mon Oct 31 22:15:01 JST 2005)

だめーwww ていうかnative thread対応ってことはmutexとかも提供しないとまずいんでない?

_ささだ(Mon Oct 31 22:20:26 JST 2005)

 何か誤解してませんか。//o に対して、複数のスレッドが同時に実行しちゃったらどうする、っていう話だと思っていたんですが。

_30(Sun)

帰宅。500円高くて、ちょっと広かった>バス

なんとくじらさんご夫妻が同じバス。びっくり。


いろいろとお世話になりました。>いろいろとやってくれた方


iTunes を起動しようとして、VTune を起動してしまう。よくあるよね。


rb_funcall2(rb_mKernel, rb_intern("printf"), RARRAY(args)->len, RARRAY(args)->ptr)

とか言うと、ものによっては callcc の餌食に。


YARV で ERB が動いた。感動。

しかし、これで評価を取るといっても、どうしたものか。

_babie(Mon Oct 31 02:06:53 JST 2005)

 わざわざありがとうございました。きちんとお構いできなかったのが残念です。来月はよろしくw

_29(Sat)

なんとなく、instance_eval/module_eval 追加。

Const = :a
class C
  Const = :b
end

C.module_eval %q{
  p Const
}

みたいなのサポート。


しかし、nokada さんのソースを見てると殺意を覚える(いや、殺意はもちろん冗談ですが。思いもよらなかった使い方が多くて、YARV で全然動かないわけです。それも、mkext.rb で使ってる optparse.rb が!)。nokada さん対応のために YARV は進化しました。多分。

たとえば、

case foo
when *bar
end

なんて俺使ったこと無かったし。

_28(Fri)

ary.collect(&File.method(:basename))

なんでこんなコード書くかなぁ。Method クラスのオブジェクトも & でブロックとして渡せるなんて知らなかった。あれ、暗黙に to_proc が呼ばれるのか?


なんとなく、だましだまし mkmf が動いたような気がする。


iPod キター.のだが,使い方がさっぱりわからない.


super が全然駄目駄目だったことに気づいた。どうしよう。

やっぱりフレームに klass の情報要るのかなぁ。


そうでもないような気がする。

しかし、現在の Ruby はどうやってんだろ。


現在の Ruby といえば、[*1] がエラーになるのは、そういうもんなんだろうか。


まず、各メソッドの実体は、定義された時点で属するクラス、モジュールが決まる。

class C
  def m
  end
end

となったとき、m は C のメソッドであることが決まる。

C#m で super を呼び出したとき、self.class.ancestors(相当)から C を検索する。で、super はその前から検索すればよい。

今まで、上記と似たようなことをしていたんだけれど、単に C の上位クラス、としかやっていなかった。これだと module で定義したメソッドでは通用しない。これにやっと気づいた orz

しかし、self.class の ancestors を律儀に検索すれば、super のために検索を開始するための klass は、まぁなんとか発見することは可能。

klass のリストを親に向かって毎回検索することになるが、まぁ、super がボトルネックになるようなプログラムを書かない限り、大丈夫だろう。

もっといい手は無いかなー。


ところで、k-of の会場はネットが使えるんだろうか。ちょっと気になる。


class A
end

def m
  A.instance_eval %q{
    class C
      super
    end
  }
end

m

#=>
t.rb:5:in `instance_eval': (eval):3:in `instance_eval':
 method `instance_eval' called on terminated object (0x10108130) (NotImplementedError)
	from t.rb:5:in `m'
	from t.rb:12

変なの。


やっぱり、もうちょっといけるか。ancestors を検索しなくちゃいけないのは module のときだけで、class C のメソッドのときは、C の super からはじめればよい。

・・・ほんとか? ちょっと自信ない。

特異メソッドのときは、obj.class を取っておけばよい。


ちなみに、これって define_method のときは問題だったり。


具体的な話をすると、

  • メソッドの実体は yarv_iseq_t (iseq: instruction sequence)
  • yarv_iseq_t に klass フィールドを付ける
  • メソッド定義時、cref の頭を klass に格納
    • 特異メソッドの場合、obj.class を klass に格納
  • super 実行時、
    • klass == T_CLASS なら、RCLASS(klass)->super から検索
    • klass == T_MODULE なら、self.klass.ancestors から klass を探して、その次を呼び出し

ブロックから呼び出す場合、もうちょっと工夫を要する。super 出来ないところで super やっちゃうと何が起こるか。


super 問題のもう一個は super で利用するシグネチャ。これ、今の構造で出来るのかな、よくわかっていない。というか、今の Ruby の仕様をあまり理解できていない。

_takahashim(Fri Oct 28 09:59:07 JST 2005)

 おおおおお。すばらしいです>mkmf

_babie(Fri Oct 28 23:24:36 JST 2005)

 有線LAN ならいけます。ケーブルを忘れずに。>k-of

_27(Thu)

winamp で podcast というもので聞けるそうなんだけれど、一曲ずつ選ばないといけないのが鬱陶しいな。どこかに .pls に変換するサービスは無いものか。


rubyconf 2005 の音データが取れないな。サーバが落ちてる? 残念。誰か持ってそうだけど。


バイクが帰ってきたんで、ちょっとだけ遠出。

まずは東府中。そのあと府中でラーメン屋。そのあと、喫茶店を探して放浪するも、ぴんとくるものがなく、久々に国立に行ってみる。17号線がつながっていたのを知ってびっくりする。綺麗な道になったなぁ。あのえらい細い道が。で、ついでなので青木さんに色々頼む。


Enumerable#collect (または map)を実装するとして、

module Enumerable
  def map
    self.inject([]){|r, x|
      r << yield(x)
    }
  end
end

を書くとして、ブロックパラメータの x に何を使うか、という話。

i
item の i
e
element の e
elem
element の elem

ささだの主張としては、i はループの induction variable の i、もしくは integer の i に見えるので嫌だなぁ、と。

青木さんの主張は element は「何かのに属している」感が強いので嫌、ということらしい。

あなたはどうですか?


プレゼント、結局全部郵送らしい。


HDD が駄目かなって思っていた家族用のマシン、HDDを交換して win2k をインストール・・・したらインストール中にフリーズ。一体何が・・・。

_まつもと(Thu Oct 27 16:52:33 JST 2005)

 私、持ってますよ。DVD-Rが読めるなら土曜日にでも。

_ささだ(Thu Oct 27 20:30:12 JST 2005)

 私のラップトップにはDVDDが付いてないのです。残念。誰かネットワーク越しにくれるんじゃないかと期待。

_みずしま(Thu Oct 27 21:59:13 JST 2005)

 elemもしくはeに一票。iは同じくループ変数っぽくて、微妙ですね。

_斎藤ただし(Thu Oct 27 23:04:07 JST 2005)

 s/class/module/

_なかだ(Thu Oct 27 23:44:31 JST 2005)

 it とか?

_ささだ(Thu Oct 27 23:47:45 JST 2005)

 おおう>module

_向井(Thu Oct 27 23:57:37 JST 2005)

 個人的にはeですね。iはeach_with_indexとかのインデックスに使いたい感じで

_ささだ(Fri Oct 28 00:06:15 JST 2005)

 it だと iterator っぽくて嫌。それとも、それがいい?

_IKeJI(Fri Oct 28 01:33:16 JST 2005)

 eに一票

_さかい(Fri Oct 28 01:46:34 JST 2005)

 ほい。http://www.tom.sfc.keio.ac.jp/~sakai/rubyconf05/

_ym(Fri Oct 28 02:42:33 JST 2005)

 eが好きです。でもelemまで書くならitemのがいいと思います

_zunda(Fri Oct 28 04:04:50 JST 2005)

 xじゃだめかなー…。家庭用のマシンさんはメモリを疑ってみたらどうでしょ?

_ささだ(Fri Oct 28 07:18:35 JST 2005)

 修復インストールでなんとかインストールできました。

_26(Wed)

あ、今年の SHINING は早稲田でやるのか。これなら行ける。


あるメールに「ウリは」とか「ウリが」とかが沢山書いてあって、2chの板かと思ってしまった。


腐りすぎ。いつもどおり、自己嫌悪。

_ (Wed Oct 26 11:51:14 JST 2005)

 瓜?

_25(Tue)

「生協の白石さん」というのがなんか凄い騒ぎですね。


XML なんとか、いつの間にか締め切り。残念。まぁ、行けなくてよかったのかも。


日本ソフトウェア科学会チュートリアル「安全な情報基盤の実現に向けて」 は面白そうだなあ。2005年12月13日(火) 13:00-17:30。なんとかなるかも。


申し込んだら 7 番目だった.まだ楽勝.


脳内にアセンブラなんてあったって無駄ではなかろうか(などと思っているから本物のプログラマーにはなれないのか)。ちなみに、私はそういう方面はめっぽう弱い。

だから、はっかーずでぃらいととかは、さっぱり。藤波さんとか凄すぎる。


昔ね、プロセッサアーキテクチャの授業の試験で「この命令のバイト列を答えよ」ってまさに人間アセンブラになれ、という問題が出たの。この問題の趣旨は「ノートを取っていればわかる問題」(ノートは持ち込み可能だった。つまり、提出側の意図としてはサービス問題)。で、私はノートなんて取っていなかったので(取れよ!)、この問題はプロセッサアーキテクチャの理解を確かめるという趣旨とはまったく関係ないため、撤回してください、と主張。せめて、MIPS の命令仕様書くらい添付されてれば、変換は出来たけど、そんなのおぼえてねー。

まぁ、A だったけどね(一番いいって意味)。でも、OS の授業は C(最悪)。OSの授業は、(その先生が書いた)本を持ち込みで、テストを受けて、それを手書きで写せばいいって話。まぁ、買わなかったからなんだけどね。

とまぁ、忠誠心を問うような問題にはからっきし苦手だったという話。いや、それ以外が得意だったというわけではもちろんありませんが。


うーん、コード添削大好評だな。


そういえば、YARV インストール方法を教えてくれ、という話をよく聞かれたりしたんだけど、そもそもビルド出来ませんから。・・・まずそこだよなぁ。


継続って作るのは遅いけど、call するのはそんなに遅くないような気がしてきたな。現在のインタプリタのスレッド切り替えと同程度のコスト。やー、でもスタック全部コピーするのはなんとなく嫌な感じだ。


学校に行こうとバイクに乗ろうとしたらエンジンがかからない orz こりゃ素人には無理かなあ。


OOPSLA ポスター

証拠写真.


@nifty:デイリーポータルZ:スタバで出来るだけややこしい注文をためす

ベンティアドショットヘーゼルナッツバニラアーモンドキャラメルエキストラホイップキャラメルソースモカソースランバチップチョコレートクリームフラペチーノ

爆笑してしまった.


アセンブラが脳内で出来るのと,下位レイヤーの話が好きなのは関係ないと思うですよ.私はそういう話が大好きだけど,アセンブラが生成するビット列なんて想像もしたくないし.

このビット列がCPUのデコーダの中でこの回路でひっかかるから配線がこんな感じで楽になるよなぁ,やっぱ凄いなぁ,などということを想像しようとすると背筋が寒くなります.

ちなみに,私の専門はプロセッサアーキテクチャの研究じゃなくて,細粒度並列性を有するプロセッサ上を効率よく動作させるためのシステムソフトウェアの研究,です.たしか.

でも,先日の論文はプロセッサアーキテクチャへの提案だったな....だからわからずに苦労したんだ.


送り先は dRuby 本の一人以外そろった.本もそれなりにそろった.後は送るだけだが....

そういえば,サイン希望って貰った人のサインを貰うのを忘れていた.どうしようかな.サインしてもらった紙でも一緒に送ろうか・・・.

本を持っていくのは大変だから,背表紙を持っていってサインしてもらおうかなぁ.背表紙の裏とか.マニアックだな.関西まで持っていってまつもとさんのサインも・・・.


プロシン行きたいけど,今年は発表しないからなぁ,どうしよ.

_arton(Tue Oct 25 03:02:00 JST 2005)

 なんとなくいい話だな。>忠誠心を問うような問題にはからっきし苦手

_ささだ(Tue Oct 25 17:11:09 JST 2005)

 そうじゃない問題は全部解ける,とかだといい話になるんですけどねぇ.

_び(Tue Oct 25 22:33:15 JST 2005)

 プロシン行こうよー、ポスターでもいいし、発表なしでもいいから。久々に箱根だよ。ちなみに、あの授業のくだり、漏れの講義ぢゃないよな、これ。漏れこんな酷いことやらんし。←しまつた。漏れも酷いかもしらんが、ちょっとこれは同意できんやり方の某某だなー。

_こーのいけ(Wed Oct 26 00:51:52 JST 2005)

 TUATの中の人の方が遅れている白石さん話題・・・まあ,中の人にはそれほど縁がないしねぇ・・・ あ,ネコソギ(下)がそろそろですが進行はいかがで?(講談社つながり) 授業の話は今はAが一番じゃないよね,とだけつっこんでおきます。

_ささだ(Wed Oct 26 05:15:58 JST 2005)

 ネコソギ(下)出るんですかー。楽しみですね。今はリスカを読んでます。

_24(Mon)

大阪に行くための準備しないとなぁ。行きは新幹線じゃないと辛そうなんだけど、帰りはバスで節約。交通費は2万以下に抑えられるかな。


新幹線 12000円、バス5000円くらい。


あー、怠惰だ、怠惰だ。

_なかお(Mon Oct 24 15:02:42 JST 2005)

 東京-大阪JR 東海ツアーズ http://www.jrtours.co.jp/ のツアーはいかがでしょうか?

_ささだ(Mon Oct 24 22:38:08 JST 2005)

 ぷらっとこだま しか知らないんですが、これだと大阪に着くのが12:00になっちゃうんですよねえ。

_23(Sun)

10 分程度で簡単な YARV の命令を作るデモでも作るといいんだろうか(意味無いって)。


こっそりと るびま10号人気投票 をやっています。


あ、今日 SICP 読書会か。忘れていた。今日は(今日も)お休み。


IPSJ Magazine Vol.46 No.10 p1101

スレッド並列処理: SMT

スレッド並列処理と SMT は同じ関係じゃないと思う。中の用語も微妙。

アーキテクチャという用語もなぁ。

OOO 実行やレジスタリネーミングは 1960 年代のスパコンの技術だった、というのは知らなかったなあ。RISC とか、そういうのが流行った 1980 年代の技術かと思っていた。

可変レイテンシ化、という言葉を始めて知った。あと、遅延の話は大変参考になった。

「データキャッシュのパイプライン化」において、「性能上のバイナリ互換性の問題」と言っている問題が理解できない。in-order において、コストの計算を変えたときにコンパイラの命令スケジューリングの結果がそんなに変わったりするのかな?

五島さんの最後の「質問」は、彼自身はどういう答えを用意しているんだろうか。俺はなんていえるんだろうか。

あー、今回の特集は大変面白い。というか、勉強不足...。

_たかはし(Sun Oct 23 13:15:06 JST 2005)

 作るしか>10分デモ

_たかはし(Sun Oct 23 13:16:25 JST 2005)

 真面目なところでは、インストールデモがあるとよいかもです。

_maeda(Sun Oct 23 18:07:25 JST 2005)

 コストの問題ではなくて、今まで「間にx個の命令をはさんでおけば、待たずに実行できる」と仮定していたコードに、待ちが発生するようになるということでは。

_ささだ(Sun Oct 23 20:04:33 JST 2005)

 in-order 実行において、命令の並び順で性能が変わるかなぁというのが。プリフェッチ命令なんかがあれば変わるだろうけれど。

_ささだ(Sun Oct 23 20:06:59 JST 2005)

 しまった。in-order は VLIW を前提にしていたんですね。しまった。

_22(Sat)

帰国して帰宅。RHG読書会の宴会へ寄り道。本が重かった。


いやー、自分には海外へ行くのは重大すぎる。年に一回くらいがちょうどいいな。

_babie(Sun Oct 23 08:10:05 JST 2005)

 おかえりなさい。KOFで色々聞かせてくださいね。

_21(Fri)

昨日は動物園に行った。動物園に集まる大量のGeekというのも凄い。


やっぱり日本語しかしゃべってないなあ。海外に行く意味がない。ほんと、なんとかしねーと。

_さ(Sat Oct 22 16:56:33 JST 2005)

 携帯が届く所に戻り

_20(Thu)

きーのーとを聞いてもよくわからない orz


research paper は聞きやすいなあ。スライドあるし。

_19(Wed)

OOPSLA ポスター発表終わり。全日だと思ったら、あとは貼っておくだけだったらしい。

welcome party と一緒にやると、俺が飯を食えなくて大変困った。

Ruby とでかく書いたので、Ruby が気になってる人が沢山来た。そして、俺そっちのけで説明してくれる罠。いやー、ありがたいんだが情けない。

大島さん、千葉さんなどが来てくれた。日本人は、結構居るような、いないような。


Dynamic Language Symposium、英語がわからない orz なんかとても豪勢なメンバーが居るそうなんだがわからない。しくしく。


壇上にサスマンが居るよ!

おー、OHP で発表するのか。


皆さん無事に帰れたようで何よりです>RC 日本人参加者

そういえば、LAX で荷物の扱いをどうするのか知りたいんですが、どうだったのか教えてもらえませんか。


サスマンの話はさっぱりさっぱりわからなかった orz 数学とか混ざってるし。scheme のソースは読めたんだが。


そのあと .NET で Dynamic な言語、という話を聞いた、ら、でかい部屋に10人弱。なんか円になって座ってディスカッションとかになって、わかるわけねーだろ! そんなの。

で、なんとネタは Ruby(だったらしい)。Ruby を実装した人がたくさんいた(らしい)(別にまつもとさんが沢山居たわけではない)。Microsoft で Ruby 作ってるとは。あれ、違うのかな。で、色々と話をしてたんだけど、Ruby の話なのに、何も突っ込めなかった。わかんねーよう。すげーすげーすげー情けないやら悲しいやら。今回の旅行で一番英語が使えなくて悲しかった。で、Smalltalk はどうだとか話してた。偉い人が居たらしい、、、が、さっぱりわからん。


Ruby の BoF には、40人くらい入る部屋に数人しか居なくてさびしい感じがする。

やっぱり英語が出来ないのはつらい。

_まつもと(Wed Oct 19 10:22:10 JST 2005)

 荷物ですが、SANの空港で預ければ日本まで持って行ってもらえます。

_ささだ(Thu Oct 20 01:40:51 JST 2005)

 ありがとうございます。そうか、入国時と違って一度受け取る必要は無いのか。

_18(Tue)

OOPSLA の会場には wireless がきていた。


既成事実化とかいう単語を最近見る気がするんだが、私にはとても嫌な感じがする。無責任な押し付けではないか。

_babie(Tue Oct 18 09:22:59 JST 2005)

 「押し付け」にしてしまうと誰も期待表明ができなくなっちゃうよ。

_ (Tue Oct 18 12:54:36 JST 2005)

 いや、出れば買うし、無責任といわれればそれまでだが、まぁ、一種の投票行為ですな、このこの

_ (Tue Oct 18 12:55:56 JST 2005)

 うわ、リターン押しちゃったよ、うぇ〜ん、この人に書いてほしいという投票行為。

_きむら(Tue Oct 18 16:40:51 JST 2005)

 期待表明を表すにしては押し付け気味に見える表現ではないかということでは?

_ (Tue Oct 18 18:14:13 JST 2005)

 いや、そこは愛する気持ちゆえの強引な行動とストーカー行為が紙一重のようにですな、線引きというものは難しいものなのですよ、うん。

_17(Mon)

continuation の WS が面白かった。いいな、日本でもやってみたい。


まつもとさんのスーツ姿をはじめて見た。実はまつもとさんは(略)スーツ族だったらしい。


2006 6/3 (土)と、もしかしたら 2006 6/4(日)に RubyConfJapan をします。


多分。なので、空けといてください。


http://jutopia.tirsen.com/articles/2005/10/15/rubyconf-day-1

Koichi also has some language difficulties but despite this does an incredibly funny presentation.

funny orz


2ch で、

こうなってくると Ruby も matz 本来の趣味にひた走りして行きそうだな。

今がまつもとさんの趣味じゃないとでも言うんだろうか。


一時間しゃべるってのは、日本ではありえないんだよな。楽しすぎ。


ちょっとしゃべった Ruby's dark side with continuation の話。

class Integer
  def ruby_times
    i=0
    while i < self
      yield(i)
      i+=1
    end
    i
  end
end

cont = nil

puts "using Ruby times"

5.ruby_times{|i|
  p i
  if i == 0
    if :second == callcc{|cont|}
      cont = nil
    end
  end
}

if cont
  puts "call continuation"
  cont.call(:second)
end

puts "------------------------------"

puts "using C times"

5.times{|i|
  p i
  if i == 0
    if :second == callcc{|cont|}
      cont = nil
    end
  end
}

if cont
  puts "call continuation"
  cont.call(:second)
end

実行結果が違うわけです。

ちなみに、current_cc とか引数名の cc とか、あの辺の名前が変だよ(current current_continuation とか)、とか指摘したんだけど、そうだよね、といわれてさらっと流されてしまった。


これから OOPSLA の会場へ。ネットにつながるかは大変疑わしいので、22日までさようなら。

_スーツ族(Mon Oct 17 20:25:15 JST 2005)

 funnyってのは冗談が面白かったって意味だと思うんで、成功ではないかと。周りの人に聞いても好評でしたよ。

_ささだ(Mon Oct 17 22:36:26 JST 2005)

 恐縮です。ただ、面白おかしいだけのプレゼンというのは... まぁ、面白くも無いプレゼンよりはましですが。英語がしゃべれないから、どうしてもネタに走ってしまうんですよね。

_16(Sun)

memo-ML が荒れてるけど、原因の話もそうだけど、いい加減「やめろやめろ」といってる人たちも同じくらい鬱陶しい。やめろ、というにも言い方があるだろうに。


組み込み機器向け Ruby は、やっぱり需要はあるんだなぁ。ぜひやってみたい。


冗談で「お金もらってるから逃げられないね」と書いたら、あとから「金が無くなったらやめるのかよ」といわれた。


今、深夜の2時。色々話を聞いた。もちろん日本語で。

... きてる意味無いなあ。真剣に英語スキルがほしい。と、毎回思うわけで。どうしたもんだか。


[tDiary-users-talk: 0266]

ソースコード上のCopyright(各ファイルの冒頭部分にあります)を削除するのは許可されませんが、それ以外の部分の改変は、GPLのもとで許されています。

例えば Copyright を削って運用とかは問題ないですよねぇ。再配布しなければ。いや、GPL を真剣に見たことが実は無いので、再配布しない限り何も気にしないでいいんだ、と勝手に思っていたんだけれど。違ったらどうしよう。

_ただただし(Mon Oct 17 00:41:56 JST 2005)

 あー、そうか。再配布するなら、って言わないといけないですね。つーか、なんでtDiary-users-talkなんて購読してるの!?

_かん(Mon Oct 17 09:51:20 JST 2005)

 さりげなくささださんもイナモデの住人だからだと予想>tDiary-users-talk

_ささだ(Mon Oct 17 13:12:44 JST 2005)

 外れ。

_15(Sat)

いやー、終わった終わった。練習不足でごめんよう。


一時間半、英語での質問攻めにさくさくと答えていたまつもとさんはスゲー。

そして、それを全部メモして訳してる卜部君はもっとスゲー。


Sydney の人に色々話を聞くことが出来た。

私と違って、興味は性能ではなく、動くこと、らしい。これはこれで正しいよなぁ。グローバル変数が全部 TLS へのアクセス、しかも pthread のアレなので、かなりやばいような気はしてるんだが。どうなのかな。

出来るだけ早く評価取るよ、と言ってくれた。


そういえば、発表のあとに Wing という人に、「結局 YARV じゃ Ruby は速くならないよね」とばっさりと言われてしまった。いやー。うん。まぁ、正直、1.5 〜 2 倍くらい高速化すれば御の字だと思うんだけど。VM化は高速化よりも、コード整備とか、後の最適化のための布石とか、Generational GC をもっとやりやすくするためとか、そういうものではないかと思っています。

あと、「オブジェクトのアロケーションは変えてないのは、VMのコア機能なんだから変だろ」とも指摘された。でもさー、今以上に高速化は出来ないと思うんだよなあ。何か工夫はあるのかなぁ。もちろん、GC のほうで頑張れるとは思うけど。毎回 malloc しない工夫ってなんかあるだろうか。


発表資料:http://www.atdot.net/yarv/RubyConf2005_ko1_YARV.pdf

田中さんのと違って、新しいものはほとんど無いけれど。


しかし、ruby の人たちは優しいよね。みんないい発表だって言ってくれるよ。ジョークが面白かったって。って、オイ。


DHH とかふぁうらーたんとかがすぐ近くに居るんだが、あんまり感動しない。初めてまつもとさんのお顔を拝見して、あろうことか、こっそりまつもとさんの隣に座っていた(きっと彼自身は覚えていないだろうけど)ときは、むちゃくちゃ緊張してたんだけど。

まぁ、縁が無いんだろうな。

関係ないけど、chad は痩せたと思った。


今回も、結局 55 分くらい。これだけ英語が駄目だと見せ付けると、質問は無い。憂うべきなんだろうな。当然ながら。

_shiro(Sun Oct 16 02:11:43 JST 2005)

Cheney on the MTAとか? < 毎回mallocしない。copying GCじゃないときついか。

_babie(Sun Oct 16 13:54:00 JST 2005)

 そっか痩せたか…過酷なんだろうか。

_14(Fri)

無事到着して夕飯食べて眠すぎな状態。


やはり英語、英語が駄目駄目でへこむ。それよりもコミュニケーションに対する姿勢、という気もするけれど。


ふぁうらーさんが居たけど、よく知らないのでよくわからない。

_13(Thu)

ぐわー、っと寝てしまった。


12人にあて先をくれ、と言って、今 8 人。週末には集まるかな。


さて、行ってきます。

_12(Wed)

まつもとさんとの写真を貼ってみた > http://www.rubygarden.org/ruby?RubyConf2005Facebook

最初は redhanded のアノ写真を貼ってみたんだが,でかいわ恥ずかしいわでやめた.


なんか 2ch で $~ とかの話が出てるけど,$1 とかは $~[1] みたいなのにコンパイルされるんだよね.でも,見え方と実装は,あまり関係ない.


そして,未だにスライドを作ってる人.なんというか,もうね.遅すぎるっちゅうねん orz

で,ネタばかり考えてる人.しかし,今回のネタはどうなんだろうな.これ,200人弱の前で外したらスゲー寒い....


60 ページ.いや,喋んないけどね.全部は.

そして,最初の 10 ページくらいは全部ネタなわけです.あー,ガクガクブルブル.アメリカンジョークなんてわからんよう.


今日の新発見.「$1 札は小銭」

なんとなく,小銭=硬貨だと思っていた.あなたはどうですか?


ドラゴンブックの下巻が 950円! わーい.


学生5人に聞いたら「$1札は小銭といわない」と答えた.先生は小銭と答えた.

金へんが付いてるから,硬貨を想像するんじゃないか,という意見が.


とんでもない失敗をしてしまった.もうダメポ.


2時間も発表練習付き合ってくれてありがとう!


Ruby の代表的なアプリケーション3つと言われたら何を答えますか?

_babie(Wed Oct 12 11:56:01 JST 2005)

 あってますよ。小銭=硬貨。$1=small change

_なかむら(う)(Wed Oct 12 12:28:23 JST 2005)

 どこの辞書にも小銭=硬貨だなって書いてないよう。

_babie(Wed Oct 12 16:19:18 JST 2005)

 うーん書いてないね。銭=卑金属貨幣っていうのと、日本での現在の硬貨=小銭と言っても差し支えないからって事で。米は「銭」がないのでコゼニ=小額のお金=small moneyということで。

_11(Tue)

ポスター印刷代が無い。銀行行かないと。


ポスターの謝辞がどんどん膨らむ。みんなありがとー。


さて、るびまのプレゼント、本を送らなきゃいけないんだが、どうやって送ればいいんだろうか?

げー、郵便局で一個500円もするのかよ。7冊で3500円か orz もうちょっと安いところは無かろうか。もっと頑張れ郵便局。


お、クロネコメール便なら 1kg まで 310 円じゃないか。これで行こう。

う、厚さが 2cm という制限が...。レシピブックって 3cm くらいあったよねぇ。


あー,しまった,論文のことすっかり忘れてた orz


論文提出の準備してポスター印刷の準備してスライドの準備して喋る内容の準備して.


あー,しまった,YARV 0.3.2 をリリースしなくちゃいけなかったんだ.昨日すればよかった.


リリースしようと思ったら,なんか沢山ブロックする.はてな?

最適化を全部抑えたら通った.なんか嫌な感じ.


こっそりと YARV 0.3.2 をリリース.パッチ類を消すつもりだったのに,忘れてたな.0.4.0 で消そう.

そしてすぐにポスター印刷.


今日の新事実.A0 ポスターはでかい!


ちょっとツッコミ不足か。

今度から一緒にインタビュー行く?


  • 0010 号 巻頭言
    • TODO という単語が入ってると編集がやりづらくなるんだよなぁ.
  • Ruby の歩き方
    • ASR がバージョンアップ.
  • Rubyist Hotlinks 【第 10 回】 わたなべひろふみさん
    • あんまり聞けなかったなあ.
  • 解説 Ruby Refactoring Browser - Emacs でリファクタリング
    • emacs 使ってないからなあ.
  • あなたの Ruby コードを添削します 【第 1 回】 pukipa.rb
    • こういうのって実は新しい?
  • プログラマーのための YAML 入門 (中級編)
    • 日本語ではあんまり資料が無いのよね.
  • シリーズ パッケージマネジメント 【第 2 回】 RubyGems (2)
    • 同上.
  • Rubyist のための他言語探訪 【第 3 回】 Io
    • 調べようと思って全然調べてないな.Self 系?
  • 標準添付ライブラリ紹介 【第 4 回】 1.8.3 更新情報
    • これも,なかなか情報が無いのよね.
  • YARV Maniacs 【第 5 回】 命令セット (2) リテラル・変数・定数
    • はて,いったいどれくらいの人が見てるんだか.
  • 【一周年記念企画】 プレゼント:当選発表
    • 送料受取人負担にすればよかった.
  • 0010 号 編集後記
    • 別に学園祭萌え,とかそういうわけではなく.

だめだ,俺が紹介を書いても面白くない.


あれ,pthread のシグナルの仕様ってそうだったっけ orz


同期シグナルってなんだろ.〜〜など,って書いてあるのはあるが,一覧が無い.


私のメールアドレスにきたメールは,いくつかの Maildir に投げられ,勝手にバックアップを取る.なので,今回のように,「頂いた個人情報は消します」という場合,結構面倒くさいことがわかった.

バックアップを取らないメールアドレスを用意して対処しようとしているが,もっと賢い方法はあっただろうか.


同期シグナルって,シグナルの番号によって,って話ではなくて,シグナルハンドラの呼ばれ方の話なのか.


あかん,本家の eval.c がどんどん変更されちゃってる.


Sydney はちゃんと共有オブジェクトの排他制御をやっているらしい.あれー,そうだったか.


今更,ポスターのサイズの制限が変更される.おせーよ! 刷っちゃったよ! でも,ちょうど A0 x 2 は入りそうだ.まぁ,そう考えてたんだろうけど.3枚刷ってたらどうするんだろ.あ,そのためのポスター下書き提出か?

_N.H.(Tue Oct 11 05:19:27 JST 2005)

 もしかすると冊子小包郵便物が使えるのではないでしょうか?

_babie (Tue Oct 11 09:16:49 JST 2005)

 佐川だともっと安いみたいですよ(10円)

_ささだ(Tue Oct 11 13:11:35 JST 2005)

 佐川のどのサービスだろ。

_ (Tue Oct 11 14:26:31 JST 2005)

 ぶっちゃっけ、誰が費用負担するの?

_ささだ(Tue Oct 11 15:04:48 JST 2005)

 送料は私ですが.

_babie(Tue Oct 11 21:47:26 JST 2005)

 飛脚メール便だけど…あかんかった。法人のみだ。

_10(Mon)

http://www.atdot.net/~ko1/tmp/OOPSLA05_poster.pdf OOPLSA に出すポスター。何かあればご指摘ください。

しかし、A0 2枚ってでかいな。はじめてのポスターが OOPSLA ってのが...。はじめての発表が OOPSLA、よりはましか。


今回のポスターは全部 OOo で作ってるんだけど、2.0 rc、いいね、とてもよい。


えーと、こっそりとるびま10号 をリリースしました。お楽しみください。

できれば、宣伝のほう、していただけると幸いです。


えーと、青木さんが、

あなたの Ruby コードを添削します 【第 1 回】 pukipa.rbで、

本来ならばそれで終わりのはずだったのですが、その後行われた宴会の際に交わされたらしい、こんな感じだったような気がする会話が命取りになってしまいました。

と書いてますが、この連載自体の依頼はもっと前にしています。それを酒で忘れてるの。

もう一つちなむと、実は青木さんには記事について 2 回依頼していて(8月の RHG、9月の某飲み会)、その両方とも酒が入った後だったりする。RHG のときは、記事の話はもしかしたらしなかったかもしれないけど、俺の頭には当然あった。

しかし、いい記事だよね、次回にも期待。皆さん、どんどんソースを投げて青木さんを困らせましょう。


しかし、今回もつらかった。精神的に。

_babie(Mon Oct 10 13:25:35 JST 2005)

 じゃ瑣末なことを>oopsla pdf。  * "as known as" は dot 入れるなら "a.k.a."(末尾も入れる)  * "evil eval" がイイ。(既に慣用句?)  * "Closure and invoking a method with a block" の多言語例が scheme だww。適切?  * 1P の左下空白は余ったの?(RubyConf のお知らせ)

_ささだ(Mon Oct 10 16:07:27 JST 2005)

 どうもありがとうございます。scheme は、まぁ趣味。RubyConf のお知らせ、というか、RubyConf の終わったあと、なんですよね。余白に、会場の人になんか感想書いてもらおうかと。

_shiro(Mon Oct 10 16:40:07 JST 2005)
  • p1右上 (…はささださんの文章じゃないのかもしれないけれど)
    • 最初の文、私なら "an interpreted scripting language" にするなあ。
    • "It has lots of features for text processing and system management tasks" にするかなあ。(肯定文ではlots ofの方を良く使う)
  • p1右中
    • "Closure and invoking a method with a block" ぱっと見で何を言いたいのかよくわからない。andのつないでいるものが対等でないから?
  • p2左上
    • 第2文、current interpreterが重なってるのと、because ofの後に名詞句じゃなくて文が来てるのが気になる。"the current interpreter is slow because it works with ..." で良いと思う。
    • 第3文、私なら "{Several|A few} virtual machines have been developed to address this problem, but none has achieved adequate ..." とかにするかなあ。
    • 第4,5文ちょっと弱い感じ。"YARV (Yet Another Ruby VM) is a new implementation of VM-based Ruby interpreter that specifically aims at high-speed execution, overcoming weakness of existing implementations." とか、もっと押し出していいと思う。
    • 「今までのVMダメだった」と言っちゃうと「じゃあYARVはどう違うの?」という疑問が当然出てくる。それを書かずにいて現場で処理するのも一つの戦略だけど。
  • p2左中
    • Rubyプログラム実行の流れとVM生成は完全に分けた方が良くないかな、と思ったけど、スペースに限りがあるので難しいかも。
  • p2左下
    • "These bars show the results of the following optimizations applied incrementally." かな?
    • 最後、"the current Ruby interpreter"
  • p2右下
    • 第3文が不自然なんで、むしろ第2文とくっつけて、"Current YARV (version 0.3.2) supports almost all Ruby syntax, native threads, and Ruby C API" とか。あるいは文にせずに"Current status:" として箇条書きにするか。
    • 第4文、単に"Issues:" もしくは "Challenges:" でいいんじゃ。
    • 見出しならAcknowledgementsって複数形にすることが多いと思う。
_ささだ(Mon Oct 10 17:51:52 JST 2005)

 またまた、ご丁寧にどうもありがとうございました。反映します。

_9(Sun)

フルバは読めたんだけど、ネギまは読めない。

_8(Sat)

女子大 勉強会行きたいなあ。


同じ内容の記事のタイトルを複数の新聞などから集めて、自動的に合成するようなソフトウェアは作れないものだろうか。で、そのときにはその元ネタ各社から訴えられたりして。


相変わらず凹み気味。風邪も治んないし。


cygwin Ruby と mswin32 YARV の結果をつき合わせてみたら、ほぼエラーばかり。何でだろうと思ってみてみたら、改行コードが全部違った。


何かを思い通りにしたかったら、他人を頼るなよ。自分で動かねーと、何も変わらねーんだぞ?

そうだよなあ。

_babie(Sun Oct 09 20:01:26 JST 2005)

 会長席がアタリでした。

_7(Fri)

のどが痛い。直らん。


CPUのハードウェア仮想化技術でOSが変わる

CPUの仮想化技術は、ソフトウェア側のランタイム技術とも結びつく。Javaや.NETのランタイム(CLR)は、現在OSの上の仮想マシンとして動作し、その上で中間コードのプログラムを実行する。ランタイムの中には、仮想化支援ハードウェアを使えば効率が上がる処理があり、よりパフォーマンスを向上させることが可能になる。

さて,これは何をどう使って効率を上げるのか.うーむ.


今更ながら,仮想化技術の最近について調査.とりあえず後藤さんの記事を見て,色々感心する(記事に関心させられててはいけないような気もするが...).


intel の VT の仕様書を落としてみたら 144ページ.でかすぎ.でも面白そうだなあ.


ググったら http://www.jp.netbsd.org/ja/JP/JNUG/event/20050827BOF/lilyvm/20050827a.ppt を発見.参考になった.


VM 中で危険かもしれないプロセスを走らせてサンドボックスに使う,ってのはよく聞くけれど,例えば起動するプロセスすべてが別々の VM の中にあったら,どんな世界になるだろう.capability をちまちま設定するんじゃなくて,起動する VM に何を共有するかで設定してみたり.

仮想アドレス空間のデザインも変わったりして.


言語処理系のVMと実際のマシンのVM,接点を考えてるんだけれど,なかなか.例えば,安直に実際のマシンのVMに言語処理系のVMを入れるとどうなるか?


Binding について,色々考えてるんだど,今の Ruby の Binding がよくわからない.

自分が実装した Binding は,かなり現在のものを無視して作っていることがわかってきた.

Binding オブジェクトは上書きされないものだと思ってるのが敗因か.

_sheepman(Fri Oct 07 17:57:05 JST 2005)

 >プロセスすべてが VM の中にあったら

CooS は?

_ささだ(Fri Oct 07 18:21:07 JST 2005)

 「プロセスすべてがそれぞれ別々の」と書こうと思っていたのでした.CooS も面白そうだと思うのですが,資料がなくて(私が見つけられてないだけかも)なんとも.

_sadakoma(Fri Oct 07 20:38:23 JST 2005)

MSが研究中のSingularityはどうでしょう?

_通りすがり(Fri Oct 07 21:01:42 JST 2005)

CooSの情報は http://www.coos.jp/ くらいでしょうか。

複数のプロセスが単一のVMを共有するモデルなので、期待する物じゃないような気がしますが。

_6(Thu)

はじめて遺伝子音楽というのを聞く。結構感動した。

_5(Wed)

英語のコミックがきた.英語の勉強.Negima vol.1 - 3.Fruits Bascket vol.1.研究室に.


るびまをやっていくためには,やっぱりネギまを読まなきゃいかん! というわけで買った,というわけではもちろん無い.

ちなみに,R16 らしい.


毒電波は electro-poison waves らしい。

_4(Tue)

なんかスゲー熱が出てきた。俺の頭。


起きたから節々が痛い。熱は下がったか? とりあえず病院行こう。


生協にポスター印刷の予約をする。

さて、A0 2枚を入れるポスターの筒が必要だが、どこでいくら位で売ってるだろうか。


ハチクロ面白いねえ。


cygwin でやってたときは気づかなかったんですが、linux だとブロックの起動が激しく遅い。

_しゅ(Tue Oct 04 16:59:07 JST 2005)

 うちでは、櫻井翔が映画の主演を演るっていう理由で注目です>ハチクロ

_3(Mon)

YARV - Compile and Disassemble CGI

むしゃくしゃしてやった。今は反省している。


ここで、Rails は簡単に CGI を作れてすばらしいね、とでも言っておくといいんだろうか。勿論 Rails なんてものは使ってません。ただの cgi.rb。Rails は大規模なのを手軽に作れるけど、ちっちゃいのは手軽に作れないから嫌。

でも、ディスパッチャと erb という組み合わせは似ている(DBはない。ファイルシステムに突っ込んでる。grep できないんだもん)。考えることは一緒だよね。


で、だいたい CGI の作り方は決まってきたんだが、毎回コピペしてる。なんともはや、無駄だ。よく使う部分をくくりだして云々して、そして俺フレームワークが乱造する。でも、CGI 程度(小規模だし)、自分で作ったほうが早いよな。


Ruby ってやつは、

a << ((a << (a << A; B)::C); D)::E

こんなスクリプトが動かなきゃいけないらしいんだけれど、これが結構手間。なんとか修正。


誰も使ってくれないので、一人で遊ぶ。

class                                                  NP
def  initialize a=@p=[], b=@b=[];                      end
def +@;@b<<1;b2c end;def-@;@b<<0;b2c                   end
def  b2c;if @b.size==8;c=0;@b.each{|b|c<<=1;c|=b};send(
     'lave'.reverse,(@p.join))if c==0;@p<<c.chr;@b=[]  end
     self end end ; begin _ = NP.new                   end


# The Programming Language `NegaPosi'
+-+--++----+--+-+++--+-------+--++--+++---+-+++-+-+-+++-----+++-_
+--++++--+---++-+-+-+++--+--+-+------+--++++-++---++-++---++-++-_
+++--++-+-+--++--+++--+------+----+--++--+++-++-+----++------+--_
-+-+----+++--+--+----+--+--+-++-++--+++-++++-++-----+-+-+----++-_
---------+-+----                                                _

は、

ruby 1.9.0 i686-linux(2005-09-25)
YARVCore 0.3.1 rev: 272 (2005-10-01)

== disasm: <ISeq:<main>@http://www.atdot.net/yc.cgi>====================
local scope table (size: 2, argc: 0)
[ 2] _          
0000 putnil           
0001 putnil           
; (1) class                                                  NP
0002 classdef         :NP, <ISeq:<class:NP>@http://www.atdot.net/yc.cgi>(   1)
0005 popcref          
0006 pop              
; (6)      self end end ; begin _ = NP.new                   end
0007 getinlinecache   <ic>, 14                                        (   6)
0010 getconstant      :NP
0012 setinlinecache   7
0014 send             :new, 0, false, 0, <ic>
0020 setlocal         2
; (10) +-+--++----+--+-+++--+-------+--++--+++---+-+++-+-+-+++-----+++-_
0022 getlocal         2                                               (  10)
0024 send             :-@, 0, false, 0, <ic>
0030 send             :+@, 0, false, 0, <ic>
0036 send             :+@, 0, false, 0, <ic>
0042 send             :+@, 0, false, 0, <ic>
0048 send             :-@, 0, false, 0, <ic>
0054 send             :-@, 0, false, 0, <ic>
0060 send             :-@, 0, false, 0, <ic>
0066 send             :-@, 0, false, 0, <ic>
0072 send             :-@, 0, false, 0, <ic>
0078 send             :+@, 0, false, 0, <ic>
0084 send             :+@, 0, false, 0, <ic>
0090 send             :+@, 0, false, 0, <ic>
0096 send             :-@, 0, false, 0, <ic>
0102 send             :+@, 0, false, 0, <ic>
0108 send             :-@, 0, false, 0, <ic>
0114 send             :+@, 0, false, 0, <ic>
0120 send             :-@, 0, false, 0, <ic>
0126 send             :+@, 0, false, 0, <ic>
0132 send             :+@, 0, false, 0, <ic>
0138 send             :+@, 0, false, 0, <ic>
0144 send             :-@, 0, false, 0, <ic>
0150 send             :+@, 0, false, 0, <ic>
0156 send             :-@, 0, false, 0, <ic>
0162 send             :-@, 0, false, 0, <ic>
0168 send             :-@, 0, false, 0, <ic>
0174 send             :+@, 0, false, 0, <ic>
0180 send             :+@, 0, false, 0, <ic>
0186 send             :+@, 0, false, 0, <ic>
0192 send             :-@, 0, false, 0, <ic>
0198 send             :-@, 0, false, 0, <ic>
0204 send             :+@, 0, false, 0, <ic>
0210 send             :+@, 0, false, 0, <ic>
0216 send             :-@, 0, false, 0, <ic>
0222 send             :-@, 0, false, 0, <ic>
0228 send             :+@, 0, false, 0, <ic>
0234 send             :-@, 0, false, 0, <ic>
0240 send             :-@, 0, false, 0, <ic>
0246 send             :-@, 0, false, 0, <ic>
0252 send             :-@, 0, false, 0, <ic>
0258 send             :-@, 0, false, 0, <ic>
0264 send             :-@, 0, false, 0, <ic>
0270 send             :-@, 0, false, 0, <ic>
0276 send             :+@, 0, false, 0, <ic>
0282 send             :-@, 0, false, 0, <ic>
0288 send             :-@, 0, false, 0, <ic>
0294 send             :+@, 0, false, 0, <ic>
0300 send             :+@, 0, false, 0, <ic>
0306 send             :+@, 0, false, 0, <ic>
0312 send             :-@, 0, false, 0, <ic>
0318 send             :+@, 0, false, 0, <ic>
0324 send             :-@, 0, false, 0, <ic>
0330 send             :-@, 0, false, 0, <ic>
0336 send             :+@, 0, false, 0, <ic>
0342 send             :-@, 0, false, 0, <ic>
0348 send             :-@, 0, false, 0, <ic>
0354 send             :-@, 0, false, 0, <ic>
0360 send             :-@, 0, false, 0, <ic>
0366 send             :+@, 0, false, 0, <ic>
0372 send             :+@, 0, false, 0, <ic>
0378 send             :-@, 0, false, 0, <ic>
0384 send             :-@, 0, false, 0, <ic>
0390 send             :+@, 0, false, 0, <ic>
0396 send             :-@, 0, false, 0, <ic>
0402 send             :+@, 0, false, 0, <ic>
0408 pop              
; (11) +--++++--+---++-+-+-+++--+--+-+------+--++++-++---++-++---++-++-_
0409 getlocal         2                                               (  11)
0411 send             :-@, 0, false, 0, <ic>
0417 send             :+@, 0, false, 0, <ic>
0423 send             :+@, 0, false, 0, <ic>
0429 send             :-@, 0, false, 0, <ic>
0435 send             :+@, 0, false, 0, <ic>
0441 send             :+@, 0, false, 0, <ic>
0447 send             :-@, 0, false, 0, <ic>
0453 send             :-@, 0, false, 0, <ic>
0459 send             :-@, 0, false, 0, <ic>
0465 send             :+@, 0, false, 0, <ic>
0471 send             :+@, 0, false, 0, <ic>
0477 send             :-@, 0, false, 0, <ic>
0483 send             :+@, 0, false, 0, <ic>
0489 send             :+@, 0, false, 0, <ic>
0495 send             :-@, 0, false, 0, <ic>
0501 send             :-@, 0, false, 0, <ic>
0507 send             :-@, 0, false, 0, <ic>
0513 send             :+@, 0, false, 0, <ic>
0519 send             :+@, 0, false, 0, <ic>
0525 send             :-@, 0, false, 0, <ic>
0531 send             :+@, 0, false, 0, <ic>
0537 send             :+@, 0, false, 0, <ic>
0543 send             :+@, 0, false, 0, <ic>
0549 send             :+@, 0, false, 0, <ic>
0555 send             :-@, 0, false, 0, <ic>
0561 send             :-@, 0, false, 0, <ic>
0567 send             :+@, 0, false, 0, <ic>
0573 send             :-@, 0, false, 0, <ic>
0579 send             :-@, 0, false, 0, <ic>
0585 send             :-@, 0, false, 0, <ic>
0591 send             :-@, 0, false, 0, <ic>
0597 send             :-@, 0, false, 0, <ic>
0603 send             :-@, 0, false, 0, <ic>
0609 send             :+@, 0, false, 0, <ic>
0615 send             :-@, 0, false, 0, <ic>
0621 send             :+@, 0, false, 0, <ic>
0627 send             :-@, 0, false, 0, <ic>
0633 send             :-@, 0, false, 0, <ic>
0639 send             :+@, 0, false, 0, <ic>
0645 send             :-@, 0, false, 0, <ic>
0651 send             :-@, 0, false, 0, <ic>
0657 send             :+@, 0, false, 0, <ic>
0663 send             :+@, 0, false, 0, <ic>
0669 send             :+@, 0, false, 0, <ic>
0675 send             :-@, 0, false, 0, <ic>
0681 send             :+@, 0, false, 0, <ic>
0687 send             :-@, 0, false, 0, <ic>
0693 send             :+@, 0, false, 0, <ic>
0699 send             :-@, 0, false, 0, <ic>
0705 send             :+@, 0, false, 0, <ic>
0711 send             :+@, 0, false, 0, <ic>
0717 send             :-@, 0, false, 0, <ic>
0723 send             :-@, 0, false, 0, <ic>
0729 send             :-@, 0, false, 0, <ic>
0735 send             :+@, 0, false, 0, <ic>
0741 send             :-@, 0, false, 0, <ic>
0747 send             :-@, 0, false, 0, <ic>
0753 send             :+@, 0, false, 0, <ic>
0759 send             :+@, 0, false, 0, <ic>
0765 send             :+@, 0, false, 0, <ic>
0771 send             :+@, 0, false, 0, <ic>
0777 send             :-@, 0, false, 0, <ic>
0783 send             :-@, 0, false, 0, <ic>
0789 send             :+@, 0, false, 0, <ic>
0795 pop              
; (12) +++--++-+-+--++--+++--+------+----+--++--+++-++-+----++------+--_
0796 getlocal         2                                               (  12)
0798 send             :-@, 0, false, 0, <ic>
0804 send             :-@, 0, false, 0, <ic>
0810 send             :+@, 0, false, 0, <ic>
0816 send             :-@, 0, false, 0, <ic>
0822 send             :-@, 0, false, 0, <ic>
0828 send             :-@, 0, false, 0, <ic>
0834 send             :-@, 0, false, 0, <ic>
0840 send             :-@, 0, false, 0, <ic>
0846 send             :-@, 0, false, 0, <ic>
0852 send             :+@, 0, false, 0, <ic>
0858 send             :+@, 0, false, 0, <ic>
0864 send             :-@, 0, false, 0, <ic>
0870 send             :-@, 0, false, 0, <ic>
0876 send             :-@, 0, false, 0, <ic>
0882 send             :-@, 0, false, 0, <ic>
0888 send             :+@, 0, false, 0, <ic>
0894 send             :-@, 0, false, 0, <ic>
0900 send             :+@, 0, false, 0, <ic>
0906 send             :+@, 0, false, 0, <ic>
0912 send             :-@, 0, false, 0, <ic>
0918 send             :+@, 0, false, 0, <ic>
0924 send             :+@, 0, false, 0, <ic>
0930 send             :+@, 0, false, 0, <ic>
0936 send             :-@, 0, false, 0, <ic>
0942 send             :-@, 0, false, 0, <ic>
0948 send             :+@, 0, false, 0, <ic>
0954 send             :+@, 0, false, 0, <ic>
0960 send             :-@, 0, false, 0, <ic>
0966 send             :-@, 0, false, 0, <ic>
0972 send             :+@, 0, false, 0, <ic>
0978 send             :-@, 0, false, 0, <ic>
0984 send             :-@, 0, false, 0, <ic>
0990 send             :-@, 0, false, 0, <ic>
0996 send             :-@, 0, false, 0, <ic>
1002 send             :+@, 0, false, 0, <ic>
1008 send             :-@, 0, false, 0, <ic>
1014 send             :-@, 0, false, 0, <ic>
1020 send             :-@, 0, false, 0, <ic>
1026 send             :-@, 0, false, 0, <ic>
1032 send             :-@, 0, false, 0, <ic>
1038 send             :-@, 0, false, 0, <ic>
1044 send             :+@, 0, false, 0, <ic>
1050 send             :-@, 0, false, 0, <ic>
1056 send             :-@, 0, false, 0, <ic>
1062 send             :+@, 0, false, 0, <ic>
1068 send             :+@, 0, false, 0, <ic>
1074 send             :+@, 0, false, 0, <ic>
1080 send             :-@, 0, false, 0, <ic>
1086 send             :-@, 0, false, 0, <ic>
1092 send             :+@, 0, false, 0, <ic>
1098 send             :+@, 0, false, 0, <ic>
1104 send             :-@, 0, false, 0, <ic>
1110 send             :-@, 0, false, 0, <ic>
1116 send             :+@, 0, false, 0, <ic>
1122 send             :-@, 0, false, 0, <ic>
1128 send             :+@, 0, false, 0, <ic>
1134 send             :-@, 0, false, 0, <ic>
1140 send             :+@, 0, false, 0, <ic>
1146 send             :+@, 0, false, 0, <ic>
1152 send             :-@, 0, false, 0, <ic>
1158 send             :-@, 0, false, 0, <ic>
1164 send             :+@, 0, false, 0, <ic>
1170 send             :+@, 0, false, 0, <ic>
1176 send             :+@, 0, false, 0, <ic>
1182 pop              
; (13) -+-+----+++--+--+----+--+--+-++-++--+++-++++-++-----+-+-+----++-_
1183 getlocal         2                                               (  13)
1185 send             :-@, 0, false, 0, <ic>
1191 send             :+@, 0, false, 0, <ic>
1197 send             :+@, 0, false, 0, <ic>
1203 send             :-@, 0, false, 0, <ic>
1209 send             :-@, 0, false, 0, <ic>
1215 send             :-@, 0, false, 0, <ic>
1221 send             :-@, 0, false, 0, <ic>
1227 send             :+@, 0, false, 0, <ic>
1233 send             :-@, 0, false, 0, <ic>
1239 send             :+@, 0, false, 0, <ic>
1245 send             :-@, 0, false, 0, <ic>
1251 send             :+@, 0, false, 0, <ic>
1257 send             :-@, 0, false, 0, <ic>
1263 send             :-@, 0, false, 0, <ic>
1269 send             :-@, 0, false, 0, <ic>
1275 send             :-@, 0, false, 0, <ic>
1281 send             :-@, 0, false, 0, <ic>
1287 send             :+@, 0, false, 0, <ic>
1293 send             :+@, 0, false, 0, <ic>
1299 send             :-@, 0, false, 0, <ic>
1305 send             :+@, 0, false, 0, <ic>
1311 send             :+@, 0, false, 0, <ic>
1317 send             :+@, 0, false, 0, <ic>
1323 send             :+@, 0, false, 0, <ic>
1329 send             :-@, 0, false, 0, <ic>
1335 send             :+@, 0, false, 0, <ic>
1341 send             :+@, 0, false, 0, <ic>
1347 send             :+@, 0, false, 0, <ic>
1353 send             :-@, 0, false, 0, <ic>
1359 send             :-@, 0, false, 0, <ic>
1365 send             :+@, 0, false, 0, <ic>
1371 send             :+@, 0, false, 0, <ic>
1377 send             :-@, 0, false, 0, <ic>
1383 send             :+@, 0, false, 0, <ic>
1389 send             :+@, 0, false, 0, <ic>
1395 send             :-@, 0, false, 0, <ic>
1401 send             :+@, 0, false, 0, <ic>
1407 send             :-@, 0, false, 0, <ic>
1413 send             :-@, 0, false, 0, <ic>
1419 send             :+@, 0, false, 0, <ic>
1425 send             :-@, 0, false, 0, <ic>
1431 send             :-@, 0, false, 0, <ic>
1437 send             :+@, 0, false, 0, <ic>
1443 send             :-@, 0, false, 0, <ic>
1449 send             :-@, 0, false, 0, <ic>
1455 send             :-@, 0, false, 0, <ic>
1461 send             :-@, 0, false, 0, <ic>
1467 send             :+@, 0, false, 0, <ic>
1473 send             :-@, 0, false, 0, <ic>
1479 send             :-@, 0, false, 0, <ic>
1485 send             :+@, 0, false, 0, <ic>
1491 send             :-@, 0, false, 0, <ic>
1497 send             :-@, 0, false, 0, <ic>
1503 send             :+@, 0, false, 0, <ic>
1509 send             :+@, 0, false, 0, <ic>
1515 send             :+@, 0, false, 0, <ic>
1521 send             :-@, 0, false, 0, <ic>
1527 send             :-@, 0, false, 0, <ic>
1533 send             :-@, 0, false, 0, <ic>
1539 send             :-@, 0, false, 0, <ic>
1545 send             :+@, 0, false, 0, <ic>
1551 send             :-@, 0, false, 0, <ic>
1557 send             :+@, 0, false, 0, <ic>
1563 send             :-@, 0, false, 0, <ic>
1569 pop              
; (14) ---------+-+----                                                _
1570 getlocal         2                                               (  14)
1572 send             :-@, 0, false, 0, <ic>
1578 send             :-@, 0, false, 0, <ic>
1584 send             :-@, 0, false, 0, <ic>
1590 send             :-@, 0, false, 0, <ic>
1596 send             :+@, 0, false, 0, <ic>
1602 send             :-@, 0, false, 0, <ic>
1608 send             :+@, 0, false, 0, <ic>
1614 send             :-@, 0, false, 0, <ic>
1620 send             :-@, 0, false, 0, <ic>
1626 send             :-@, 0, false, 0, <ic>
1632 send             :-@, 0, false, 0, <ic>
1638 send             :-@, 0, false, 0, <ic>
1644 send             :-@, 0, false, 0, <ic>
1650 send             :-@, 0, false, 0, <ic>
1656 send             :-@, 0, false, 0, <ic>
1662 send             :-@, 0, false, 0, <ic>
1668 end              
== disasm: <ISeq:<class:NP>@http://www.atdot.net/yc.cgi>================
local scope table (size: 1, argc: 0)

; (2) def  initialize a=@p=[], b=@b=[];                      end
0000 methoddef        :initialize, <ISeq:initialize@http://www.atdot.net/yc.cgi>(   2)
; (3) def +@;@b<<1;b2c end;def-@;@b<<0;b2c                   end
0003 methoddef        :+@, <ISeq:+@@http://www.atdot.net/yc.cgi>      (   3)
0006 methoddef        :-@, <ISeq:-@@http://www.atdot.net/yc.cgi>
; (4) def  b2c;if @b.size==8;c=0;@b.each{|b|c<<=1;c|=b};send(
0009 methoddef        :b2c, <ISeq:b2c@http://www.atdot.net/yc.cgi>    (   4)
0012 putnil           
0013 end              
== disasm: <ISeq:initialize@http://www.atdot.net/yc.cgi>================
local scope table (size: 3, argc: 0)
[ 3] a<Opt=0>   [ 2] b<Opt=7>   
; (2) def  initialize a=@p=[], b=@b=[];                      end
0000 newarray         0                                               (   2)
0002 dup              
0003 setinstancevariable :@p
0005 setlocal         3
0007 newarray         0
0009 dup              
0010 setinstancevariable :@b
0012 setlocal         2
0014 putnil           
0015 end              
== disasm: <ISeq:+@@http://www.atdot.net/yc.cgi>========================
local scope table (size: 1, argc: 0)

; (3) def +@;@b<<1;b2c end;def-@;@b<<0;b2c                   end
0000 getinstancevariable :@b                                          (   3)
0002 putobject        1
0004 send             :<<, 1, false, 0, <ic>
0010 pop              
0011 putself          
0012 send             :b2c, 0, false, 0, <ic>
0018 end              
== disasm: <ISeq:-@@http://www.atdot.net/yc.cgi>========================
local scope table (size: 1, argc: 0)

; (3) def +@;@b<<1;b2c end;def-@;@b<<0;b2c                   end
0000 getinstancevariable :@b                                          (   3)
0002 putobject        0
0004 send             :<<, 1, false, 0, <ic>
0010 pop              
0011 putself          
0012 send             :b2c, 0, false, 0, <ic>
0018 end              
== disasm: <ISeq:b2c@http://www.atdot.net/yc.cgi>=======================
== catch table
|type: 07, st: 0022, ed: 0031, sp: 0000, cont: 0022
|------------------------------------------------------------------------
local scope table (size: 2, argc: 0)
[ 2] c          
; (4) def  b2c;if @b.size==8;c=0;@b.each{|b|c<<=1;c|=b};send(
0000 getinstancevariable :@b                                          (   4)
0002 send             :size, 0, false, 0, <ic>
0008 putobject        8
0010 send             :==, 1, false, 0, <ic>
0016 unless           88
0018 putobject        0
0020 setlocal         2
0022 getinstancevariable :@b
0024 send             :each, 0, <ISeq:block in b2c@http://www.atdot.net/yc.cgi>, 0, <ic>
0030 pop              
; (5)      'lave'.reverse,(@p.join))if c==0;@p<<c.chr;@b=[]  end
0031 getlocal         2                                               (   5)
0033 putobject        0
0035 send             :==, 1, false, 0, <ic>
0041 unless           67
0043 putself          
0044 putstring        "lave"
0046 send             :reverse, 0, false, 0, <ic>
0052 getinstancevariable :@p
0054 send             :join, 0, false, 0, <ic>
0060 send             :send, 2, false, 0, <ic>
0066 pop              
0067 getinstancevariable :@p
0069 getlocal         2
0071 send             :chr, 0, false, 0, <ic>
0077 send             :<<, 1, false, 0, <ic>
0083 pop              
0084 newarray         0
0086 setinstancevariable :@b
; (6)      self end end ; begin _ = NP.new                   end
0088 putself                                                          (   6)
0089 end              
== disasm: <ISeq:block in b2c@http://www.atdot.net/yc.cgi>==============
== catch table
|type: 11, st: 0000, ed: 0026, sp: 0000, cont: 0000
|type: 13, st: 0000, ed: 0026, sp: 0000, cont: 0026
|------------------------------------------------------------------------
local scope table (size: 1, argc: 1)
[ 1] b<ArgRest> 
; (4) def  b2c;if @b.size==8;c=0;@b.each{|b|c<<=1;c|=b};send(
0000 getlocal         2                                               (   4)
0002 putobject        1
0004 send             :<<, 1, false, 0, <ic>
0010 setlocal         2
0012 getlocal         2
0014 getdynamic       1, 0
0017 send             :|, 1, false, 0, <ic>
0023 dup              
0024 setlocal         2
0026 end              

あまり面白くない。


2ch を眺めていて,バイトコンパイラってなんだろうと悩んでみた.

  • アルバイトが書いたコンパイラ
  • アルバイトがコンパイラ

やばい、VMware 面白い。素敵だ。このマシンが速いからってのもあるけど。

_2(Sun)

2 日。


■[ハード技術] RFIDの寿命 を読んで、そういえばたしかに寿命というのは重要だなぁ、と思った。応用など、研究レベルだとあまり、というか全然考えないよね。


http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Shiro の (2005/09/30 01:58:39 PDT) に対して。

研究としては色々ありますよね。投機スレッド実行だとか。まさに、Fork & Join をサポートするプロセッサも東芝から出してたような気もする。名前忘れたけど。我々の研究も、CPU が並列関係プリミティブを命令セットで持っているというアーキテクチャ(OChiMuS: On Chip Multi SMT Processor)というのをやってます。他にも色々研究はあるけど、名前が思い出せないのでパス。

ただ、あと5年は並列計算機+自動並列化がプログラミングスタイル(&環境)として一般的に、実用的になるとは思えませんが(HPC 関係以外ってことね)。今はクラスタやグリッドのほうが流行ってるし(実装とかが簡単だしね)。

って、俺が言うなって感じだな。

並列関数型言語は 90年代に色々研究があったようなんだけど、最近はあまり聞かない。なんでだろう。やっぱり関数型言語を使う人が少ないのが原因なんだろうか。

細粒度並列オブジェクト指向言語の話も、日本だと八杉さんのところがやってるのくらいか。今は GCC の入れ子関数を細粒度並列処理に利用してる話してるけど(多分、OPA につながる、のかなぁ)。


ただ、今後はプロセッサは 必ず マルチコアなどの密な並列プロセッサになっていくので(もしそうでないとするなら、それはプロセッサ屋さんは進化をやめたということだろう)並列処理を容易に実現できる言語というのは必須で必至で必然だと思う(OS が対応すればいいって? 細粒度並列処理に、OS だけ での対応は無理ですよ。もちろん、OS の支援は必須... だと思うけれど。今の HT の惨状を見ようよ。Dual Core がどれだけ成功するかは ... 楽しみではあるけれど、どうなのかな)。

研究者は5年後、10年後を見据えなければ、ということで、少し考えてみる。

  • 5年後: OpenMP のような仕様が(HPC 分野以外で)一般的になる。
    • 組み込み分野での研究から、一般に広がっていく、と予測。
  • 10年後: ほとんどの人が C 言語など、自分で並列処理を管理しないといけない言語などを使わず、並列処理を最初から意識した言語を使うようになる。
    • どんなパラダイムかはわからないけれど。
    • 15年後かもしれない。
  • 50年後: 今ある高水準言語は全部低水準言語と呼ばれるようになる。

プロセッサアーキテクチャは、RISC の延長だと思うなぁ。


以上は、汎用プロセッサの話ね。もしかしたら、汎用プロセッサ、というもの自体が無くなっていく(もしくはもう進化しない)のかもしれないけど。

あ、進化しない、というのはアーキテクチャや高速化のための仕組みって意味で低消費電力とかではもっともっと進むと思う。


Prolog とかあの辺はどうなんだろう。よくわからない。


ついでなので、我々の研究している(俺の研究は Ruby ではない) OChiMuS について、命令セットを紹介してみる。

  • 基本は MIPS
  • 並列実行単位は「実スレッド」と表記する。これは、ソフトウェアが管理する「スレッド(または論理スレッド)」と区別するため
    • 実スレッドは LTN: Logical Thread Number という識別子で認識される
    • 各実スレッドは同じアドレス空間、要するにいわゆる 1 つのプロセス
    • 各実スレッドはキャッシュを共有する
      • キャッシュを共有するから、共有したときの効果はでかい(○)
      • キャッシュを共有するから、競合したときの効果はでかい(×)
  • 並列アーキテクチャのは(今は)SMT プロセッサ(OChiMuS PE、PE: Processor Element)
    • なので、同時並列実行可能実スレッド数は 4 とか 8 に制限される
  • 並列プリミティブをサポートする命令
    • PALLOC 命令: 実スレッドに命令流を割り付ける
    • PDALL 命令: 実スレッドをとめる
    • PBLK 命令: 実スレッドをブロックする
    • PUBLK 命令: 実スレッドのブロックを解除する
    • FWD 命令: 他の実スレッドに値を転送する
    • 細粒度排他制御は MIPS の LL/SC

この命令セットを見るとわかるけれど、たとえば 100 スレッドを作っても、並列実行単位で割り当てられる実スレッド数は 4 とか 8。また、プリエンプションは起こらない。

これらを、いわゆるプログラマがふつーに要求するスレッドとして対応するには、スレッドライブラリを作らないといけない。で、それを上記命令セットでスレッドライブラリを作りましたよ、というのが私の卒論で、論文(マルチスレッドアーキテクチャにおけるスレッドライブラリの実装と評価)。

並列実行をサポートするのに、ほとんどユーザレベルで作りましたよ、というのと、プロセッサの命令を使っているので効率がいいね、というのが肝。ユーザレベルで並列処理、というのは N-M モデルのスレッドライブラリとすればそれは不可能では無いけどね。プロセッサを直に触るモデルは無かったし。

さて、ユーザレベルスレッドライブラリなので、プリエンプションはどうやるか。例えばシグナル(SIGALRM)を利用してもいいんだけど、シグナルってオーバヘッド大きいよね、ってのが懸念。要するにアップコールを軽量にしなければならないんだけど、じゃぁそれをやりましょう、というのが SA: Scheduler Activations (いまだと FreeBSD の KSE: Kernel Scheduler Entities が有名)に似た KN: Kernel Notification という機構を提案。OS とユーザレベルスレッドライブラリが、SA よりも密に連携するモデル。

ちなみに、このときに作ったスレッドライブラリが pthread 仕様で MULiTh(Thread Library for Multithreaded Architecture)という。pthread 仕様といっても、難しいところは全然手をつけてませんが。


で、今私がやっている、やろうとしている(そして全然やっていない)研究は、このアーキテクチャをスレッドライブラリじゃなくて言語処理系がサポートしてハッピーになれるシナリオを探している。


なんでいきなりこんなことを書き出したかというと、論文の revise をしなくちゃいけなくて、その現実逃避。


YARV で Rails の動かし方がわかんねーんだけど、どうやったらいいのん? というメールが。まだ動くわけないじゃん(断言するなよ...)。

まずは mkmf.rb を動かせないとなぁ。mkmf.rb を書き換えれば対応できないことも無いが。

あと、$SAFE 関係に一切手を付けてないんだが、どうしたもんだか。


今思いついたんだが、$SAFE = 4 などでの(シングルトン)メソッド定義は、define_method 相当としてしまうといいんじゃないだろうか。

って、define_method で起動するメソッドは $SAFE が直されるわけじゃないのか。

いや、毎回メソッドディスパッチ時に $SAFE をチェックしたりなんなりはだるいな、と。


こういう長いエントリを書くと嫌がられるんだよな。


スレッドのテストをしないといけないんだが、どうしようかな。


malloc して、初期化だけしたいけど、後は const として扱いたいものってありますよね。そういうのを、


struct const_test{
  int const i;
};

struct unconst_test{
  int i;
};

int main(){
  struct const_test ct;
  ((struct unconst_test*)&ct)->i = 10;
  printf("%d\n", ct.i);
  return 0;
}

こんなふうにコーディングするのって、ありなんでしょうか。


const int g_const_i = 5;

void func(){
  ((int*)&g_const_i)[0] = 0;
}

int main(){
  int i;
  func();
  for(i=0; i<g_const_i; i++){
    printf("%d\n", i);
  }
  return 0;
}

こうやったら segv(cygwin)。まぁ、そらそうか。C の言語仕様をよく知らないんですが、この辺は未定義なのかな。

まぁ、malloc したものを扱う、という話とは違うので、あれですが。

int main(){
  int i, j;
  const int * c;
  int *b;
  c = b = (int *)malloc(sizeof(int));
  *b = 1;
  j = *c;
  
  *b = 2;
  j = *c;

  printf("j: %d\n", j);
  return 0;
}

こんなコードだと、j は 1 のままだったりするのかとも思ったけど、ちゃんと 2 になってるな。

int main(){
  const int c = 2;
  *(int *)(&c) = 3;
  printf("%d\n", c);
}

こんなコードだと、cl は 3、gcc -O[123] は 2、gcc -O0 は 3。

まぁ、未定義なのかな、これも。


a.b = x としたらエラー、みたいなことを手軽にやりたいなぁ、という感じ。

hoge.h には const なメンバ定義をしておいて、hoge.c では書き換え可能なようにして、インターフェースを実装、他(foo.c など)は書き込みができなくする、と。

hoge.h:
--------
struct Hoge{
  const int a, b, c;
}
--------
hoge.c:
--------
struct HogeImpl{
  int a, b, c;
}
setA(struct HogeImpl *h){
  h->a = 0;
}
...

C++ だとはねられそうだな。

きっと、ソースが読みづらくなるだけなんだろうなぁ。


メモリチェッカのことを、全然知らなかったのですが、

  • electric fence
  • ccmalloc
  • memprof
  • valgrind

などを知る。

_shiro(Sun Oct 02 17:26:47 JST 2005)

Cellみたいな「汎用プロセッサ+たくさんの特殊プロセッサ」がたくさんある世界だと話がまた違ってくるような気もしますね。

バスがいつまでもボトルネックなら、ちまちまと転送するよりはコードもデータもブロックでどかんとPEのオンチップメモリ(キャッシュなり、スクラッチメモリなり)に転送する方がやっぱり速い。で、高級言語の記述からコンパイラがそのへんのまとまった処理を切り出して並列化してくれれば嬉しいんだけど、どうかなあ。

汎用プロセッサエレメントの視点からそういう並列動作する特殊プロセッサを見ると、一種のプログラマブルなコプロセッサをたくさん抱えている、というふうにも見えます(もっともコプロセッサ命令の粒度が普通のコプロセッサよりはずっと大きくなりがちだけれど)。コンパイラが、プログラムの都合が良いようにコプロセッサ命令を定義できるとしたら、どうなるだろう。

_ささだ(Sun Oct 02 17:30:03 JST 2005)

 あぅ、reconfiguarable な視点を忘れていた。十分そっちもありうると思います。Cell なんかは汎用じゃなくて専用という視点で見ています。

_しゅ(Mon Oct 03 19:12:00 JST 2005)

 Cray XD-1っていうマシンには最初からFPGAが載ってます。半年前くらいに話を聞いた時点では、30種類くらいのアプリに対応してる、とのことでした。

_しゅ(Mon Oct 03 19:13:52 JST 2005)

 対象となるプログラムを解析して、消費電力が少なくなるような命令セットを構成する、っていう研究を中西先生(九大)のところでやってました。

_ささだ(Mon Oct 03 20:26:40 JST 2005)

 うちでも reconf やってます。さっき話を聞いたらギリシャのワークショップに行くらしい。いいなぁ。

_1(Sat)

10月。

後...。


win32 のスレッドがやっと出来た。疲れすぎ。でも、まだちゃんとしたテストを書いていない。

一日かかった。


win32 のスレッドはプロセスが死んでも勝手に死んでくれないんだが、安全に全てを kill する方法が思い浮かばない。


mswin32 版、コミット。

signal 関係は駄目駄目。

Sasada Koichi / sasada@namikilab.tuat.ac.jp
$Date: 2003/04/28 10:27:51 $