狠狠撸

狠狠撸Share a Scribd company logo
XS を始めよう!
@codehex
自己紹介
? 本名: 上川 慶
? 琉球大学 3年
? Perl, Go 言語大好き
? https://github.com/Code-
Hex/
? https://twitter.com/CodeHex
List::Flatten::XS?
をリリースしました!!
http://codehex.hateblo.jp/entry/2017/03/31/202007
XS ってなに?
http://d.hatena.ne.jp/gfx/20100202/1265091606 (2017年4月1日)
XSとは,狭義ではPerlでエクステンションを書
くためのマクロ言語の名前ですが,広義ではエ
クステンションを書くための技術の総称です。
つまり
Perl と C 言語を繋げ
るための言語
覚えておきたいこと
覚えておきたいこと
? 基本的な型
? カベージコレクション
? 参照カウントでの注意
基本的な型
基本的な型
? 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);
プリミティブ型
? IV: 整数値. -1, 0, 10 など?
Integer Value.
? UV: 符号なし整数値. 0, 1, 35 など?
Unsigned Value.
? NV: 浮動小数点. 0.01, 1.32, 77.6 など
? PV: 文字列. "Hello" など?
Pointer Value.
型変換
? 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);
カベージコレクション
ガベージコレクションって?
https://ja.wikipedia.org/wiki/ガベージコレクション (2017年4月1日)
ガベージコレクション(英語: garbage
collection; GC)とは、プログラムが動的に確
保したメモリ領域のうち、不要になった領域を
自動的に解放する機能である。
GC にも色々種類がある
Perl では参照カウント?
方式を扱かっている
http://xsubtut.github.io/#n7 (2017年4月1日)
変数ごとに「この変数は○箇所から参照されて
いるョ」というマークをつけておき、どこから
も参照されなくなったらその部分のメモリを再
利用するというだけの仕組みです。
つまり
? 新たにデータを持つ変数を作成したら、参照カウン
トが 1 増える
? その変数からデータが使われなくなった時に、参照
カウントを 1 減らしてあげる
? 参照カウントが 0 になった時メモリを再利用でき
る
参照カウントでの注意
? 参照カウントを間違えると、メモリリークもしくは
データを破壊することにつながる
? 手動で正しく管理するのが難しい
そこで
新しく作ったデータに
揮発性を与える
SV * str = newSVpv("Hello World",0);?
sv_2motral(str); // 揮発性を与える
SV * str = newSVpv("Hello World",0);?
sv_2motral(str); // 揮発性を与える
こうすることでスコープを抜けた時に?
自動でリファレンスカウントを 1 減らしてくれる!!
揮発性を与えるべきもの
? スコープ内で使っている newSV*() ?
最終的に return する newSV*() には与えてはいけ
ない
? newAV(), newHV()?
newAV(), newHV() は最終的に return するものに
も与える
揮発性を与えてる場合、?
配列、ハッシュへデータを保存する時に?
参照カウントを 1 増やすことに注意する!
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() を使う
XS 側の?
メモリリークを検出する
Test::LeakTrace
http://search.cpan.org/dist/Test-LeakTrace/lib/Test/LeakTrace/JA.pod
no_leaks_ok {
xs_subname();
} 'Detected memory leak via xs_subname()';
Example
これである程度メモリリーク
を抑えることができる!
参考
? http://xsubtut.github.io/
? http://search.cpan.org/dist/Test-LeakTrace/
lib/Test/LeakTrace/JA.pod
? http://qiita.com/shogo82148/items/
ba4f1b106868b7212341
? それと愉快な perldoc.jp 達
?

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 を始めよう!