全くコンピュータの知らない人にTracing JITコンパイラを説明する試み (その1)

少し忙しいのですが、なんとなく全くコンピュータのことを知らない人にTracing JITを説明する文章が書きたくなったので、書いてみます。うまくいくかなー私はTracing JITコンパイラを書いているわけですが、インターネット上ではなくリアルで会う人にJITコン…

君たちの愛したmruby-profilerは復活した(その3)

では、どうやってIREP構造体とprof_irep構造体を結びつけたのでしょうか?この説明の前にIREP構造体とは何かを思い出してみましょう。IREP構造体はVMの命令の一塊をVMが扱いやすいように補助的な情報とともにまとめたものでした。IREP構造体はメソッドとかブ…

君たちの愛したmruby-profilerは復活した(その2)

昨日の続きで、irepメンバーとIREP構造体中のirepメンバーのインデックスがなぜ必要だったのかを説明します。 プロファイル情報はどこにあるの? プロファイラはかかった時間とか実行回数を(メソッド、行、命令)レベル(Profilerによる)で数えて後から分かりや…

君たちの愛したmruby-profilerは復活した(その1)

お盆休みの一部を利用して、mruby-prpfiler(https://github.com/miura1729/mruby-profiler)を復活させました。 mruby-profilerって何? mruby-profilerはVMの命令ごとに実行時間を数えていて、rubyのソースコードやVMの命令レベルで実行時間を表示してくれる…

水道屋の僕が無人島に持っていきたい本

@matsumotoryさんの面白い記事 「インフラエンジニアの僕がキーボードのすぐ隣に置いておきたい本」 http://blog.matsumoto-r.jp/?p=4279 をぱくって記事を書いてみました。手元に置いておきたいが、置いているわけじゃない5冊 Common Lisp 第二版 (http://w…

mruby-mmmの紹介

追記 Matzさんのアドバイス(https://twitter.com/yukihiro_matz/status/470578371789746176)でinclude MMMI, extend MMMCという煩雑なインタフェースはinclude MMMと簡単になりました。ありがとうございます。本文 mrubyを使っていて、明らかに使わないと分…

あなとみー おぶ mrubyのJIT (その13)

お久しぶりです。ずいぶんと更新をさぼっていたのですが、ときどきバグるけどmrubyのJITは元気です。さて、この半年、mrubyのJITもいろいろいじっていたのですが、多くの変更が 力技 | 黒魔術 って感じでエレガントな記事を望む皆様にはふさわしくないような…

あなとみー おぶ mrubyのJIT (その12)

今回はオブジェクト作成のメソッドnewのインライン化のお話です。newのインライン化はそれほど規模が大きくないのですが、mrubyのJITの大きな転換点になっています。前回取り組んだytljitがRubyの型推論(ブロックや要素ごとに違う型が格納できる配列などを含…

あなとみー おぶ mrubyのJIT (その11)

とってもお久しぶりです。ずいぶん間が空いてしまいましたが、新たな機能のプリミティブのインライン化が実装できたので再開したいと思います。あなとみー おぶ mrubyのJIT の開始当時オリジナルmrubyの数割速いとか遅くなるとか言っていましたが、現在大体…

luajitの実力

追記 LuaJITの作者Mike Pall氏より、twitterで次のようなアドバイスをいただきました。 1. No compiler is allowed to make this optimization. Floating-point arithmetic ist NOT associative. 2. Please use 'local' functions when publishing Lua bench…

あなとみー おぶ mrubyのJIT (その10)

お久しぶりです。ここんとこしばらくProcオブジェクトのサポートを作りこんでました。これが無いとイテレータとかみんなVMに戻ってしまって性能が上がらないのです。実はProcオブジェクトをサポートしてもあまり性能が上がらなかったのですが…。 で、この作…

あなとみー おぶ mrubyのJIT (その9)

今回からmrubyのJITで実際にどういうX86のコードを生成するのか説明する予定なのですが、その前に大変素晴らしいXbyakの宣伝とともにmrubyのJITで共通して使っているテクニックを紹介したいと思います。 Xbyakは光成滋生氏によって開発されたx86(IA32), x64(…

あなとみー おぶ mrubyのJIT (その8)

かなり間が空いちゃいました。その間にmrubyのJITをコーティングしたりお祭りの資料を作ったりしていました。結構内容が変わって、例えばこれまで説明していたものがjit.cからvm.cに移ったりしています。そんなこんなで結構速度が上がって(多くがwannabe53さ…

あなとみー おぶ mrubyのJIT (その7)

祝その7、前回(ytljitの型推論)も前々回(yarv2llvm)も第6回くらいで挫折したんだよな。まああいつらよりは説明しやすいのですが。そういうことで、無事にかは知らんけど拡張asmを超えて続きを説明します。ちなみに、今やっているのはjit.cのmrbjit_dispatch…

あなとみー おぶ mrubyのJIT (その6)

かなり間があいちゃったけど、予告通りgccの拡張asmをつかったネイティブコードの呼び出し部分の説明を行います。gccの拡張asmはインラインアセンブラのくせに最適化して書いたコードのようにアセンブラを生成してくれないことがあるばかりか、変数が割り当…

あなとみー おぶ mrubyのJIT(その5)

いよいよここまで来たか。ということで、今回はjit.cの中でも中心となる、mrbjit_dispatchの説明をします。大まかな動きについては大体説明したと思いますので、プログラムを細かく見ていきます。 void * mrbjit_dispatch(mrb_state *mrb, mrbjit_vmstatus *…

あなとみー おぶ mrubyのJIT(その4)

今回は前回の予告通りstatusとは何かからです。何度もmrubyには処理系の状態がmrb_state構造体でまとまっていていいよという話をしていますが、実はmrb_state構造体に入っている状態だけがすべてではないのです。mrb_stateに入っていない状態は何かというとm…

あなとみー おぶ mrubyのJIT (その3)

今回からプログラムの説明です。今回はmrubyのVMの命令実行部分、vm.cのmrb_runにどうパッチを当てているかを見てみます。mrb_runは大まかに言ってこんな感じになってます。 初期化 命令取出し 取出した命令に当たる処理にジャンプ 命令の実行 2に戻る 3のジ…

あなとみー おぶ mrubyのJIT (その2)

前回の1.10001・・・は最初に証明された超越数の10倍でした。 私が積読してあることで名高い「人月の神話」には、つぎのようなくだりがあります。 私にフローチャートを見せられて、テーブルを見せないとしたら、私はずっと煙に巻かれたままになるだろう。逆…

あなとみー おぶ mrubyのJIT (その1.100010・・・)

謝辞を忘れていました。mrubyのJITはXbyak(http://homepage1.nifty.com/herumi/soft/xbyak.html)を使わせてもらっています。今まで、C言語の生成、LLVM、Rubyで書いた自作アセンブラなどでコンパイラを使っていましたが、Xbyakは一番使いやすいです。 某出版…

あなとみー おぶ mrubyのJIT (その1)

ふと思い立ってものすごく影の薄いmrubyのJITの内部構造を説明することにしました。mrubyのJITは正式名称がないというとてもかわいそうなmrubyのフォークですが、オリジナルのmrubyの1〜3割(倍じゃないのに注意)速いようです。ここにあります、 https://gith…

GC撲滅への道 - GC Advent Calendar

Garbage Collection Advent Calendarの5日目の記事です。 私はGCが嫌いです。GCは幼稚で礼儀知らずで気分屋で 甘やかすといつまでも動き、ほったらかすとセグフォする。そんなGCのために、私達人間は何もする必要はありませんよ ♪ ということで、GC撲滅の1方…

ObjectSpace.reachable_objects_from()の活用の続き - GC Advent Calendar

Garbage Collection Advent Calendarの3日目の記事です。2日目の@nari3さんの記事を読んで、これまだ続きが書けるよとtwitterでつぶやいたら書くことになってしまいました。口は災いの元。さて、@nari3さんの記事ですが面白いですね。メモリリークしたところ…

ytljitの型推論の説明(その6)

なんだかんだで、2か月以上さぼってました。その6です。 今回はsame_typeの実装の話です。 same_typeはdstというノードがdsigというシグネチャでノードが存在するメソッドやブロックを実行している時、srcというノードのssigというシグネチャでの型と同じに…

ytljitの型推論の説明(その5)

今回は、collect_candidate_typeの説明です。candidateとは候補とかそういった意味です。つまり、そのノードの型になる候補(複数かもしれないし0かもしれない)を収集します。前回説明したとおり、この候補から型を選び出すのが、decide_type_onceです。colle…

ytljitの型推論の説明(その4)

ytljitでao benchが動いたらruby-listにアナウンスするんだ!と決めているのですが、なかなか動かなくて苦労しています。さて、型推論の説明の続きです。ytljitではYARVの命令列をノードと呼ぶオブジェクトのグラフ(VMと呼んでいる)に変換し、その後そのグラ…

ytljitの型推論の説明(その3)

しつこいようですが、シグネチャーはメソッド呼び出しの際の引数を推論した結果の型オブジェクトの配列です。そして、型推論の際には必ずシグネチャが必要になります。 この2つのことから勘のいい人は気づくかも知れませんが(私はプログラムしてバグるまで気…

ytljitの型推論の説明(その2)

2回目はシグネチャーを作る話です。シグネチャーはメソッドの引数の型オブジェクトを配列でまとめたものです。型オブジェクトという未定義の言葉が出てきたので、これから説明します。型オブジェクトはRubyのクラスをWrapしたオブジェクトです。型オブジェク…

ytljitの型推論の説明(その1)

今、ytljitでうまく推論出来ないプログラムがあっていろいろ直しています。うまくいかないプログラムはこんな感じのものです。 def f yield end f { 1 + 1} f { "abc"} このバグの話の詳細を書くと訳わからなくなるし、詳細はどんどん変わっいるのでそれは書…

LLVMを捨てたやつが書く、怪しげなLLVM入門

>>> @miura1729 RT @yppp: あーあ、llvm使って言語作りたいけどバイトコードの 組み立てかたがわからない・・・・・・、 あとBoehm GCの組み込みかたも・・・・・・、まずはASTを作れって話なんだけどなw ああ、やる気がほしいhttp://twitter.com/repeatedly…