狠狠撸
Submit Search
XS を始めよう!
0 likes
747 views
Kei Kamikawa
Perl の XS を始めたので、その知見の共有です。 型、参照カウント、XS のメモリリークについて言及しています。
Engineering
Read more
1 of 36
Download now
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
More Related Content
More from Kei Kamikawa
(11)
PDF
JWT を使ってみよう
Kei Kamikawa
?
PDF
技术を身につける技术
Kei Kamikawa
?
PDF
俺はこうして Go の CLI を作っている
Kei Kamikawa
?
PDF
我辈が作ったものを淡々と
Kei Kamikawa
?
PDF
驳谤别辫.尘别迟补肠辫补苍.辞谤驳のススメ
Kei Kamikawa
?
PDF
Okinawapm#3
Kei Kamikawa
?
PDF
作ったものを见せたかった话
Kei Kamikawa
?
PDF
Okinawapm #1
Kei Kamikawa
?
PDF
Yomitanpm 6
Kei Kamikawa
?
PDF
驰辞尘颈迟补苍.辫尘に参加しようよ
Kei Kamikawa
?
PDF
初见では読みづらい笔别谤濒
Kei Kamikawa
?
JWT を使ってみよう
Kei Kamikawa
?
技术を身につける技术
Kei Kamikawa
?
俺はこうして Go の CLI を作っている
Kei Kamikawa
?
我辈が作ったものを淡々と
Kei Kamikawa
?
驳谤别辫.尘别迟补肠辫补苍.辞谤驳のススメ
Kei Kamikawa
?
Okinawapm#3
Kei Kamikawa
?
作ったものを见せたかった话
Kei Kamikawa
?
Okinawapm #1
Kei Kamikawa
?
Yomitanpm 6
Kei Kamikawa
?
驰辞尘颈迟补苍.辫尘に参加しようよ
Kei Kamikawa
?
初见では読みづらい笔别谤濒
Kei Kamikawa
?
XS を始めよう!
1.
XS を始めよう! @codehex
2.
自己紹介 ? 本名: 上川
慶 ? 琉球大学 3年 ? Perl, Go 言語大好き ? https://github.com/Code- Hex/ ? https://twitter.com/CodeHex
3.
List::Flatten::XS? をリリースしました!! http://codehex.hateblo.jp/entry/2017/03/31/202007
4.
XS ってなに?
5.
http://d.hatena.ne.jp/gfx/20100202/1265091606 (2017年4月1日) XSとは,狭義ではPerlでエクステンションを書 くためのマクロ言語の名前ですが,広義ではエ クステンションを書くための技術の総称です。
6.
つまり
7.
Perl と C
言語を繋げ るための言語
8.
覚えておきたいこと
9.
覚えておきたいこと ? 基本的な型 ? カベージコレクション ?
参照カウントでの注意
10.
基本的な型
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.
プリミティブ型 ? IV: 整数値.
-1, 0, 10 など? Integer Value. ? UV: 符号なし整数値. 0, 1, 35 など? Unsigned Value. ? NV: 浮動小数点. 0.01, 1.32, 77.6 など ? PV: 文字列. "Hello" など? Pointer Value.
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.
カベージコレクション
15.
ガベージコレクションって?
16.
https://ja.wikipedia.org/wiki/ガベージコレクション (2017年4月1日) ガベージコレクション(英語: garbage collection;
GC)とは、プログラムが動的に確 保したメモリ領域のうち、不要になった領域を 自動的に解放する機能である。
17.
GC にも色々種類がある
18.
Perl では参照カウント? 方式を扱かっている
19.
http://xsubtut.github.io/#n7 (2017年4月1日) 変数ごとに「この変数は○箇所から参照されて いるョ」というマークをつけておき、どこから も参照されなくなったらその部分のメモリを再 利用するというだけの仕組みです。
20.
つまり
21.
? 新たにデータを持つ変数を作成したら、参照カウン トが 1
増える ? その変数からデータが使われなくなった時に、参照 カウントを 1 減らしてあげる ? 参照カウントが 0 になった時メモリを再利用でき る
22.
参照カウントでの注意
23.
? 参照カウントを間違えると、メモリリークもしくは データを破壊することにつながる ? 手動で正しく管理するのが難しい
24.
そこで
25.
新しく作ったデータに 揮発性を与える
26.
SV * str
= newSVpv("Hello World",0);? sv_2motral(str); // 揮発性を与える
27.
SV * str
= newSVpv("Hello World",0);? sv_2motral(str); // 揮発性を与える こうすることでスコープを抜けた時に? 自動でリファレンスカウントを 1 減らしてくれる!!
28.
揮発性を与えるべきもの ? スコープ内で使っている newSV*()
? 最終的に return する newSV*() には与えてはいけ ない ? newAV(), newHV()? newAV(), newHV() は最終的に return するものに も与える
29.
揮発性を与えてる場合、? 配列、ハッシュへデータを保存する時に? 参照カウントを 1 増やすことに注意する!
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.
XS 側の? メモリリークを検出する
32.
Test::LeakTrace http://search.cpan.org/dist/Test-LeakTrace/lib/Test/LeakTrace/JA.pod
33.
no_leaks_ok { xs_subname(); } 'Detected
memory leak via xs_subname()'; Example
34.
これである程度メモリリーク を抑えることができる!
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.
?
Download