2013-01-01から1年間の記事一覧
今回はオブジェクト作成のメソッドnewのインライン化のお話です。newのインライン化はそれほど規模が大きくないのですが、mrubyのJITの大きな転換点になっています。前回取り組んだytljitがRubyの型推論(ブロックや要素ごとに違う型が格納できる配列などを含…
とってもお久しぶりです。ずいぶん間が空いてしまいましたが、新たな機能のプリミティブのインライン化が実装できたので再開したいと思います。あなとみー おぶ mrubyのJIT の開始当時オリジナルmrubyの数割速いとか遅くなるとか言っていましたが、現在大体…
追記 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…
お久しぶりです。ここんとこしばらくProcオブジェクトのサポートを作りこんでました。これが無いとイテレータとかみんなVMに戻ってしまって性能が上がらないのです。実はProcオブジェクトをサポートしてもあまり性能が上がらなかったのですが…。 で、この作…
今回からmrubyのJITで実際にどういうX86のコードを生成するのか説明する予定なのですが、その前に大変素晴らしいXbyakの宣伝とともにmrubyのJITで共通して使っているテクニックを紹介したいと思います。 Xbyakは光成滋生氏によって開発されたx86(IA32), x64(…
かなり間が空いちゃいました。その間にmrubyのJITをコーティングしたりお祭りの資料を作ったりしていました。結構内容が変わって、例えばこれまで説明していたものがjit.cからvm.cに移ったりしています。そんなこんなで結構速度が上がって(多くがwannabe53さ…
祝その7、前回(ytljitの型推論)も前々回(yarv2llvm)も第6回くらいで挫折したんだよな。まああいつらよりは説明しやすいのですが。そういうことで、無事にかは知らんけど拡張asmを超えて続きを説明します。ちなみに、今やっているのはjit.cのmrbjit_dispatch…
かなり間があいちゃったけど、予告通りgccの拡張asmをつかったネイティブコードの呼び出し部分の説明を行います。gccの拡張asmはインラインアセンブラのくせに最適化して書いたコードのようにアセンブラを生成してくれないことがあるばかりか、変数が割り当…
いよいよここまで来たか。ということで、今回はjit.cの中でも中心となる、mrbjit_dispatchの説明をします。大まかな動きについては大体説明したと思いますので、プログラムを細かく見ていきます。 void * mrbjit_dispatch(mrb_state *mrb, mrbjit_vmstatus *…
今回は前回の予告通りstatusとは何かからです。何度もmrubyには処理系の状態がmrb_state構造体でまとまっていていいよという話をしていますが、実はmrb_state構造体に入っている状態だけがすべてではないのです。mrb_stateに入っていない状態は何かというとm…
今回からプログラムの説明です。今回はmrubyのVMの命令実行部分、vm.cのmrb_runにどうパッチを当てているかを見てみます。mrb_runは大まかに言ってこんな感じになってます。 初期化 命令取出し 取出した命令に当たる処理にジャンプ 命令の実行 2に戻る 3のジ…
前回の1.10001・・・は最初に証明された超越数の10倍でした。 私が積読してあることで名高い「人月の神話」には、つぎのようなくだりがあります。 私にフローチャートを見せられて、テーブルを見せないとしたら、私はずっと煙に巻かれたままになるだろう。逆…
謝辞を忘れていました。mrubyのJITはXbyak(http://homepage1.nifty.com/herumi/soft/xbyak.html)を使わせてもらっています。今まで、C言語の生成、LLVM、Rubyで書いた自作アセンブラなどでコンパイラを使っていましたが、Xbyakは一番使いやすいです。 某出版…
ふと思い立ってものすごく影の薄いmrubyのJITの内部構造を説明することにしました。mrubyのJITは正式名称がないというとてもかわいそうなmrubyのフォークですが、オリジナルのmrubyの1〜3割(倍じゃないのに注意)速いようです。ここにあります、 https://gith…