地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Perl】xsファイル入門

概要

休み明け一発目から古のperlを使った謎モジュールのビルドエラーの確認作業になった。cもmakefileもそれなりに読めるし余裕だろって思ってたらそんなことはなかったのでメモ

XSでハマったというよりはそもそもXSが何なのかをそんなに理解してなかったので理解用に書く

XSとは

XS は Perl と(Perl と一緒に使いたい)C のコード(または C ライブラリ)との 間の拡張インターフェースを作るのに使われるインターフェース記述 ファイルフォーマットです。 
XS インターフェースはライブラリと動的または静的にリンクされて、 Perl とリンクすることのできる新しいライブラリを生成します。 
XS インターフェース記述はは XS 言語で書かれており、 Perl 拡張インターフェースのコアコンポーネントです。

perldoc.jp

XSはCをベースに独自のマクロを持った言語。PerlからCコードを呼び出すぐらいにしかわかってなかったけどリファレンス読むと思ったより高機能なのが分かる

使ってみる

minilという雛形生成ツールを使って最小コードのxsを生成してみた。

qiita.com

ぱっと見はC。SVとかその辺はそのままperlの用語に紐づく形となっている

#ifdef __cplusplus
extern "C" {
#endif

#define PERL_NO_GET_CONTEXT /* we want efficiency */
#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>

#ifdef __cplusplus
} /* extern "C" */
#endif

#define NEED_newSVpvn_flags
#include "ppport.h"

MODULE = Acme::MyModuele    PACKAGE = Acme::MyModuele

PROTOTYPES: DISABLE

void
hello()
CODE:
{
    ST(0) = newSVpvs_flags("Hello, world!", SVs_TEMP);
}

SVの操作

XSからPerlのデータを操作する方法

SV の中身をダンプして出力

sv_dump(sv)

新しい SV をつくりたい。整数値から SV をつくりたい

SV* sv = newSViv(5963);

符号なし整数値から SV をつくりたい

SV* sv = newSVuv(5963);

文字列から SV をつくりたい

SV* sv = newSVpvn("hello", strlen("hello"));

SV から SV をつくりたい

SV* new_sv = newSVsv(sv);

SV の値が真か偽かがしりたい

bool b = SvTRUE(sv);

sprintf したい。

SV* sv = newSVpvf("%d", 3);

参照カウンターをインクリメントしたい

SvREFCNT_inc(sv);

参照カウンターをデクリメントしたい

SvREFCNT_dec(sv);

参考

xsubtut.github.io

tutorial.perlzemi.com

【python】

flake8はpythonの以下の3つのエラーチェックをしてくれるモジュールのラッパーです。

pep8:コードスタイルがPEP8に準拠しているかをチェック pyflakes:コードの論理的エラーをチェック(スタイルのチェックは除く) mccabe:コードの循環的複雑度のチェック(分岐やループを定義式で数値化するみたいです) 要はお勧めのエラーチェックの抱き合わせで、これを入れておけば安心・・・みたいに思っておけばいいのかもしれません・・・(汗

因みにパッケージモジュールのpep8は、最近pycodestyleという名前に変わったらしいので、flake8をインストールするとpep8の代わりにpycodestyleが関連モジュールとしてインストールされます。