Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

XS を始めよう!

208 views

Published on

Perl の XS を始めたので、その知見の共有です。
型、参照カウント、XS のメモリリークについて言及しています。

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

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. ?

×