タグ

ブックマーク / mirichi.hatenadiary.org (2)

  • mrubyのVMざっくり解説 - mirichiの日記

    なんとなく、mrubyのVMの基的なところを書いておこうと思ったので。誰かの参考になれば。 大きな仕様的なところは、 ・32bit固定長のバイトコードを解釈して動作する。 ・レジスタをスタックに確保するタイプのレジスタマシンである。従って、スタックの任意の位置をレジスタ番号で指定して直接読み書き可能。 ・メソッドやブロックなどの単位でバイトコードがirep構造体にまとめられている。 みたいな感じ。 スタックの使い方 スタックトップがレジスタのR0となり、以下、R1、R2・・・と名前が付けられる。スタックの型はmrb_valueの配列であり、つまりmrubyオブジェクトが詰まっている。irepのコードを呼び出すとき、スタックの上から順に以下のような情報を積んでから呼ばれる。 (引数が2個あった場合の例) R0 |self | R1 |argument1| R2 |argument2| R3

    mrubyのVMざっくり解説 - mirichiの日記
    nilab
    nilab 2014/04/29
    mrubyのVMざっくり解説 - mirichiの日記
  • RGenGCとC拡張ライブラリの関係 - mirichiの日記

    Ruby2.1のRGenGCについて対応などを考えていたので個人的まとめ。 ■世代別GCとC拡張ライブラリの相性の悪さ RGenGCは世代別GCである。通常はRubyシステムによって適切に制御されたライトバリアと世代別管理されたGCによって効率よく処理されるが、C拡張ライブラリが関わるとライトバリアの制御が適切に行われない。C拡張ライブラリを書き換えてライトバリアのコードを挿入すればいいわけだが、数が多かったりメンテナ不在だったりするわけで、この方法で対応するのは現実的ではない。 RubyにおいてC拡張ライブラリがライトバリアと相性悪い部分は以下の2点である。 ・CのコードはRubyオブジェクトの内部情報を取り出して保持できる。 ・C実装のクラスはRubyオブジェクト(VALUE型)を保持するC構造体を持つことができる。 たとえばRARRAY_PTRで配列のポインタを取り出して保持した場合

    RGenGCとC拡張ライブラリの関係 - mirichiの日記
    nilab
    nilab 2013/12/31
    RGenGCとC拡張ライブラリの関係 - mirichiの日記
  • 1