MySQLのバインディングを追加しました

やっぱりハッシュテーブルだけだとキツイです・・・
で、餅は餅屋ということでMySQL 5.1 C APIバインディングを追加しました。

$ ypsilon
Ypsilon 0.9.6-trunk/r443 Copyright (c) 2009 Y.Fujita, LittleWing Company Limited.
> (import (ypsilon mysql))
> (define NULL 0)
> (define user "root")
> (define passwd "...")
> (define mysql (mysql_init NULL))
> (if (zero? (mysql_real_connect mysql "localhost" user passwd "mysql" 0 NULL 0))
      (display (mysql_error mysql))
      (display (mysql_stat mysql)))
Uptime: 52318  Threads: 1  Questions: 7  Slow queries: 0  Opens: 12  Flush tables: 1 ...
> (mysql_close mysql)

このままだと使いにくいので何か考えたいですね :)

nanoasm version 1.0

Digammaに使うJITアセンブラをtrunkにコミットしました。必要な分の小さな命令セットだけを扱うので名前は"nanoasm"です :)

テストでは1000万命令以上をアセンブルしてyasmの結果と比較しています。数時間かかって面倒なのですが・・・ミスアセンブルで地獄を見るよりはいいですよね :p

C++ JIT Assembler for Digamma

ディガンマはバグと戦ってこれを倒した。
ディガンマは経験値とJITアセンブラという名前の武器を手に入れた :)

Schemeアセンブラだけだとブートストラップが面倒なのでC++だけで使えるものを作っちゃいました。IA32とAMD64(Intel64)の基本的な命令だけをサポートした「おれおれ仕様」のオリジナルです:p

続きを読む

Digamma - Tracing JIT Compiler for Ypsilon

ネイティブコード生成についていろいろと考えていましたが、Tracing JITと呼ばれるものを試してみることにしました。

Tracing JITでポイントとなるのはインタープリタコンパイル済みのコードの切り替えに起因するオーバヘッドかと思います。またYpsilonではConcurrent GCの性能を落としてはいけないという制約がありますのでなかなか難しいです。

でも、面白いことにConcurrent GCとTraicing JITが上手くかみ合うとネイティブコンパイラの性能を越えるケースも出てくるようです。

まず、Ikarusより速くなるという特別なケースを紹介しましょう。

(define map-1
  (lambda (proc lst)
    (if (null? lst)
        '()
        (cons (proc (car lst))
              (map-1 proc (cdr lst))))))

(define minus (lambda (x) (- x)))
(define lst (make-list 1000000 1))
(define sink #f)
(time (set! sink (map-1 minus lst)))

結果は・・・

Linux ubuntu-core2 2.6.27-11-generic #1 SMP Thu Jan 29 19:24:39 UTC 2009 i686 GNU/Linux
   
Ikarus
  5 collections
  269 ms elapsed cpu time, including 168 ms collecting
  273 ms elapsed real time, including 168 ms collecting
  20558328 bytes allocated

Ypsilon 0.9.6-trunk/r417
  0.303697 real    0.536033 user    0.000000 sys

Ypsilon 0.9.6-trunk/r417 + Digamma(Tracing JIT)
  0.211938 real    0.416026 user    0.000000 sys (*1)

これはmap-1だけをコンパイルしてminusはインタープリタで実行した場合の結果です。minusが1000000回ほど実行されることを考えれば、何かを間違えていると思えるような結果ですね :D(念のため繰り返しますが、これはあくまで特別なケースですよ!)

続きを読む

FFIに可変引数(variadic arguments)のサポートを追加しました

こんな風に使えます :D

> (import (ypsilon ffi))
> (define libc (load-shared-object "libc.so.6"))
> (define printf (c-function libc "libc" int printf (char* ...)))
> (printf "test %d %f %s %e\n" 100 100.0 "こんにちは" 0.0001)
test 100 100.000000 こんにちは 1.000000e-04