SlideShare 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

JWT を使ってみよう
JWT を使ってみようJWT を使ってみよう
JWT を使ってみよう
Kei Kamikawa
 
技術を身につける技術
技術を身につける技術技術を身につける技術
技術を身につける技術
Kei Kamikawa
 
俺はこうして Go の CLI を作っている
俺はこうして Go の CLI を作っている俺はこうして Go の CLI を作っている
俺はこうして Go の CLI を作っている
Kei Kamikawa
 
我輩が作ったものを淡々と
我輩が作ったものを淡々と我輩が作ったものを淡々と
我輩が作ったものを淡々と
Kei Kamikawa
 
grep.metacpan.orgのススメ
grep.metacpan.orgのススメgrep.metacpan.orgのススメ
grep.metacpan.orgのススメ
Kei Kamikawa
 
Okinawapm#3
Okinawapm#3Okinawapm#3
Okinawapm#3
Kei Kamikawa
 
作ったものを見せたかった話
作ったものを見せたかった話作ったものを見せたかった話
作ったものを見せたかった話
Kei Kamikawa
 
Okinawapm #1
Okinawapm #1Okinawapm #1
Okinawapm #1
Kei Kamikawa
 
Yomitanpm 6
Yomitanpm 6Yomitanpm 6
Yomitanpm 6
Kei Kamikawa
 
Yomitan.pmに参加しようよ
Yomitan.pmに参加しようよYomitan.pmに参加しようよ
Yomitan.pmに参加しようよ
Kei Kamikawa
 
初見では読みづらいPerl
初見では読みづらいPerl初見では読みづらいPerl
初見では読みづらいPerl
Kei Kamikawa
 

More from Kei Kamikawa (11)

JWT を使ってみよう
JWT を使ってみようJWT を使ってみよう
JWT を使ってみよう
 
技術を身につける技術
技術を身につける技術技術を身につける技術
技術を身につける技術
 
俺はこうして Go の CLI を作っている
俺はこうして Go の CLI を作っている俺はこうして Go の CLI を作っている
俺はこうして Go の CLI を作っている
 
我輩が作ったものを淡々と
我輩が作ったものを淡々と我輩が作ったものを淡々と
我輩が作ったものを淡々と
 
grep.metacpan.orgのススメ
grep.metacpan.orgのススメgrep.metacpan.orgのススメ
grep.metacpan.orgのススメ
 
Okinawapm#3
Okinawapm#3Okinawapm#3
Okinawapm#3
 
作ったものを見せたかった話
作ったものを見せたかった話作ったものを見せたかった話
作ったものを見せたかった話
 
Okinawapm #1
Okinawapm #1Okinawapm #1
Okinawapm #1
 
Yomitanpm 6
Yomitanpm 6Yomitanpm 6
Yomitanpm 6
 
Yomitan.pmに参加しようよ
Yomitan.pmに参加しようよYomitan.pmに参加しようよ
Yomitan.pmに参加しようよ
 
初見では読みづらいPerl
初見では読みづらいPerl初見では読みづらいPerl
初見では読みづらいPerl
 

XS を始めよう!