2008-02-01から1ヶ月間の記事一覧

defmacroの検討その2

よく考えるとマクロの引数は評価しちゃいけなかったんだ。 defmacro :foo {|x| "print \'foo -> #{x}\'"} で foo(1 + 1) は print '2'ではなく、print '1+1'にしないといけなかった。これを実現するには、 Rubyインタープリタから抽象構文木(AST)を得るよう…

defmacroをrubyで実現するメモ

defmacroをrubyで実現できそうなので、メモを書いておきます。3行書いてこんがらがってきたのでプログラムはまだです。この日記を元に、時間があるときにrubyに落としたいと思います。 構文はdefmacro :foo {|arg| .... }でfoo(arg)とすると、ブロックを評価…

バイトコード最適化プログラムの調査(その1)

前に書いた(http://d.hatena.ne.jp/miura1729/20080217/1203242232)バイトコードの最適化プログラムの為の調査をやってみました。 フィボナッチ級数のバイトコードを出力して、それを手で最適化するという方法で行いました。 def fib(n) if n < 2 then 1 els…

Ruby 1.9.0でインクリメント演算子もどきを実装

Rubinius で、Ruby にインクリメント演算子モドキを実装 - sumim’s smalltalking-tos (http://d.hatena.ne.jp/sumim/20080214)を読んで、Rubinusいいなー、うらやましいなーと思いました。でも、私の環境はCygwinなんでまだ実行できないので残念です。 Squea…

プロファイラの速度向上チャレンジと挫折

プロファイラの速度向上のため、メソッドコールのたびに呼ばれるhandle_call/ handle_returnをハンドコンパイルしてインライン化してみようと思いました。 def handle_call(obj) now = Process.times[0] @@objstk.push obj @@stack.push [now, 0.0] end def …

Ruby1.9.0のバイトコードをいじり倒す(その9)

「まつもと直伝 プログラミングのオキテ 第18回 プログラムを高速化する(その2)」(http://itpro.nikkeibp.co.jp/article/COLUMN/20080125/292086/?P=3&ST=lin-os)を読んでいて、バイトコードパッチを使ってプロファイラを作るとどれくらいパフォーマンスが…

逆ポーランド記法以外のForthの話

なんか最近Forthが注目されてきているような気がするので、Forthについて書きます。はじめにForthとの出会いについて書いて、その後CREATE・DOES>について書きます。昔々、高校に入学したということでFM-NEW7を買ってもらいました。F-BASICをしばらく使って…

逆ポーランド記法の関数型言語

MatzさんのArcの解説を読んでいてなぜか、逆ポーランド記法の関数型言語が思いついたので、メモ。 記法はすべて逆ポーランド 命令はリテラルか関数、または制御構造や特殊形式 リテラルは無条件にスタックに積む 関数はスタック1要素を消費し、新たな関数を…