http://enbug.tdiary.net/20050226.html#p01
セキュアなIPCや高速なIPCはすでに達成されているが、セキュアかつ高速なIPCが現在の課題であるというのが締めくくり。
あー、なるほどなるほど。高速なってどれくらい高速なんだろう。セキュアってどれくらいセキュアなんだろう。
YARV,ディレクトリ構成考えないとあかんなぁ.
P2P 勉強会というのもあったのか。いいなぁ。
あんなに出来る人が、なんで...。博士課程は厳しいというか、それ以前の問題なのか...。
MSN Messenger が流行っているというので(何時の時代だ)、インストールしてみる。広告うざ。みんなこれを我慢して使ってるんだろうか。
ko1 at namikilab.tuat.ac.jp なので、まぁ暇な人は。
キリスト教をよく知らないのでチャレンジってなんじゃろうと検索してみる。
http://www.geocities.jp/eshalom21/6_0/6_2_words.htm
ちゃれんじ【チャレンジ】 クリスチャンが神から与えられる課題のようなもの。これに答えるためには、信仰上の決意や日常生活における実践を要するため、神からの霊的な挑戦になぞらえてチャレンジという。チャレンジは、聖書の御言葉や礼拝説教を通して与えられることが多い。用例『今日の礼拝説教は、あなたの夫を許しなさいという――だったね。』
はてな。問答でもするんじゃろうか?
うは、いつぞやの JavaVM の人だったのか! ご無沙汰しております。最近めっきりチェックしてなかったなぁ。やっぱ自分用のアンテナが欲しい。
あー、やってしまった。
参考: http://dion.oem.melma.com/mag/54/m00076754/a00000054.html
院多ぷ梨太君でも考えれば、本を書けたりするんだろうか(書けません)。
中田先生の本といえばコンパイラの構成と最適化ではないだろうか。
しまった、HOKKE 2005 の懇親会の申し込み締め切りが過ぎてしまったorz
やっぱり、Matz にっき効果は凄いですね。
そういえば、「英語に困ってる人を初めて見た」といわれたのは、さすがにショックだった。そうだよね、やっぱり出来ないとだめだよね...。
Ruby.NET コンパイラ(Ruby プログラムを .NET 環境に動作するようにコンパイルする処理系)の開発者である淺川君が Ruby.NET コンパイラの開発 という文書を書いてくれました。突っ込みどころがないこともないけど、大変よくかけていると思います。きちんと文書にするというのは、すばらしい。
あり、2005年度の未踏ソフトウェア創造事業の締め切りって 3/31 だったのですか。去年まで5月くらいじゃなかったっけ。あれー。どうしたもんだかな。
そういえば、日記に成果報告の資料を置いていなかったので、置いてみる。これは、それなりに頑張ったのです。
http://www.atdot.net/yarv/youth_2004_sasada_final.ppt
型宣言の話。立石さんと IRC で少し。
def m __type__(x, Fixnum) __type__(y, Array, NilClass) x = 1 y = m2() end #=> def m x = (Fixnum === 1 ? 1 : raise TypeError) y = (__tmp = m2(); (Array === __tmp && NilClass === __tmp) ? __tmp : raise TypeError)) end # === では不十分だけど・・・
・・・じゃなくて、そもそも静的解析でいいといわれてしまった。確かに。
Python が上記変換を行うんだっけ?
__type__(x, eval('...'))
なんて書くと、(静的解析を頑張りたい)コンパイラとか泣きそうだなあ。
GCC 使うなら C にコンパイルすればいいじゃん、と思った俺はきっと負け組。たしかに、C だと表現力が低くてどうしょーもない場合が時々ある。
まだ yarv のアセンブラはまだ出来てないんだけど、逆アセンブラは出来るんだろうか、とかふと思ってしまった。誰か挑戦してみませんか。
まだ出来ないのは、設計がかなりコンパイルにべったりだったから...。
「括弧?そんなものあったかのう」おじーちゃんがLisp脳でボケちゃった!!
爆笑してしまった。
WebObject の勉強会なんてあったのかぁ。いいなぁ。
評価データがどっか行った orz
あれとるの24時間かかったんだよぅ。うう。
先日の中田先生のお話については、後で聞いたところ「自分でもっとコーディングすればよかった」「自分で書かないと身につかないよね」ということのようです。つまり、コンパイラのコードを書いたのは最初の開発のときだけで、あとはずっとマネージャーなりなんなり、偉い人になってしまったので、なかなかコードがかけなかったとのこと。
はい、3/31です。ユースでない、本体は、去年はほんの少し遅い程度だっだような。どっちにせよ、春先なんですぅ
WebObjects 勉強会の日付はいつも SICP 読書会と被ってます。http://www.okada.jp.org/WOWiki/ また参加場所は明記されていないため、参加するには WOMeeting や WOAPI などの Mailing-list に入って開催場所の情報を入手するか他の参加者に連れて行ってもらう必要があります。(WebObjects の Mailing-list ではありません。)
SICPとかRHGとかいつも被りまくり。土曜日足りない。日曜いらないので土曜が今の5倍くらい欲しい。
昨日は中田先生の最終講義を拝聴しに行った。私服でもよかったのかー。
いろいろと楽しかったのだけれど、「もっと真面目にコンパイラと付き合っていれば」という言葉を聞いて、じゃぁどこまでやれば真面目に取り組めたことになるんだろう、とか思ってしまった。
トラックボールを買い換える。
椅子を見る。コンテッサいいなぁ。
生産技術なんとかに行く.でけー.
問題は難しい.そもそも英語が難しい.
まりやとかが(略)。
USEN の光がよさそう、ということで頼もうと思ったら、「サーバを立てることは一切禁止」ということらしい。sshd を立てられるのは必須なので、駄目ってことなのだなぁ。残念。
そういえば、YARV のページは英語(のようなもの)しかない。日本語のものを作っておかないと、ちょっとアレかな。でも、日本語版を作ってしまうと、そっちしか更新しないような気がする。どうするのがいいんだろう。まぁ、英語(のようなもの)だけかな、当分は・・・。
アセンブラをシコシコ書いてるんだけど、難しい・・・。
今考えてるフォーマット:
require 'yasm' yasm = YARVCore::Assembler.new # # def m1(a, b) # p [a, b] # end # => m1 = yasm.method(:m1, :a, :b){|x| x.putself x.getlocal :a x.getlocal :b x.newarray 2 x.send :p, 2 x.putnil x.end } # # def m2(a1, a2) # begin # t1() # rescue # t2() # ensure # t3() # end # end m2 = yasm.method(:m2, :a1, :a2){|x| x.begin{|y| y.putself y.send :t1, 0 }.rescue{|y| y.putself y.send :t2, 0 }.ensure{|y| y.putself y.send :t3, 0 } } # # def m3(a) # abs # if a > 0 # a # else # -a # end # end m3 = yasm.method(:m3, :a){|x| x.getlocal :a x.putobject 0 x.send :>, 1 x.unless :lelse x.getlocal :a x.jump :lend x.label :lelse ## x.getlocal :a x.send :+@, 0 x.label :lend ## x.end } # # def m4(a) # 3.times{|i| # p a # } m4 = yasm.method(:m4, :a){|x| x.putobject 3 x.send :times, 0, x.block(:i){|y| y.getself y.getlocal :a y.send :p, 1 y.end } x.end } # # def m5(a) # b = a * 2 # end m5 = yasm.method(:a){|x| x.local_vars(:b) # you must declare local variables at first x.getlocal :a x.putobject 2 x.send :*, 1 x.dup x.setlocal :b x.end } # # def m1(...); ...; end # # m1(1, 2) # => top = yasm.top{|x| x.methoddef(:m1, m1) x.putself x.putobject 1 x.putobject 2 x.send :m1, 2 x.end } #=> run YARVCore::eval_parsed(top)
例外はもうちょっとうまくなるような気がするんだけど・・・。
ローカル変数の定義どうしよう。ruby っぽくするか、それとも、先に宣言文書かせるか。
m4 はいかにも書きにくそうだ。うーん。というか、てきとーにこの Ruby script に変換して eval すればいいやーと思っていたんだけど、うまくいくかな。
なんかボケボケ。
svar について、やっと納得したような気がしないでもない。なんとなく、シンプルな解決方法になったような気がする。今のところ、気だけ。
そういえば、IORCC 意外と本格的なのね。整理番号貰ってしまった。
懐中時計型音楽プレーヤ欲しい。
http://www1.voanews.com/Webcasts/index.cfm
動画も見れたのね。知らんかった。すばらしい>VOA Special English
なんか、いろんなことへのモチベーションが・・・。
そういえば明日明後日は中田先生の最終講義だった。危ない危ない。
え、Smalltalk の ifTrue: って、外見だけなの?
ディスパッチテーブル使うよりも、もうキャッシュでいーやー、なんて思ってる自分が・・・。どれくらい速くなるのかしらん。分岐予測がボトルネックならば、static に決まるから嬉しそうだけど、プロセッサのキャッシュ効率は悪そうだな。うーん、インラインキャッシュも同じか・・・。
再定義なんてステ、なんて考えていたけれど、やっぱり特異クラスなんか作ってると、キャッシュがフラッシュされる可能性があるんですねぇ。やっぱりセレクタごとになんか持つか。
状態カウンタじゃなくて、セレクタごとにキャッシュ用ノードリストがあって・・・。GC 関係が嫌な感じ。きちんとファイナライザで消せばいいのだけれど。
ObjectSpace があるのだから、SymbolSpace があってもいいんじゃなかろうか(名前は適当ではないかも)。
というわけで、2004年度 未踏ユース成果報告会を振り返ってみる。三日間行なわれたが、最終日は私は寝坊していけなかった orz
雰囲気は良い。自分の開発に限らず、開発について真摯に捉えており、議論が活発だった。しかし、比較的「自分ではこうする」「こうしたらどうですかね」的な意見が多く、「なんでそうなの?」的な話は少なかったと思われる。初日には増井さんがそんな感じで質問していたけど、2日目は両PM(と私)くらいしかいなかったな。それが悪いとは言わないけれど、戸惑う。研究室のゼミもあれくらい活気があればなぁ、と思わないでもない...。
全体的にプレゼンテーションは下手。時間配分も下手。正直、おまえ練習したのか、とか思う人も(いや、人のこと言えませんが orz)。もうちょっとうまく言えば、もっと魅力を出せただろうに。もちろん、そういう経験がある人ばかりじゃないのでしょうがない。まぁ、若い人が多いし、今からうまくても気持ち悪いかもしれない。
しかし、中には嘘みたいにうまい人も居る。社会で成功する人は、きっとこういう人だと思う。プレゼンテーションの仕方を教える授業は、今後益々重要になっていくと思う。だけれど、教えられる人がそもそも少ないのかもしれないな。
全体的に「何を作ったか」のデモが大半だった。「こんなものを目指していて、こんなふうになった」という話。聞いていて楽しい。でも、「こうやって作った」という話がなくて欲求不満も。
私のテーマは、「どうやって作るか」が主なので(何を作るか、はもう決まってる - 速い Ruby)、その中では異色と言える。発表題目は、プロジェクトタイトルと同様、「Rubyプログラムを高速に実行するための処理系の開発」。
今回は3日前から作り始め、2日間徹夜して脳内練習もそれなりにしていたので、まぁそれなりに見れるものになったのではないかと思う。
デモは、プロシンでさっぱり受けなかった、アイコンを飛び回らせるデモ(フレームごとにたらいまわし関数を回すので、YARV版はとても速い)と、Win32OLE を利用した PowerPoint の自動操作を使うデモを行なった(パワーポイントにテキストをリアルタイムに差し込んでいって、自動的に何か動いてるように見える)。全然たいしたことはしていない(全部 SDL や Win32OLE に丸投げ)のだが、やはり、目に見えるデモというのはインパクトが違う。本業では、どうやってもこんなデモはできないが、よっぽど難しいことをしているので、複雑な気分ではある。
45分に50ページを喋るため、全体的に、とても早口になってしまったのが失敗である。本当は、スライドをいくらか飛ばそうと考えていたんだけれど、ちょっとうまくいかなかかった。これは、今後改善していく必要がある。まぁ、時間内にきちんと終わったのでよかった。質問が殆どなかったというのもあるのだけれど。
各論は、全部が全部覚えてるわけじゃないのでしない。
ひとつ心配なのが、よく言われていることだけれど「こんなもんでいいんだー」と思ってしまう人が居たらちょっとアレだなぁ、とか思ってしまった。いや、世の中「こんなもん」なのかもしれませんが。
なんとなく:
しかし、きちんとビジネスにつなげることを考えて、そういうことができるソフトウェアを作っているってのは凄いよな。どうにも私にはそういうことが出来ない...。
で、もちろん、私も「こんなもん」と思わないようにしなくてはいけないわけで。本当は余裕があれば eval.c の置き換えもやりたかったんだけれど、それは来年度。
というか来年度ですよ。来年度何か取れなかったら RubyConf 行けないなあ。
IORCC の準備をする。とりあえず、出来た。って、なんだ。IORCC って、すでにある汚いコードを送るのか。あるネタを汚く書くわけじゃないのね。
とりあえず、エントリーしてみた。
僕のプレゼンはだめだめでした。なにを作ったかという話ができないのでどう作ったかの話のみだったのですが、、もう少し話しようがあったんじゃないかとか。デモなんてもう最悪。かっこいいデモを作っておくべきでした。MSAgentにしゃべらすとか、パワポを動かすとかはインパクトありますね。Fixnumの件はあれから高速化ができました。WhileでもRubyより倍速く動きます。
お疲れ様です。デモはもう少し用意できるとよかったですね。筧先生も仰っていたように、.NET で Ruby というのはどれだけ何ができるか、を示すことができればよかったんじゃないかと思います。高速化については機会があれば教えてください。
Symbol.all_symbols
ガーン。
named capture というのはよく知らないのですが、
def make_tokens ary key = nil hash= {} ary.each{|e| if key hash[key] = Regexp.compile("\A(#{e})") key = nil else key = e.intern end } hash end Tokens = make_tokens %w{ IF if ELSIF elsif ELSE else ID [A-Za-z_][A-Za-z_0-9]* SPACE \s* } prog = <<EOS__ if val val1 else val2 end EOS__ def tokenize tokens, prog rest = prog.size ret = [] while rest > 0 hit = false tokens.each{|sym, pat| if pat =~ prog tok = $1 ret << [sym, tok] prog = prog[tok.size .. -1] rest = prog.size hit = true end } raise "not found for #{prog[0..10]}..." unless hit end ret end require 'pp' pp tokenize(Tokens, prog) #=> [[:IF, "if"], [:SPACE, " "], [:ID, "val"], [:SPACE, "\n "], [:ID, "val1"], [:SPACE, "\n"], [:ELSE, "else"], [:SPACE, "\n "], [:ID, "val2"], [:SPACE, "\n"], [:ID, "end"], [:SPACE, "\n"]]
みたいなのを書いていたのが、もっと簡単に(もっと高速に)書けたりしますか。
なんか誤解があるらしいけど、るびま 1月号休刊、では無いです。そもそも、月刊じゃないですから。
で、すでに今年中の発行予定はもう立ててあるんですが、なぜその長期予定を公開しないかというと、もし予定通りに行かなくなったらコッソリ変えるためです。
ローカル変数だったら f() を f.call() にする、というのは、なんか難しいような気がする。
YARV リファクタリングしないとなぁ。同じコードを複数箇所に書いているのでとてもかっこ悪い。
IPA に納品するのはどっちにすればいいんだろ。
動的プロファイリングって実はどうやってやるかイメージを持っていなかったんだけれど。いや、数えればいいってことはわかるんですが、「いつ、誰が、どうやって」というイメージが湧かなかった。
で、何が疑問だったんだというと、VM はメソッド呼び出しごとにカウンタをインクリメントしていたら、すでにプロファイルが必要ないメソッド呼び出しまでチェックしないといけないってことではなかろうか、というのが疑問だった。なら、プロファイルするべきかどうか? というチェックまで入るんだろうか。入るかもなぁ、でも、それだと分岐一個増えるよな。
とか、そんなことを考えいたんだけど、
profile counter: if ++counter > threshold compile_self() end
みたいな命令を一個挟んでおくだけでいいことに気が付いた。気付くの遅すぎ。
いや、別に insns -> native code という変換しか行なわないのなら、それぞれディスパッチ処理は違うはずで、そこでプロファイルを取るかどうか決めてもいいんだけど。insns -> insns 変換は出来ないよね。そんなことしないって?
命令統合とか、ちょっとコンパイル遅くなるかなーと思ってたんだけど、測っていない。
アルゴリズム: insns.each_with_index{|insn, i| unless tbl = UnifyTable[insn].empty? tbl.each{|u_insns| if insns.match_part(i+1, u_insns) replace end } } }
なんか意味不明になってしまった。
西山さんのおかげで named capture がわかったような気がしました。
'abc'.match(/a(b)c/) p $1
どうやら、仕様をとっても勘違いしていたようです orz
svar については、きちんと考えなければ・・・。実はまだ nokadaさんの教えてくれた話は全然理解できてなかったり。
C で実装したメソッド中で rb_backref_set() などはよく行なうけれど、そのときの ruby_scope は、その C のメソッドのものだよねぇ。多分。そこからもう間違ってるのかしらん。
間違ってた orz
NODE_CFUNC じゃ PUSH_SCOPE しないのね。
なんとなく、svar 問題解決。納品前に修正してしまおう。
全然解決してなかった orz
そういえば、俺も確定申告しないといけないんだった。うー、何時行こう。来週は厳しいんだよな。全国大会で。で、再来週は HOKKE とか。う、今週行かないと駄目か。でも、今週は今週で・・・。
そうなんですよ、5号の一番難しいのは編集後記なんですよ、とか言ってみるテスト。
というわけで、未踏ユース成果報告会だったのですが、最終日、寝坊していけませんでした orz。
最終日は キワモノ 面白そうな発表があって、楽しみにしていたんですが、うーむ。筋さんは見たかった。残念です。4次元ゲームもどうなったんだろう・・・。
もちろん、言語処理系屋さんとして、なでしこや双葉も大変楽しみにしていたんですが・・・。 うーん。残念。プレゼンだけでもなんとかしてもらえないものか。
なんか仕事が今日になってまた増えた。
YARV のダウンロード件数をちょっと調べてみる。
悲しくなる数字になってしまったので、成果報告書に書くのはやめておこう。
「なんか難しいような気がする」心理の内側を披露していただけませんか。
profileについて: instrumentationというキーワードが。
ちょっと編集しました。難しいと感じたのは、「ローカル変数だったら」と覚えるのが、意識するのが難しいのではないかと思いました。
いや、もうそれは実装済みなので。
それってどれですか?
あ、書く方の話でしたか。入れ違い失礼。
profilingには、一定時間おきに実行してる関数(メソッド)を調べるsamplingという方法もありますわ。
gprofとかは、実行時間についてはsamplingですよね。呼び出し回数はinstrumentation。
あー、雪だよ雪。
雪綺麗だなあ。
HOKKE の懇親会どうしよ。知ってる人あんまりいなさげ。
さすがに雪の中来る人はいなさげ。
終り。ふらふら。
うう、NODE_COLON2 だけでもわからない。多分、今の例外が外に逃げてしまうのもバグなんだろうなぁ。compile with defined check みたいなものが、きっと必要なんだろぅ。そこまでやるべきなのか。
for(i=0; i<N; i++){ なんか探す } if(i==N){ 見つからなかったときの処理 }
と、
for(i=0; i<N; i++){ なんか探す if(見つけた) goto found; } 見つからなかったときの処理 found:
どっちがいいんだろう。
a = 1 defined?(a.b.c) #=> yarv: nil #=> ruby: undefined method `b' for 1:Fixnum (NoMethodError)
このように作った。多分これが正しい動作ですよね?
0000 putobject_OP_INT2FIX_O_1_C__SC_xx_ax 0001 setlocal_OP_2_SC_ax_xx 0002 putobject_OP_Qtrue_SC_xx_ax 0003 if_SC_ax_xx 8 0005 putnil_SC_xx_ax 0006 jump_SC_ax_ax 27 0008 getlocal_OP_2_SC_xx_ax 0009 defined_SC_ax_ax11, :b, false 0013 if_SC_ax_xx 18 0015 putnil_SC_xx_ax 0016 jump_SC_ax_ax 27 0018 getlocal_OP_2_SC_xx_ax 0019 send_OP__WC___WC__Qfalse_0__WC__SC_ax_ax:b, 0, <ic> 0023 defined_SC_ax_ax11, :c, true 0027 end_SC_ax_ax 3
こんなふうにコンパイルされる。SC が入るとわけがわからない。
でも、なんで ruby でエラーになるのかわからんなあ。
と、思ったら、この実装ダメダメじゃん。
def m p :m self end defined?(m.m.m) #=> :m が 3回出てくる
もうちょっと考察が必要。
0000 methoddef_SC_xx_xx:m, <ISeq:m@../test.rb> 0003 putself_SC_xx_ax 0004 defined_SC_ax_ax11, :m, false 0008 if_SC_ax_xx 13 0010 putnil_SC_xx_ax 0011 jump_SC_ax_ax 40 0013 putself_SC_xx_ax 0014 send_OP__WC___WC__Qfalse_0__WC__SC_ax_ax:m, 0, <ic> 0018 defined_SC_ax_ax11, :m, false 0022 if_SC_ax_xx 27 0024 putnil_SC_xx_ax 0025 jump_SC_ax_ax 40 0027 putself_SC_xx_ax 0028 send_OP__WC___WC__Qfalse_0__WC__SC_ax_ax:m, 0, <ic> 0032 send_OP__WC___WC__Qfalse_0__WC__SC_ax_ax:m, 0, <ic> 0036 defined_SC_ax_ax11, :m, true 0040 end_SC_ax_ax 2
class C def a p :a self end def b p :b self end def c p :c self end def test defined?(a.b.c) end end C.new.test
== disasm: <ISeq:main@../test.rb>======================================= local scope table (size: 1, argc: 0) 0000 putnil_SC_xx_ax 0001 putnil_SC_ax_ab 0002 classdef_SC_ab_ax:C, <ISeq:class@../test.rb> ( 11) 0005 popcref_SC_ax_ax 0006 pop_SC_ax_xx 0007 getinlinecache_SC_xx_ax<ic>, 14 ( 31) 0010 getconstant_SC_ax_ax:C 0012 setinlinecache_SC_ax_ax7 0014 send_OP__WC___WC__Qfalse_0__WC__SC_ax_ax:new, 0, <ic> 0018 send_OP__WC___WC__Qfalse_0__WC__SC_ax_ax:test, 0, <ic> 0022 end_SC_ax_ax 2 == disasm: <ISeq:class@../test.rb>====================================== local scope table (size: 1, argc: 0) 0000 methoddef_SC_xx_xx:a, <ISeq:a@../test.rb> ( 12) 0003 methoddef_SC_xx_xx:b, <ISeq:b@../test.rb> ( 17) 0006 methoddef_SC_xx_xx:c, <ISeq:c@../test.rb> ( 22) 0009 methoddef_SC_xx_xx:test, <ISeq:test@../test.rb> ( 27) 0012 putnil_SC_xx_ax 0013 end_SC_ax_ax 2 == disasm: <ISeq:a@../test.rb>========================================== local scope table (size: 1, argc: 0) 0000 putself_SC_xx_ax ( 13) 0001 putobject_SC_ax_ab:a 0003 send_OP__WC___WC__Qfalse_0__WC__SC_ab_ax:p, 1, <ic> 0007 pop_SC_ax_xx 0008 putself_SC_xx_ax ( 14) 0009 end_SC_ax_ax 3 == disasm: <ISeq:b@../test.rb>========================================== local scope table (size: 1, argc: 0) 0000 putself_SC_xx_ax ( 18) 0001 putobject_SC_ax_ab:b 0003 send_OP__WC___WC__Qfalse_0__WC__SC_ab_ax:p, 1, <ic> 0007 pop_SC_ax_xx 0008 putself_SC_xx_ax ( 19) 0009 end_SC_ax_ax 3 == disasm: <ISeq:c@../test.rb>========================================== local scope table (size: 1, argc: 0) 0000 putself_SC_xx_ax ( 23) 0001 putobject_SC_ax_ab:c 0003 send_OP__WC___WC__Qfalse_0__WC__SC_ab_ax:p, 1, <ic> 0007 pop_SC_ax_xx 0008 putself_SC_xx_ax ( 24) 0009 end_SC_ax_ax 3 == disasm: <ISeq:test@../test.rb>======================================= local scope table (size: 1, argc: 0) 0000 putself_SC_xx_ax ( 28) 0001 defined_SC_ax_ax11, :a, false 0005 if_SC_ax_xx 10 0007 putnil_SC_xx_ax 0008 jump_SC_ax_ax 37 0010 putself_SC_xx_ax 0011 send_OP__WC___WC__Qfalse_0__WC__SC_ax_ax:a, 0, <ic> 0015 defined_SC_ax_ax11, :b, false 0019 if_SC_ax_xx 24 0021 putnil_SC_xx_ax 0022 jump_SC_ax_ax 37 0024 putself_SC_xx_ax 0025 send_OP__WC___WC__Qfalse_0__WC__SC_ax_ax:a, 0, <ic> 0029 send_OP__WC___WC__Qfalse_0__WC__SC_ax_ax:b, 0, <ic> 0033 defined_SC_ax_ax11, :c, true 0037 end_SC_ax_ax 3 -----------------------------------------------------------------------------
YARV では :a :a :b、ruby では :a :b
引数とか考え出したらやっぱり駄目な感じがするなあ。
defined?(a.b.c) #=> if defined?(a) __a = a if defined?(__a.b) __ab = __a.b if defined?(__ab.c) "method end end end
こう変換すればいい、と。
defined?(a(p1, p2).b.c) #=> if defined?(a) && defined?(p1) && defined?(p2) __a = a(p1, p2) if defined?(__a.b) __ab = __a.b if defined?(__ab.c) "method" end end end
でいいのか。さて、(ローカル変数を使わないで)コードに落とせるだろうか。
なんとかなるような気がする。ちょっと面倒。
それよりも、そのメソッド呼び出し中に例外が発生するのを気にするほうが嫌だな。
レシーバはチェックしない、とかになってくれればいいんだけど、美しくないよなぁ。
この辺は後で直すことにしよう。
SLEE に馬鹿ウケしてしまった。
defined? をいい加減に定義したので、やっと mailread.rb が読めるようになった!(弱)
正常系はいいんだけど、異常系が弱い・・・。
loop{} がうごかねー。
と思ったらパッチが足りなかった。うーん。
String#sub! で検索した結果が $1 などに入らない。なんでだろ。
杜撰な記事とか言われるとかなりへこむ。
未踏ユース成果報告会一日目終わり。今日は見てるだけ。できてるものできてないものプレゼンが上手なものダラダラしちゃったものいろいろ。
結局お客さんはほとんど居なかったね〜。まぁ、平日だしそんなもんか。明日は少しは増えるんだろうか。
というわけで、明日の発表の準備のために、研究室。昨日から寝ていない。今日は寝たい。というか、家に帰らないと。
class C def initialize a, b, c = @a = a, d = @b = b end def m p [@a, @b] end end C.new(1,2).m
こんなのはどうだろう(うぇ)。なんとなく一行で書いた気分。
6ヶ月前に賞味期限が切れたインスタント味噌汁の味噌を舐めてみたら酸っぱかった。
食べられませんでした。青木さんへの道は遠い。
しかし、酸っぱくなるんだなあ。
スラドにつなぐと「時代遅れなんだよ!」と大きな文字で言われてへこむ最近。
うが、defined?(yield) なんて知らんかった。
うぅ、やっぱり難しいな。
パワーポイント見すぎで頭がふらふらする。
ruby の JIT compiler なんて、もう何個もあるよね。
なんていう夢を見た。
真面目に「全ての式に対して defined? を定義」するには、すべての node に対して defined? チェックを入れるオプションをコンパイラにつけて、チェックにひっかかったらどっかに飛ぶ、みたいなことをすればいいんだろうか。
スコープをまたいだときどうなるんだろ。
defined?(return) って何になるんだろう。
るびま、たとえば安定した広告収入でも入れば、原稿料が払えるのになぁ...。
著者の方や編集の人に、タダでこれを続けさせるのはやっぱ酷だよ。雑誌に送れば、とおる記事だってあるだろうに。インタビューも1-2時間人を拘束するわけだし。
いくばくかあれば、プログラミングコンテストとかもできるよね。うーむ。
こんな辺境に comment spam?
拡張ライブラリをいくつか試したけど、defined? が結構あるなぁ。
しかし,地震が多い.
今回も記事数多い・・・。
いろいろと死にそう。体力的にも精神的にもつらい。
ia32 の命令の見方がわからん orz
call rel/16 と call rel/32 が両方とも E8 cw(2バイト即値) か E8 cd(4バイト即値)らしいのだけれど、どうやって両者を見分けるんだろうか。わからん。
両方とも E8 xx xx か E8 xx xx xx xx になるんだよね。多分。プロセッサのモードに因るんだろうか。
この期間はやはり無謀だったなぁ。
ちょっと弄った奴で値を振ってなにやらやるってことをすればよかった。
オペランド・サイズ属性というものらしいが。それはなんじゃ。
何かのモードかなあ。とりあえず 32 と思っていればいいのかしらん。
モードらしい。
うーん、命令後の境界さえわかればなぁ・・・。
関数呼び出しいけた。うわー、なんて原始的、場当たり的。
def m 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 end jitcompile(self, :m) i=0 while i<1000000 i+=1 m end normal YARV: 0.454000 0.000000 0.454000 ( 0.443000) JITed YARV: 0.375000 0.000000 0.375000 ( 0.398000) #=> 21% 高速化 注:ループ回してる部分は normal YARV なので、純粋な速度向上率は もうちょっと高い。でも、30-40% くらい。目標の5倍速化には程遠いね
まぁ、そうだよな。結局削ったのは次の命令へのジャンプしかないわけで。オペランドのフェッチはやってません。つまり、operand_x = insns[pc+x] のままってことで。
で、要するにメソッドコールなんて粗粒度な命令をやると、この効果は消し飛ぶな、きっと。やれやれ。
本当は、基本ブロック追って、どうのこうのやらなきゃいけないんだろうけど、とりあえずこれはここまで。また今度のお楽しみ。
しかし、オペランドの扱いどうすればいいのかなぁ。
JIT コンパイルで根本的に高速にするには、IBMさんみたいにしないと駄目なような気がするけれど、はてさて。shuJIT のようにうまくいくでしょうか。
とにかく気合でアセンブラ書いたほうが速いような気がしなくもない。でも、400命令書く気力は無い。
YARV 命令オペランドをマシンコードに埋め込む工夫。うーむ。mov 使ってるところをてきとーに書き換えてしまえばいいのか。いいのか?
早稲田大学国際会議場 第3会議室ってどんなところ?
Rubyist Magazine 0005をリリースしました。
お楽しみ下さい。
宣伝ヨロシク>各位
しかし、どっか日記以外で宣伝できるところはないだろうか。
ちなみに、今回のインタビュー、俺が馬鹿に見えるという。
いや、いつもか。
AOT compiler でメソッド呼び出しも可能にしてみた。
def compiled n if n < 2 1 else compiled(n-1) + compiled(n-2) end end ruby 9.640000 0.078000 9.718000 ( 10.023000) yarv 1.203000 0.047000 1.250000 ( 1.274000) 8.0倍 aotc 0.891000 0.062000 0.953000 ( 1.005000) 10.8倍
目標の10倍にはなっているわけですが。
全然 aot で速くなってませんから! ざ(略)
要するに、メソッド呼び出しがなんら高速化されていないわけです。というわけで、今後はこの辺をきちんと高速化していかなきゃいけないわけですが、その前に未実装部分をなんとかしろって話な気もする。
operand-size attribute: Vol.1 Basic Architecture, Section 3.6
e8 00 00 00 00 call XXXXXXXX 66 e8 00 00 callw XXXX
どっちがお得(速さ&スペース)なんでしょう。
それをみて確認してました。日本語でしたが。
増井さんのインタビュー、面白かったです。 編集は大変そうだけど、インタビューアとしていろんな人と知り合えたり、役得も大きいですねー
ありがとうございます。編集は私自身はやってなかったりして・・・。いろんな人の話を聞けるのが一番楽しいですね(これがなかったら、るびまをやってない)
ふぅ、寒いですね。
頭が悪い。JIT compile するなら、operand は全部マシンコードの即値に(アーキテクチャによっては)入れられるじゃん。でも、それをしだすと死ぬほど面倒くさいな。はてさて、どうしたもんだか。とりあえずコードコピーで頑張るか。
うは、constant pool 恐るべし。
というわけで、動的コード(機械語)生成にチャレンジ中なのですが、cygwin gdb 上では動くのに gdb なしで動かそうとすると動かない。なぜだ。
core 吐いてくれないし。俺の使い方が悪いんだろうか。
mmap で PROT_EXEC にしてるんだけどなぁ。
gdb のために __asm__ __volatile__ ("int $03"); していたからだった orz
(int $03 のテクニック自体は西山さんに教わりました。感謝します)
で、mmap なしでも動いてる罠。やっぱり cygwin だからか。mmap object 作るの面倒くさいな。
で、できたのは一番単純な1命令のコピーだけ。先は長い。
core の吐かせ方は CYGWIN=error_start=dumper と教えてあげるらしい。
code の切り出しで、どうにも「どこまで切り出すか」がわからない。
Astart: ... goto *insns; Aend: error();
のようにすると、
Astart: ... Bstart: 他の命令 ... Aend: error(); Bend: error(); ... 他の命令
のようにコンパイルされる。まぁ、そりゃそうだとは思うけど、じゃぁどうしよふ。困ったな。jmp 命令にラベルを貼ればいいのか。
しかし、こんなときに限ってやらなきゃいけないことが増えて、気ばかりがあせる。
jmp 命令の前にラベルをつけて(それを保存したら)jmp 部分だけ基本ブロックになってしまい、またばらばらになってしまった。なんてこった。連続しろよ。なんかオプションでもあるのかなぁ。
-freorder-blocks
がそれっぽいなと思って外しても変わらず。うーん。
C レベルで書くから駄目で、アセンブラレベルで書けば見逃してくれるだろうか。駄目かなー。
なんとか 2 命令成功。ヨワ。
うへ、関数呼び出しが鬼門だったか orz
るびまに寄付/謝礼をしてもいいと思いますか? を見ると,77730円くらいは集まりそうだということがわかった.捕らぬなんとか.
今後も、アーキテクチャ依存コードの誘惑が待っていると思いますが、強い心ではねのけて、がんばってください。
論文ネタにならないような苦労が山のようにあって、楽しい(?)よねー>関数呼び出し(の解決)。 shuJITは、あるメソッドをコンパイルする際、こういう処理をしてます:
makePCTable() makeBlockStructure() peepholeOptimization() methodInlining() eagerCompilation() updateStates() writeCode() resolveJumpInstructions() resolveExcRetSwitch() writeCompiledCode() resolveDynamicConstants() makeExcTable() resolveFunctionSymbols()
少し書き換えさせていただきました.resolveFunctionSymbols が参照する情報ってどこにあるんですか?(symbol -> addr の対) それとも,ここで解決するのは自分で jit compile したものだけでしょうか.
JITコンパイラ自体をコンパイルする際に、関数のアドレスと、そのアドレス(への相対アドレス)を埋め込む位置の対応表↓を作っておきます。 埋め込む位置は、コンパイル済みネイティブコードテンプレート(code.o)を逆アセンブルした結果を(Rubyスクリプトgentable.rbで)パースして算出します。
/* func_table[opcode][state][] */ FuncTable func_table[][5][2] = { ... { /* 115 */ {{-1, 0}}, {{-1, 0}}, {{7, (char *)fmod}, {-1, 0}}, {{-1, 0}}, {{7, (char *)fmod}, {-1, 0}} }, ...
115はJVMのdrem(倍精度の剰余算)命令だから、fmod(3)を呼んでいる、と。 ただしこの方法だと、dlopen(3)の第2引数(RTLD_ほげほげ)やOS(ダイナミックリンカ)やタイミングに依存して、シンボルが未解決だったりすることもある点が要注意です。 なんとかアセンブラを用意せずにJITコンパイラを作ろうと(僕が)苦心している様がうかがえます。 アセンブラは知らないですが、逆アセンブラはgdbのソースから簡単にパクってくることができるそうです(たなかけいしろうさん情報)。
RHG 読書会をお借りして、YARV についてのご意見を頂く。
発表については、いろんなご意見を頂いた(主に見せ方)。大変ありがたい。
しかし、内部実装については、やはりあまり興味をもたれなかった様子。まぁ、そんなもんか。VM がどうやって動いているか、ということに興味を持つのは極少数ということなのかなぁ。
RHG読書会の参加者でこれなのだから、ふつーのプログラマは推して知るべしか。
なぜ Ruby の VM はこれまで進んでこなかったのか、わかる気がする。しかし、なんで人気ないのかなぁ。上(アプリ側)を作るほうが魅力的だ、というのはわかるんだけど、下(システム側)も面白いのに。面白いと思う人が少ないのか。
るびまに YARV の技術記事を書こうかとか考えていたのだけれど、あまり意味が無さそうだなぁ。
RHG がなんであんなに面白いかというと、Ruby の構造、という建前はあるものの、ほかにもたくさんのトピックが詰まっているからだし。
万物理論読了。
次はぜひソフトウェア特許で。
次に読むものがないのだけれど、何かオススメはありますか。星界まだ読んでないな、そういえば。
RHGな人が興味を持っていないわけじゃなくて、私が興味を持たせるような話ができなかっただけな気もします。
そういえば、内部構造についてのスライドに関しては興味深く聞いてくれた気がします。ソースコードまで話がいかなかっただけで。
僕は読んでみたいです。<るびまにYARV記事
なんででしょうね>VM。 ひとつには、上物は高原の散策みたいに手軽に景色を楽しめる道がたくさんあるのに、VMは一本道の嶮しい山道みたいに下から地道に登ってかないと面白さがわからない、ということがあるかも。GCなんかもその領域かなあ。
RHGの参加者もか。本当かなぁ。実は1.先にやられて口惜しいからあえて興味なさそうに振舞う、2.自分のほうがうまくやれると思っているから興味ない、3.その他とかだったり。それはそれとしてYARV記事は書く時間を取って頂けるのであれば是非読みたいです。
星界いいですよ。特に紋章のほうは。shiroさんの言うとおり、VMやGCは「最終的にどうなったか」だけじゃなく、入門から始めて「ここまででこれだけ速くなる」「次に、こういう工夫をするとこれだけ速くなる」とかやっていかないと、面白さが分かってもらえないかも。というか、「速くなる」に興味を持つ人が少ないとか?
興味はあるけど基礎知識がなくオツムがついていかない->言うべき事がない。だけなので是非書いてくださいませ。参考URLいっぱいにして。
あ、まだ読んでないのは星界の戦旗(4)です。私は速くなる、以外にも、「どうやって動くのか」自体が興味の対象でした(だから、それをあそこまでブレークダウンした RHG は凄い)。
だってソースコード(の説明)はスライドに書いてなかったんだもーん<おい やっぱり、自力で読んでわかる部分は尋ねるまでもないし、わからない部分はどこからどう尋ねればいいかもわからない、という感じです。なので、わかりやすい説明があればぜひ読みたいし、なければそれ以上はどうにもこうにも、というところです。
そう言えば例のtest & setの時みたいな書き方をしていただければ最高だと思います。>YARV記事。maedaさんのサジェスチョンにプラスして、「どういう工夫をすると速くなるだろうか? こういう方法だとこういう問題があるはずだけど別の方法だとこうだから……」みたいな試行錯誤の経緯とか。
さすがにスライドでソースコードを出すのは・・・。MLに書いていたようにソースコードレビューにしたかたんですが、なかなかそうはなりませんでしたから。
とりあえず「SFが読みたい!2005」を読む、というのはどうでしょう。個人的には桜庭一樹「砂糖菓子の弾丸は撃ちぬけない」が素晴らしかったですが、ささださんに必要な本ではないでしょうねえ。
それはわかりますが、スライドとはいかずとも、レジュメなり副読本?なりがないと辛いす>ソースコードレビュー というわけで、頑張ってYARV Hacking Guideを書いてくださいませ。
私もYHG希望
結婚式場を作りたいわけじゃないのか。(と思った人多数いるに違いない)
命令統合を考え出したら、思ったよりずっと難しいことに気付く。
switch(insn){ A: ... l: ... B: ... goto l; ... C: ... }
のとき、A B とするのはどうするか? B A とするのはどうするか? B C は、C B は(問題はこっちだけか)? 答えは goto なんて使うな、だったりして。どうしようかな。
命令をまたぐ goto はやっぱ駄目かな。いろいろと作り変えないと・・・。
とりあえず、簡単なのだけ対応させよう。
素直に goto 諦めて関数化するかなぁ。きっとそれが綺麗なんだろうけど。かなりリファクタリングしないといけなさそう。
i = 0 while i<10000000 i+=1 100 * 200 # この部分について、 # putobject 100 # putobject 200 # を # putobject_putobject 100 200 という命令に融合 end #=> 素ruby :10.469000 0.000000 10.469000 ( 10.465000) 融合なし: 2.094000 0.000000 2.094000 ( 2.106000) 融合あり: 1.875000 0.000000 1.875000 ( 1.871000) 11% 高速化
思ったより速くならない。というわけで、この辺よりも、もっと別のことをしよう。
やっぱり method_missing は必須かなあ。
椅子の足がもうダメポ。新しいの欲しいなぁ。
SPA2005 行きたいにゃー、と思っていたら、3/7-9 って、もろ HOKKE2005 にぶつけてるじゃん! 残念。
もし multi vm ができたとき、exit, exit! ってどうなるんだろ。
yarv はもっと手に入りやすい形で配布出来たらなぁ、と思うのだけれど、思いつかない。どうしたもんかな。cvs からとってきても、configure とかいろいろ面倒そうだし。
できた。
i=0 __label__(:start) __goto__(:label) p "skipped" __label__(:label) p "end" __goto__(:start) if (i+=1) < 3
うーん、くだらない。
talking like yoda, are we?
とか言われた。意識してるつもりなんだけどなー。
ディスプレイがぼやけちゃってる。どうしたもんだろう。買いなおすかなあ。T565 は B3 のときに買ったような気がするので4年目か。まだ持ちそうだよな。
げ、NANAO ってもう CRT ディスプレイ売ってないんだ。うわー。
うーん、この際液晶買うかなあ。液晶ってあんまり信用してないのよね。
価格もこなれてきているようだから、19インチ買ってしまおうか。でも、デジタル出力が一個しかないんだよな、今のビデオカード。もう一枚買ってくるのも馬鹿らしい。
コネクタを弄ったらなんとなく綺麗になった気がするので、当分これでいいか。
うーん、ライブドア、どういうところから金を搾り取ってるんだろう。
Java Computing 2005 Spring どうしようかな.無料なんだよね.
さすがに,Java の VM の話は無いんだろうなあ.悩む.
誰か行く人居ますか?
6万6千6百3十円+7体+2パーツ・
ruby -rite -e "..."
を救えないか悩む.救えないっぽい(-e で与えたプログラムを ite.rb から取得する方法がない).
ruby-list で聞いてみようか悩んだが,やっぱり無理そうなのでやめとこう.
とりあえず wiki ばなも参加申し込みしてみた.高橋さんの名前もあったのでこの日に RHG をやることは無いだろう.
車輪の再発明を写真の再発明と書いてしまったことがある人の数>1
coLinux とか SELinux とかよくわからなかった人の数>1
某社の件、ありがちな話で『○株を取得...総額で約700億円...2月8日に決議した「2010年満期ユーロ円建の転換社債型新株予約権付社債」の発行により調達する800億円から大半を充てる』
Java Computing 2005 Spring は行きますよ。
いや,結局どこかから搾り取ってるんだろうなあとは思うので,その元というか.
申し込むだけ申し込んでおいたら?>JC2005 しかしやっぱり、需要を反映して、セッションは9割がたアプリケーションサーバ以上のレイヤについて。
とりあえず申し込んでみました.
人数をリダイレクト?それとも複数?
よく寝た。
しばらく家に引きこもっていようと思ったら、明日あさっては学校に行かなきゃいけないらしい。晴れたらいいなぁ。
論文が読みたい。
profiler は vtune でいいかなぁ、とか思ってたんだけど、VM ベースのものもやっぱり要るかなぁ。命令レベル、メソッドレベル、うーん。
EEからの類推では、L1/L2キャッシュはPPEのみ、SPEのLocal Store{間|へ|から}の転送はDMA、制御と同期はDMAタグと制御レジスタ、かなぁ。 PS2みたいに自分で(アプリケーションプログラマが)ハードべったりの制御コードを書かないとならないのはさすがにしんどいから、何かリソースを抽象化する層が提供されるんではないかと思うけど。Local Storeの容量を気にしながらコードを書かないとならないとしたら辛そう。
ゲーム用っていうふうに言って、これは3D のためですよ、というのなら話は非常に簡単なんですが。いや、やっぱりそうなのかなぁ。いや、要するに用途をかなり限定した売込みをするのかな、と。
一般向けには、SPEを使いまくるものは全部ライブラリにパッケージ化されて(所謂マルチメディア系とか)提供され、普通のアプリからはSPEを意識しない感じになるんじゃないかなぁ。コンパイラが並列性を検出してSPEをばりばり使うようなコードを吐いてくれる、っていうのはこういうヘテロな構成だと難しそうだし。
現在 3万円 +α.
php について,
its like frankenstein
だって.笑った.
Ten Things a Java Programmer Should Know About Ruby (send suggestions to jim@weirichhouse.org)
Boolean methods end in ?. Dangerous methods end in !
危険なメソッドってなんだ.
そういえば,FileUtils.rm
は FileUtils.rm!
じゃない.
そんなこと言えば,write 系は全部危険ぽいけど,write! じゃない.
でも,p! だったら良かったなとか思わなくも無い(p という変数が使えるようになる).
おお,現在 5万円 +α.
ハウルの動く城を見てきた.新宿の伊勢丹がどこにあるかわからなくて焦った.
面白かった.わかりやすくていいんじゃないんでしょうか.絵に描いたようなハッピーエンドだし.
シルバーなセミロング萌え.
そういえば、さすがに映画館はガラガラだった。一列に2人とかそんなの。さすがにこの時期だとそうなのかな。
さて,HOKKE なので北海道なんだが,北海道どうしよう.少し遊ぶか,すぐ帰るか.3月だから,そんなに忙しいわけでもないと思うが,とくに遊ぶあてもないんだよな.札幌でまったりするのも東京でまったりするのもそんなに変わんないだろうし.
一人でスキーするのもアレだ.
ruby なイベント in 北海道なんてないだろうか.ついでに北海道の rubyist にインタビュー,でもいいんだが,心当たりは無い(無知なため).
温泉があれば行きたいが,札幌あたりにはなさげ.
Solaris 10 は Dual Xeon でもやっぱり速いのかなぁ.ちょっと試してみたい気がしなくもない.
SHOUTcast + nsvcap で USB カメラの動画ライブ配信.
問題点.
多分,設定すればなんとかなるんじゃないかと思うんだけど,それらしい設定方法が見つからない.どなかた知ってる方はいらっしゃいませんか.
本当は ffmpeg + ffserver でいけるかなと思ったんだけど,ffmpeg に windows 上の USBカメラからの映像取り込みが出来なくて挫折.
何か方法は無いものか.いいソフト知ってる人居ませんか.
ffserver に流し込む方法を知ることができればいいんだろうけどなぁ.どこにもプロトコルが書いてない.
USB カメラ -> jpeg に落として,そいつを ffmpeg の -img として送ってやればいいんだろうか.ファイルが変更しても,追随してくれるんだろうか.
もういろいろとぐったり。がっかり。しょんぼり。
ko1さん見つけた! 就職先かぁ、もう少し先ですよね。 それまでに目処が立っていたら、うちにお誘いしても良いですか?
ワーイ.
そうそう SECrA(公開はもう少し先ですが) の「未踏な仲間たち」にリンク張らせて頂きました。 事後承諾ということで...(笑顔)
しょんぼりして可愛いといわれるのはせいぜいハタチまで
男がしょんぼりしても二十歳以下でも可愛いとは思えないけどなあ。
あと三日。
あと15日。半月。
セキュアなプログラミング言語って、どんなんだろうな。初期状態は、何も出来ないくらい制限がきつい。オブジェクトの生成もできない OOP。
SomeClass.new #=> Error: Create instance is not permitted (SecurityError)
で、その制限を外す permit hoge という構文があったとして。
で、FAQ に 〜 の制限をはずには permit 〜 と書きます。が列挙される。
で、require (import でも #include でもなんでもいいが)みたいな機能があって、ライブラリとして全部許すようなものが出回る。
で、すべてのその言語のスクリプトには
permit require require 'permitall' ...
で開始して、入門書には「これはお呪いです」と書かれる。
import *
でもいいんだけど。
permit なんてものを作ったらセキュリティの意味がない。ので、管理者によって、外部の設定ファイルによって規定されるようにする。
で、結局管理者はプログラマの要望にいちいちこたえてられないので全部許す設定ファイルが出回る。
結局、厳しいだけじゃ駄目なのよねえ。
一個設定を許可するためには書類を10枚くらい書かなければならないようにすればいいんだろうか。
permit 文の前には n 行のコメントが必要です。また、その中に管理者が許可したことを示す電子署名が必要になります。
・・・署名でいいんだろうか。
グローバル変数を利用するためには、n 行のコメントを付記しなければなりません。また、どこで代入操作を行なっているか列挙する必要があります。ここで記述した場所以外でのこの変数への代入を行なうとエラーになります。
# use global variable ($hoge) # t.rb:5 # t.rb:... $hoge = 1 ...
ちょっと改行入れただけで動かなくなるプログラム。
この Java コンパイラは JavaDoc を書かないとコンパイルできません。ドキュメントには(以下略)
コメント必須な言語ってあるんだろうか。でも、それってコメントって言わないような気もする。
また、コメントの正当性の検査ってできるんだろうか。
#=>
のほうがカッコイイと主張.
家帰りたいなあ.
参加申し込みが必要だそうなので注意.
最終講義のみでは会費不要.
セカイ系という言葉を知る.
ruby の組み込みの話はぜひやってみたいテーマのひとつではあるんだけれど,論文は書けそうにないな.
多分,後者二つは ruby の仕様からなんか変えないと駄目だろうけれど.
Proc をサポートしないで,文字列リテラルは freeze すれば,随分と小さくなるんじゃなかろうか.そんなに簡単じゃないかな.あ,あとスレッドか(そんな ruby は使いたくない,といわれそうだな).
パーサは,もうちょっと制限をきつくするとか,プリコンパイルをサポートするとかで,ちっちゃくならんだろうか.
・・・YARV もやっぱり byte code で動くようにしないと駄目なような気がするな.でも,その対処はカナーリ簡単.コンパイラの一部と,VM生成プログラムの変更だけでいいような気がする.コード量は 1/4 くらいに圧縮できるだろう.(まんま JVM じゃん)
海外の特許で日本に申請していないのをぱくって日本で申請すれば,日本国内ではライセンス料が取れたりするんだろうか?(その逆も) そんな非倫理的なことはきっと駄目なんだろうと思うんだけど,じゃぁどうやって回避するんだろう?
妄想.
# VM の生成 VM.new # VM の高速生成 # vm_create_fast.rb class VM Mint_VM = VM.new class initialize Mint_VM.dup end end # ruby process の高速起動 C{ rb_load_mint_vm_image(...); }
アーキテクチャ研究会報告誌の原稿を書いてるんですが,Ruby で擬似コード書いたらわからん,といわれた.さすがにプロセッサの挙動を ruby でというのは無理があったか.可読性が高いと思っているのは,俺が ruby に最適化されているだけか.いや,def と hoge? 以外はそうでもないと思うんだがなあ.
かずひこさんにつながらないので諦め。やっぱり、無理にでもお邪魔したほうがよかったな。就職活動しに。
ruby2 は動かないプログラムがどかどかと出てきそうな予感.
いいなぁ食事会.
新宿なら顔出せるかなあ.
うぁ,ruby-talk で言われてしまった.
さて,ruby で goto を実装するのは可能か.うーん,難しいような気がする.頑張ればできるのかなぁ.とりあえず,そのラベルがあるところまで,例外と同様に戻って,で,ジャンプすればいいのかな.でも,ensure 節はどうなる? 実行するような気がするなあ.まぁ,やってやれないことはなさげ.
yarv でこっそり入れてみようかしらん.文法はどうなるんだろう.
... __label__(:label1) ... __goto__(:label1) # 前方参照 ... __goto__(:label2) # 後方参照 ... __label__(:label2) ...
__label__ とか __goto__ なんてメソッドを使っているソースはステ.とりあえず,スコープを跨ぐジャンプは不可.たとえば,rescue/ensure 節とか,ブロックの中から外へ(その逆も)とか.
ruby の文法で __xxx__ なメソッドは定義禁止,とかやってくれないかなぁ.C みたいに処理系予約,みたいな.
__goto__ :l 10.times{|i| __label__ :l }
なんてのは,どういう挙動が望まれるものなんだろう.
今回もインタビューのテープ起こしを中村(う)さんにお願いしているわけですが(いつもどうもありがとうございます),今回のもすげー楽しいですよ.私も読んでて楽しかった(もう覚えてないから).増井さんファンなら必読.お楽しみに.
一番簡単なのは,こんなののような気がする.
parse_and_eval_hsp_source %q{ ;スクリプトに旗を立てよう *hata1 cls goto *hata3 *hata2 mes "はーい、こんにちは" *hata3 mes "旗を立ててみるテストです" stop }
継続がもうあるのだから、後方参照以外のgotoは継続で説明可能なように(できれば単なるsyntax sugarとして実装)しておくのがセマンティクス的に綺麗なのでは。
その後方参照が〜.
前方参照/後方参照という言葉の意味が普通と逆かなと思いますが…(forward referenceと言うと、上から見ていったときにreferrerがまず出てきて、読み「進む」とreferentが出てくるものを言いんでは?)まあそれはそれとして。
こんなのは?
i = 0 tagbody label(:loop) if i >= 10 then goto(:end_label) end p i i = i + 1 goto(:loop) label(:end_label) p "That's all" end
labelはtagbodyのトップレベルにしか書けない、単なる構文上のマーカーで、上はこんな風に展開される。
i = 0 label = :start until label == :exit do label = catch (:tag) { case label when :start, :loop if i >= 10 then throw :tag, :end_label end p i i = i + 1 throw :tag, :loop when :end_label p "That's all" end :exit } end
ただし、:start, :exit, :tag はユニークな名前。
ruby-talk で callcc 使ってそれっぽいのを作ったってのが前に出てた気がする。細かい話はともかくってやつだけど。
一応貼っておきます。既知でしたら失礼。ruby-goto
if true if true if true end end end
うーん,valid なのか.
インターネットというところは怖いところで,すぐに就職についてオファーがありました.でも,時給30円は嫌です.
何をしたいのかわからん,と言われましたので興味のあることを書いてみましたが,本当は楽やいい思いがしたいです.
中田育男先生の最終講義ということで,行くかー,と思ったら一万円取るのか・・・.場所が場所だからなぁ.悩む.
どうやら講義だけは無料っぽい.行こう.こういうとき,やっぱり東京はいいなぁ.
(ところで中田先生は何回最終講義をしてるんだろう)
mixi 便利だ。
MSNメッセ、起動時の広告ウインドウは消せますよ。互換メッセンジャーとか使えば広告入りませんし。
実は見かけほどできない、っていうのもこの世はよくあるような…。