id:TAKESAKOさんの好意で出させてもらったので、適当にロギングします。
はじめてのXS / id:hirose31さん
- XSってなに? PerlとCをつなぐための言語&インタフェース
- なぜXSを使う?
- XSを書いた動機 → forkしまくりたくなかった
- ドキュメント
- perlxstut, perlxs, perlguts, perlapi
- h2xs or module-starter (Module::Starter::XSimple) で始める
- 外部のsay_hello()関数を呼ぶxsの例
- 動的の場合は LIBS に指定、静的の場合は MYEXTLIB
- 参考
- Perlの"代わりに"XSを書いてはいけない
- Perlの方が簡単
- メモリリークの問題 → XS内で作った値が、スコープはずれても解放されない
- New〜したものはSafefree()
- newSV〜したものはsv_free
- DESTROY()でやるべし
- プロファイリング
- valgrind --tool=callgrind と kcachegrind
- 互換性
- NewxzってのはPerl5.8.4では使えないらしい
- → ppport.hで吸収、Devel::PPPort
- まとめ
- XSは簡単
- XSでPerlの内部構造に詳しくなる
- 質疑応答
- Q. PTR2INT??とかって何してるの?
- A. 次のセッションで
Perl 5 Internalsの世界にようこそ / 牧さん
- PerlはCで書かれている
- XS、XSUB → Glue。マクロやツール類
- Perlは、規模・歴史の割にはよくメンテされている
- 構造体
- SV: スカラ
- AV: 配列
- HV: ハッシュ
- GV: グロブ
- SV構造体
- AV構造体
- AVの先にXPVAVがある
- HVとかGVは略
- Structural Equivalence
- 構造体内のバイトオフセットを揃えることにより、SVとかAVが互いにキャスト可能になる
- SVのAPI → newSV~、Sv〜OK等
- REFCNT
- メモリ管理用のリファレンスカウント
- 誕生のときはREFCNT = 1、参照が増えると加算する
- REFCNT == 0 になると、解放
- 値そのものではなく、リファレンスを参照するとカウントが増える
- SvREFCNT_inc() と SvREFCNT_dec() : カウントの加算と減算
- sv_freeよりもこっちが好き
- SVに魔法をかける
- 例: tie → SvPVMGにSVがアップグレードされる(MAGIC)を持ってる
- MAGICの種類: extがユーザ定義
- 構造体を持ち歩くには?
- 構造体をMAGICに入れる
- XSはPerlとCをつなげるもの
- SV操作をいくらCでやっても、意味はない(5%くらいは速いらしい)
- Cで書かれてる物のみXSで使う(Perl - XS - C Library)
- XS関数の定義
- シグネチャ + マクロによるXSセクション
- XS関数→xsubpp(ExtUtils::Xsubpp)→C→コンパイル
- XSセクション
- PREINIT, CODE / PPCODE, OUTPUT, BOOT
- Typemap
- さらに研究するには、.xsファイルと.cファイルを見比べるとよい
- Devel::Peek
- SVの構造体を覗ける
- REFCNTによるGC
- やり玉に挙げられるが・・・?
- DESTROYが呼ばれるタイミングが保証されるのはよい
- ハマりどころ
- hv_storeするときは、SvREFCNT_inc()忘れない
- コンテナがGCされたときはノータッチじゃなければならない
- トリビア
- PVIVにはPVスロットがある
- 整数を作った段階ではIVには100が入り、文字列評価されるとPVXには"100\0"が入る
- 文字列分のメモリを使いたくない場合は、print "$x\n" より print $x, "\n"
- 質疑応答
- Q. コンテナがGCされたときはノータッチじゃなければならないのは、自動で中身のREFCNT減らされるから?
- A. はいそうです。アレイの場合も一緒です。
- Q. ウィークリファレンスはSVレベルではどうなっているの??
- A. わかりません。宿題。
Inside Ruby.pm 藤さん
- CライブラリとしてのRuby (ライトニングトーク)
- Rubyのソースの基礎
- VALUE : SV*
- Qnil : PL_sv_undef
- Qtrue, Qfalse : 真偽値
- ID : 文字列に対する一意の整数値
- xsubppを通した後の物を参考に、直接Cで書いている
- XS厨のころに書いたからw
- rubyのメソッドの呼び出し
- ruby_self: VALUEになっているかをチェックして、VALUEになってなければPerlオブジェクトをRubyオブジェクトにラップして返す。文字列でRubyのクラスっぽければRubyのクラスを返す
- Funcall: Rubyの例外の仕組みに対応が必要。(do_funcall_protect)
- 最後の引数には、ブロック付きメソッドの対応
- do_funcall_protect
- rb_protect(evalでくくって呼び出すAPI)を利用。ただし、引数は一つしかとれない
- 引数を一つにまとめたりして、rb_protectが利用できる形に変換している
- funcaller→ rb_funcall2を利用。(ちなみに、rb_funcallは可変長引数)
- VALUE2SV: VALUEをSVに変更。もともとPerlのオブジェクトならそのまま。
- まとめ
- 現状、Cygwinでしか動かない
- 質疑応答
PerlMachine / wakaponさん
- PerlMachineとは? 高水準言語マシン(単一言語マシン)
- PerlMachine : Perlを動かすためだけの計算機
- 過去の例
- 目標
- 方針
- perl5.10.0のmicroperl → 処理系もアプリも特権モードで動作
- 現状
- XSUBでI/Oやメモリ管理は拡張
- 標準ライブラリ: strict, warnings, feature, Carp
- ベアマシン上でPerl5.10.0が動く → main.plが動く
- 複数のインタプリタインスタンスが動いている
- ファイル読み込みの実行フロー、printの実行フロー
- libc から PerlOSのシステムコールが呼ばれる
- grubでロードしている
- microperl
- newlib
- FatFs 汎用FAT
- XSUB - 主記憶アクセス、I/Oポートアクセス
- XSUBの登録を自前でやっている(perl_parse)
- 今後の展開
- 質問
- Q. Perlで100分の1秒のコンテキストスイッチがとれる?10分の1とかになる?
- A. やってみて、速度を決める。
ライトニングトーク
- autobox internals / id:tokuhiromさん
- PL_check hacks / id:yappoさん
- Arguments::calleeの作り方 / id:TAKESAKOさん
- gdbでXS on mod_perlをデバッグ / id:stanakaさん
gdb /usr/sbin/httpd (gdb) run -X -f httpd_test.conf
- Abstract Script Engines / Higuchiさん
- Perl5VM Golf / id:tokuhiromさん