Playing with Pure

by syoyo

http://pure-lang.sourceforge.net/

コンパイルが通ったのでちょっと遊んでみました.

Pure 言語とはなんぞや

Pure とは、和○○○○主演のドラマで,,, と
信頼関係のコントのネタに出てきそうですが、
そうではなくて、
項書換え(term rewriting)ベースの関数型言語です。
Pure 言語の開発者は、同じような特徴の言語として、
Q 言語をすでに開発していますが、
Pure 言語はそれの後継を目論んでいるようです.

Pure 言語が Q 言語と異なるところは、
先進的な言語的特徴を取り入れているところと、
LLVM バックエンドの採用で高速に実行できるところです.
(どんだけ高速に実行できるのかは不明)
また LLVM バックエンドを採用していることで、
C 言語との親和性も高いです.

とりあえず使ってみる

pure 言語は、かなり C 言語に似ています.
コメントは C/C++ と同じ //, /* ~ */ になっています.
また、式の終わりには ; が必要です.

PURELIB の環境変数が通っていないと、
式を評価してくれなかったり、サンプルが動かないので注意です.


$ pure
> square x = x * x;
> square 5;
5 * 5

$ export PURELIB=/path/to/pure/lib
$ pure
> square x = x * x;
> square 5;
25

system.pure 標準モジュールを使うことで、
標準 C 関数を使うことができます.


> using system;
> puts "The world!"
The world!
11
> puts "Time stops"
Time stops
11

最後の 11 は文字数でしょうか.


fact n  = n*fact (n-1) if n>0;
        = 1 otherwise;

if や otherwise のようなガードが後ろに記述され、
Pure では数式に近い書き方になっています。
Haskell などだと前の方に記述されますね。


fib 0 = 0;
fib 1 = 1;
fib n = fib (n-2) + fib (n-1) if n > 1;

まじめな再帰ベースの fibonacci コード。

python, Haskell でもおなじ再帰ベースの fibonacci を記述し、
fib 35 で速度を計ってみたところ,

Pure: 51 sec(JIT 込み)
Python: 16 sec
Python(+psyco): 1 sec
Haskell(runhaskell): 4 sec

でした、うむむ、fib では LLVM の恩恵はないようです.


> diff x (u+v)    = diff x u + diff x v;
> diff x (u*v)    = u*diff x v + v*diff x u;
> diff x y        = 1 if str x==str y;
>                 = 0 otherwise;
> diff x (5*x*x+2*x+10);
5*x*1+x*(5+x*0)+(2+x*0)+0

シンボリックな微分処理もお手のもの.

system.pure を見てみる

標準ライブラリである system.pure を見てみると、
以下のような定義を見つけることができます.


extern FILE* fopen(char* name, char* mode);
extern FILE* popen(char* cmd, char* mode);
...

うわっ、まんま C 言語だ.

list command

list というインタプリタの組込みコマンドで、
シンボルの情報がいろいろ見られる.
-d でLLVM IR のディスアセンブルコードも見れる.


> square x = x * x;
> list square
square x = x*x;
> list -d square
square x = x*x;

define internal fastcc ...

まとめ

– できたてほやほや. うぶうぶ.
– LLVM バックエンド
– C 言語との親和性
– 実装がコンパクト
– 数学的な書き方がしやすいと思う

言語的な特徴がよさげなのと、LLVM バックエンドということで、
しばらく注目してみたいと思います.

Advertisements