hogelogの日記

2008-03-14

gauche.nightでGaucheのPHPバインドぽい拡張について喋ってきた。

16:02

おもくそネタにさせていただきましたゴメンねPHP! ちがうんだつい筆がのっちゃったんですよ!

gauche.night - hogeなlog

つくったもの

できたものはこの辺。適当です。文字列の受け渡しとかでgauchephpgcが競合したりして落ちるかもしれません。

http://konbu.s13.xrea.com/lib/etc/php-gauche-20080309.tar.bz2

php拡張機能ビルドできて、gaucheが入ってる環境で以下のことをすれば動くかも。

% ./configure

した後にMakefileのCFLAGSとLDFLAGSを以下のように書き換え。

CFLAGS = `gauche-config -I` -g -O2
LDFLAGS = `gauche-config -L`

configureになんかわたしせばいいんだろうけどよくわからんので。で、make && sudo make install。

つくるとき

拡張勉強会で知ったCodeGen-PECLを使って書きました。つっても雛形生成くらいにしか使ってませんが。まずpecl-genに渡すXMLとして以下のようなものを記述。

<?xml version="1.0" ?>
<extension name="scm" version="0.0.1">
  <function name="scm_assign">
    <proto>void scm_assign(string name, mixed val)</proto>
    <code>
    </code>
  </function>
  <function name="scm_eval">
    <proto>mixed scm_eval(string code)</proto>
    <code>
    </code>
  </function>
  <function name="scm_eval_file">
    <proto>mixed scm_eval_file(string code)</proto>
    <code>
    </code>
  </function>
</extension>

見てわかる通り、関数の名前と引数と返り値以外何も書いてません。手抜きです。これをpecl-genに。

% pecl-gen scm.xml
Creating 'scm' extension in './scm'

Your extension has been created in directory ./scm.
See ./scm/README and/or ./scm/INSTALL for further instructions.
% cd scm
% ls
CREDITS       README     config.w32  package.xml   php_scm.h  scm.dsp  tests/
EXPERIMENTAL  config.m4  manual/     package2.xml  scm.c      scm.xml

scmというディレクトリ内に色々できました。上記したアーカイブ内に入ってるのはここまでやったもの。

% phpize
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20060613
Zend Extension Api No:   220060519
% ./configure
...
% ls
CREDITS             build/          configure*     package.xml
EXPERIMENTAL        config.guess*   configure.in   package2.xml
Makefile            config.h        include/       php_scm.h
Makefile.fragments  config.h.in     install-sh     run-tests.php
Makefile.global     config.log      libtool*       scm.c
Makefile.objects    config.m4       ltmain.sh      scm.dsp
README              config.nice*    manual/        scm.xml
acinclude.m4        config.status*  missing        tests/
aclocal.m4          config.sub*     mkinstalldirs
autom4te.cache/     config.w32      modules/
% 

もっと色々できました。あとはscm.cとphp_scm.hを好き勝手いじって目的とする拡張を書くだけです。自分はここでMakefileを直接書き換えてライブラリとリンクさせたりするようにしました。configureとか、pecl-genとかその辺でうまいことやればいいのかもしれないけどめんどくさかったので手動で。


こうしてようやくスタート地点です。さて書くべえかと思ったところで困るんですけど、PHP拡張てどうやって書きゃいいのよ、と。ぐぐったら多少は資料ぽいものが見つかったりしないこともないです。けどたぶんまだあんまし充実していません。とりあえずPHPのヘッダファイルなど読むと良いと思います。たぶんzend.hとかzend_API.hあたりに重要なものが多いです。debianのパッケージで入れた場合は

/usr/include/php5/Zend/zend.h

/usr/include/php5/Zend/zend_API.h

にあったりしました。

zend.hにあるzvalの定義とか重要ですね。実際にはstruct _zval_structとして以下のように定義されています。

struct _zval_struct {
  /* Variable information */
  zvalue_value value;   /* value */
  zend_uint refcount;
  zend_uchar type;  /* active type */
  zend_uchar is_ref;
};

