Nim で PHP のExtension を作る
Nim とは?
https://ja.wikipedia.org/wiki/Nim
Nim (旧称はNimrod)とは命令型、マルチパラダイム、コンパイル言語という特徴を持つプログラミング言語であり、 アンドレアス・ランプフにより設計・開発された。 Nimは「効率的で表現豊かで優雅」であるように設計されている。 メタプログラミング、関数型プログラミング、メッセージパッシング、手続き型プログラミング、 オブジェクト指向プログラミングをサポートしており、 コンパイル時のコード生成、代数的データ型、 C言語のForeign function interface (FFI)、JavaScriptへのコンパイルなどの機能を提供している。 Pythonのようなシンプルな構文で書かれるが、C言語並みの高いパフォーマンスを有している。 Rust、D言語、Goなどの言語としばしば比較される。
らしいです。
感想など: https://qiita.com/snowlt23/items/f50ab84afeab9469e422
なぜ Nim なのか?
別に、理由はありません。
http://wolfbash.hateblo.jp/entry/2017/07/30/193412
の記事を見たからです。
今日の昼休みに、 Rust を勉強しようと思って色々見ていたら、
たまたま見つけました。
なんか、早そうだし、やってみるか! ぐらいの勢いです。
Nim のインストールとか
おおよそ、ここを参考にしてインストールしました。
http://howistart.org/posts/nim/1/
koch が何かはよく分かってないですが (たぶんpyenv 的なやつ)、
nimble というやつの設置が簡単でした。 (nimble は、 pipやcomposerと同じ、パッケージマネージャーらしいです。)
環境など
Nim
root@1421f749bd0f:/nim# nim -v
Nim Compiler Version 0.17.2 (2017-09-07) [Linux: amd64] Copyright (c) 2006-2017 by Andreas Rumpf
Nimble
root@1421f749bd0f:/nim# nimble -v
nimble v0.8.8 compiled at 2018-03-13 13:08:39
PHP
root@1421f749bd0f:/nim# php -v PHP 7.0.25-0ubuntu0.16.04.1 (cli) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache v7.0.25-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies
その他
ubuntu16.04 の docker 上に環境を構築しました。
PHP の Extension を作る
Extension を作るのは初めてだったので、都合はよく分かっていませんが、
https://github.com/nim-lang/nimble を使うと簡単に作れました (嘘)
とりあえず、上のレポジトリ のREADME をコピペしていきます。
3つファイルを作りました。
その後、コマンドを実行しました。
一応、nimfun.nim
ファイルだけ (僅かに) 変更したので貼っておきます。
import nimzend import math proc max(a: int, b:int): int = if a > b: return a return b proc min(a: int, b:int): int = if a < b: return a return b proc nimFun(a: int, b: int): ZValArray {.phpfunc.} = result["add"] = a + b result["sub"] = a - b result["concat"] = $a & $b var arr = zvalArray() arr.add a arr.add b result["array"] = arr result["mean"] = (a + b) / 2 result["max"] = max(a, b) result["min"] = min(a, b) finishExtension("nimfun.so", "0.1")
ハマリどころ
Nimble のインストール
上に貼った記事通りにやるのが良いと思います。
Nim version 0.15.0
以上は、 Nimble が Nim についてきてるとか。
最初はそのへんが全く分からず闇の中にいました。
PHP のインストール
以外なことに (?) PHP のインストールにハマリました。
apt install php
ではなく、apt install php-dev
を行う必要があります。
実行結果
とりあえず、実行結果貼ります。
root@1421f749bd0f:/nim# php test.php Array ( [add] => 220 [sub] => -20 [concat] => 100120 [array] => Array ( [0] => 100 [1] => 120 ) [mean] => 110 [max] => 120 [min] => 100 )
わお!PHP の配列として扱えてる!
ということで、もう少しNim で遊んでみようと思います。 (情報少ない)