Successfully reported this slideshow.
Your SlideShare is downloading. ×

XS を始めよう!

Advertisement

More Related Content

Advertisement

Related Books

Free with a 30 day trial from Scribd

See all

XS を始めよう!

  1. 1. XS を始めよう! @codehex
  2. 2. 自己紹介 • 本名: 上川 慶 • 琉球大学 3年 • Perl, Go 言語大好き • https://github.com/Code- Hex/ • https://twitter.com/CodeHex
  3. 3. List::Flatten::XS
 をリリースしました!! http://codehex.hateblo.jp/entry/2017/03/31/202007
  4. 4. XS ってなに?
  5. 5. http://d.hatena.ne.jp/gfx/20100202/1265091606 (2017年4月1日) XSとは,狭義ではPerlでエクステンションを書 くためのマクロ言語の名前ですが,広義ではエ クステンションを書くための技術の総称です。
  6. 6. つまり
  7. 7. Perl と C 言語を繋げ るための言語
  8. 8. 覚えておきたいこと
  9. 9. 覚えておきたいこと • 基本的な型 • カベージコレクション • 参照カウントでの注意
  10. 10. 基本的な型
  11. 11. 基本的な型 • SV: Perl の全ての値は SV から派生している.
 SV は Scalar Value. Perl でいう my $scalar; • AV: Array Value. 配列データ.
 Perl でいう my @array; • HV: Hash Value. ハッシュ.
 Perl でいう my %hash; • RV: Reference Value. リファレンス.
 Perl でいう my ($h, $a, $s) = (+{}, +[], 21);
  12. 12. プリミティブ型 • IV: 整数値. -1, 0, 10 など
 Integer Value. • UV: 符号なし整数値. 0, 1, 35 など
 Unsigned Value. • NV: 浮動小数点. 0.01, 1.32, 77.6 など • PV: 文字列. "Hello" など
 Pointer Value.
  13. 13. 型変換 • SV からプリミティブな型への変換
 IV iv = SvIV(sv);
 UV uv = SvUV(sv);
 などなど • プリミティブな型から SV への変換
 SV *sv = newSViv(iv);
 SV *sv = newSVuv(uv);
 などなど • SV から C の char* への変換
 char *str = SvPV_nolen(sv);
  14. 14. カベージコレクション
  15. 15. ガベージコレクションって?
  16. 16. https://ja.wikipedia.org/wiki/ガベージコレクション (2017年4月1日) ガベージコレクション(英語: garbage collection; GC)とは、プログラムが動的に確 保したメモリ領域のうち、不要になった領域を 自動的に解放する機能である。
  17. 17. GC にも色々種類がある
  18. 18. Perl では参照カウント
 方式を扱かっている
  19. 19. http://xsubtut.github.io/#n7 (2017年4月1日) 変数ごとに「この変数は○箇所から参照されて いるョ」というマークをつけておき、どこから も参照されなくなったらその部分のメモリを再 利用するというだけの仕組みです。
  20. 20. つまり
  21. 21. • 新たにデータを持つ変数を作成したら、参照カウン トが 1 増える • その変数からデータが使われなくなった時に、参照 カウントを 1 減らしてあげる • 参照カウントが 0 になった時メモリを再利用でき る
  22. 22. 参照カウントでの注意
  23. 23. • 参照カウントを間違えると、メモリリークもしくは データを破壊することにつながる • 手動で正しく管理するのが難しい
  24. 24. そこで
  25. 25. 新しく作ったデータに 揮発性を与える
  26. 26. SV * str = newSVpv("Hello World",0);
 sv_2motral(str); // 揮発性を与える
  27. 27. SV * str = newSVpv("Hello World",0);
 sv_2motral(str); // 揮発性を与える こうすることでスコープを抜けた時に
 自動でリファレンスカウントを 1 減らしてくれる!!
  28. 28. 揮発性を与えるべきもの • スコープ内で使っている newSV*() 
 最終的に return する newSV*() には与えてはいけ ない • newAV(), newHV()
 newAV(), newHV() は最終的に return するものに も与える
  29. 29. 揮発性を与えてる場合、
 配列、ハッシュへデータを保存する時に
 参照カウントを 1 増やすことに注意する!
  30. 30. Example • push の場合
 av_push(array, SvREFCNT_inc(val)) • unshift の場合
 av_unshift(array, len);
 for (int i = 0; i < len; i++) av_store(array, i, SvREFCNT_inc(val)); • 同様に av_store(), hv_store() 使う時にも
 SvREFCNT_inc() を使う
  31. 31. XS 側の
 メモリリークを検出する
  32. 32. Test::LeakTrace http://search.cpan.org/dist/Test-LeakTrace/lib/Test/LeakTrace/JA.pod
  33. 33. no_leaks_ok { xs_subname(); } 'Detected memory leak via xs_subname()'; Example
  34. 34. これである程度メモリリーク を抑えることができる!
  35. 35. 参考 • http://xsubtut.github.io/ • http://search.cpan.org/dist/Test-LeakTrace/ lib/Test/LeakTrace/JA.pod • http://qiita.com/shogo82148/items/ ba4f1b106868b7212341 • それと愉快な perldoc.jp 達
  36. 36. ?

×