SlideShare a Scribd company logo
1 of 36
Download to read offline
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
 
作ったものを見せたかった話
作ったものを見せたかった話作ったものを見せたかった話
作ったものを見せたかった話Kei Kamikawa
 
Yomitan.pmに参加しようよ
Yomitan.pmに参加しようよYomitan.pmに参加しようよ
Yomitan.pmに参加しようよKei Kamikawa
 
初見では読みづらいPerl
初見では読みづらいPerl初見では読みづらいPerl
初見では読みづらいPerlKei 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 を始めよう!