zend_API.hにはZVAL_BOOL, ZVAL_STRING, ..., RETURN_BOOL, RETURN_NULL, RETURN_TRUE, RETURN_FALSE, RETURN_LONG, ... あたりとか書いてあります。この辺把握してないとたぶん何も書けないんじゃないかなと思います。


でもヘッダファイルだけ見てもわかんねーようんこ! って思いますよね。なのでPHPソースコードを眺めて適当に使い方を想像したりしました。phpソースコードダウンロードしてきて、適当に読み易い状態にしておくと良いでしょう。めんどくさかったのでやりませんでしたが、PECL :: The PHP Extension Community Libraryあたりから適当な既存のPECLのパッケージを探してソースとか参考にすると良かったかもしれません。

ソース読め、じゃないかなたぶん

PHPのドキュメントは、まあ割と整備されてるよねとかいう意見もあるけどこの辺はどう見ても全然整備されてないですし。まあ整備されてドキュメントとか豊富になったとしても、拡張とか書くならどうせそのうちソースコード読まなきゃいけないんだし、読むのが近道じゃないかなという気もします。めんどくさかったのでドキュメントの類たいして探してないし読んでないんであまり自信もって言えないですけど。


こういうのは一見とっつきにくいように見えても原典にあたった方が早い気がする。で、拡張書く場合の原典は今のところソースコードなんじゃないかなたぶん。

GracyeGracye2012/03/17 23:23I'm not easily imprseesd. . . but that's impressing me! :)

tsftqnjvoestsftqnjvoes2012/03/18 04:29AtYYe3 <a href="http://dhosxoceejik.com/">dhosxoceejik</a>

udjxrsklcmeudjxrsklcme2012/03/18 23:552eyObL , [url=http://iatilnrgmgmp.com/]iatilnrgmgmp[/url], [link=http://fbksdsgdcgig.com/]fbksdsgdcgig[/link], http://xubssmyaskot.com/

ajohwtajohwt2012/03/20 00:29ZmBOnV <a href="http://eazammiksspe.com/">eazammiksspe</a>

sgpvbfvhsgpvbfvh2012/03/20 22:03QikAuO , [url=http://zbdnjgbphluv.com/]zbdnjgbphluv[/url], [link=http://xczldayfaqtv.com/]xczldayfaqtv[/link], http://cbtgsuyrlzqt.com/

2008-03-04

PHP! PHP! できた!

% cat fib.scm
(define (fib x) (if (< x 3) 1 (+ (fib (- x 1)) (fib (- x 2)))))
(print (fib 30))
% cat fib.php
<?php
function fib($x) {
  if($x < 3) {
    return 1;
  }
  return fib($x-1) + fib($x-2);
}
echo fib(30), "\n";

?>
% time php -r 'scm_eval_file("fib.scm");'
832040
0.160 user 0.024 system 0.186 total
% time php fib.php
832040
0.988 user 0.020 system 1.007 total

PHPGaucheの夢を見るのである。にゃもる。

勉強会一回目にて一人遊びで作ってた拡張をネタにGaucheナイトで喋ってきます。

http://practical-scheme.net/wiliki/wiliki.cgi?gauche.night

AlenaAlena2013/02/13 10:24Good to see real expertise on display. Your cnortibuiton is most welcome.

ncgfanorblgncgfanorblg2013/02/14 21:50Xxlqp3 <a href="http://xbmxfeaypnvd.com/">xbmxfeaypnvd</a>

ehnladaehnlada2013/02/14 21:508aYg2E <a href="http://raghusucqmle.com/">raghusucqmle</a>

ftsshyftsshy2013/02/17 00:03XdTmp4 <a href="http://dqwcdrpqzdum.com/">dqwcdrpqzdum</a>

zyfkrfjdtyzyfkrfjdty2013/02/17 08:311g0lOK , [url=http://wbjhmhdktcar.com/]wbjhmhdktcar[/url], [link=http://xzsazwigcoph.com/]xzsazwigcoph[/link], http://smqlgpfrmhwq.com/