タグ

ブックマーク / qiita.com/miura1729 (6)

  • mruby-inlineドキュメント - Qiita

    class Vec include Inline def initialize(x, y, z) @x = x @y = y @z = z end def vlength Math.sqrt(@x * @x + @y * @y + @z * @z) end make_inline_method :vlength end 仕組み このmrbgemの仕組みを簡単に説明します。 make_inline_methodで指定されたメソッドは、 メソッドの実体(Procオブジェクト)がメソッド名をキーにしたハッシュ(inline_method_list)に格納されます メソッドそのものはundefされ未定義になります そのメソッドが呼ばれた場合、未定義になっていますので、当然method_missingが呼ばれます。method_missingメソッドでは、 inline_method_listからメ

    mruby-inlineドキュメント - Qiita
  • segmentation faultの出たmrubyを楽しくデバッグする方法 - Qiita

    mrubyを使っていてsegmentation faultとか出て困ったことは無いでしょうか。こういう場合にgdbでデバッグするノウハウを書きます。gdbの使い方についてはここでは説明しません。 逆アセンブラ gdbでデバッグするならmrubyのバイトコードの逆アセンブラが必要です。標準ではcodedump関数が用意されていますが、なぜかここで説明するような使い方はできないようです。mrubyのJITで使っているものがここにありますので、コピーしてcodedump.cあたりにでも入れておいてくください。 これを使うと、変数mrbとirepが見えていれば、こんな感じでdisasm_irep関数を呼び出すことで逆アセンブルできます。見えていない場合、gdbのupコマンドで呼び出し元を辿っていて見えるところがあればそこで実行可能です。disasm_irepは値を返さないのでcallを使う方がよさ

    segmentation faultの出たmrubyを楽しくデバッグする方法 - Qiita
  • mrubyのJITにおけるメソッド再定義の対処方法 - Qiita

    Rubyはメソッドの再定義が出来るのですが、これがJITコンパイラを作るときに問題になります。メソッドそのものを再定義しなければならないのはもちろん、各所に散らばっているそのメソッドを呼び出している元も書き換えなければならないからです。さもなければ、再定義されているかを毎回チェックする必要があり、大幅に速度が落ちます。 mrubyのJITではコードの自己書き換えを駆使することで速度を落とさず再定義に対処しています。ただし、メモリ効率が悪いので、頻繁な書き換えには向きません。 mrubyのJITではこんな感じで生成コードを管理しています。この場合は、メソッドfooの場合です。 entry tableってのがあって、RITE VMの命令毎に対応する機械語コードのアドレスが入っています。Tracing JITなのでプログラムが全て機械語になっている保証はないですので、これを見て対応する機械語命令

    mrubyのJITにおけるメソッド再定義の対処方法 - Qiita
    YaSuYuKi
    YaSuYuKi 2015/12/21
    この辺のソースコードを読んだがほとんど理解できなかった……
  • mrb_state 解説(必ずしも徹底ではない) - Qiita

    mrubyを改造したり、mrubyを何かアプリケーションとかに組み込むときに必ず必要になる物に、mrb_state型の構造体へのポインタ(多くの場合はmrbという名前で参照されている)があります。これは、mrubyで使う大域変数や状態を1つの構造体にまとめた物です。 mrubyのインタプリタを使うときにはmrb_state型の構造体のインスタンスを用意してそれをインタプリタに渡します。複数のインタプリタが欲しいときには複数のインスタンスを用意します。 こうすることで、構造体のインスタンスを複数用意することで複数のmrubyインタプリターをプログラムコードは共有して使えます。これは、並列性は息を吸うのと同じくらい普通で、メモリの一滴は血の一滴くらいメモリが貴重な1組み込み界隈ではとっても嬉しい仕様なわけです。 mrb_stateはmrubyの大域変数や状態が全て入っているので、mrb_sta

    mrb_state 解説(必ずしも徹底ではない) - Qiita
    YaSuYuKi
    YaSuYuKi 2015/12/14
    使うメモリの下限を下げる=使える環境が広がる、だからなぁ。ユニット全体で10円切るなんて普通の世界だし
  • mrubyのバイトコードの命令の解説 - Qiita

    mrubyでコンパイラを作ってみたり、Rubyを書く以外の方法でmrubyのバイトコード列を書く場合、バイトコードの命令を知る必要があります。 バイトコード命令は単純そうで意外と奥が深いようです。ここではmrubyのJITを作成する経験で得たバイトコードの裏仕様を解説したいと思います。 OP_NOP 何もしない命令 これって実はcodegen.cで定義されている正規のコードジェネレータでは出てこないんですよね。でもバイトコードのパッチとかやりたいときはないと困る重要な命令です。 命令の仕様ではオペランドはないのですが、実際にはオペランドの領域があるのでなにか隠しデータを保存しておくのにも便利です。 OP_MOVE MOVE Rm, RnでレジスタRnの内容をRmに代入する命令。n, mはレジスタの番号 こんなにいらんだろ?って思うほどいっぱい生成されます。OP_SENDで解説しますが引数は

    mrubyのバイトコードの命令の解説 - Qiita
  • mrubyの可変引数最適化 - Qiita

    def foo(*arg) p arg end foo(1) # -> [1] foo(1, 2, 3) # -> [1, 2, 3] このような可変引数の配列は、mrubyの実装ではRITE VMの命令OP_ENTER中で作られます。つまり、可変引数を使うとメソッドコールの度に配列のアロケーションが行われるわけです。メソッドコールの数が多ければGCも頻発することでしょう。 可変引数の使用頻度が少なければ問題ないのですが、ループを構成してメソッドコールが頻発するmrblib/enum.rbで定義されているEnumerableモジュールのメソッドは軒並み使われています。たとえば、all?の定義です。 def all?(&block) if block self.each{|*val| unless block.call(*val) return false end } else self.e

    mrubyの可変引数最適化 - Qiita
  • 1