gorogoroyasu

福岡の開発会社で働いている。

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://nim-lang.org/

感想など: 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 で遊んでみようと思います。 (情報少ない)