JHC
jhc使った事無いとか、マジ小学生までなんですけど、本当に。。。
って言われたので、jhcを使ってみましたとも。
jhcの事なんか皆さん私ごときに説明されたくないでしょうけど、図々しくそして誤解を恐れずに言うと、Cのコードを吐いてそいつから実行ファイルを作り出す処理系で、C++と同じぐらい速くするのが目的で、デフォルトではGCが無いとの事。
http://repetae.net/computer/haskell/DrIFT/drift.html
DrIFTを入れる所で躓いた感じ。aclocalですね。そして意味不明な所はコメントアウトする。
これで入れられました。
で実際に使ってみた所、Cのコードと、"エスケープシーケンスによって強調、色づけされている"GrinというDSL(??)のコードが吐かれます。
そいでもって、このCのコードをコンパイルする事で実際に実行ファイルを作る事が出来ました。これは凄い・・・
##tak functionで一応比較してみると、ghc -O3とjhcの生成コードではjhcの方が速いです。結構、というかかなりというか。
Grin語とか気になる。
tak :: Int -> Int -> Int -> Int tak x y z | x <= y = z | otherwise = tak (tak (x-1) y z) (tak (y-1) z x) (tak (z-1) x y) main = print $ tak 30 10 2
↓
-- jhc tak.hs -- jhc 0.5.20080307 (frinredvos-2) -- Functions fW@.fJhc.Inst.Show.showWord :: bits32 &N -> [N] fW@.fJhc.Inst.Show.showWord w910299699 ni2061373997 = do let fW@.fR@.fJhc.Inst.Show.showWord w1944 ni1946 = do w486 <- w1944 / 10 w524 <- w1944 % 10 w2078 <- 48 + w524 ni209771154 <- store (CJhc.Prim.Char w2078) case w486 of 0 -> return (CJhc.Prim.: ni209771154 ni1946) w0 -> do ni2068320815 <- store (CJhc.Prim.: ni209771154 ni1946) fW@.fR@.fJhc.Inst.Show.showWord w486 ni2068320815 in fW@.fR@.fJhc.Inst.Show.showWord w910299699 ni2061373997 b_main :: -> [] b_main = do ftheMain ftheMain :: -> [] ftheMain = do w470 <- fW@.f328 30 10 2 w100002 <- 0 `Gt` w470 let f342 ni340 = do nd100004 <- eval ni340 let f608 ni616 = do nd100008 <- eval ni616 case nd100008 of (CJhc.Prim.: ni620 ni622) -> do nd100010 <- eval ni620 (CJhc.Prim.Char w192) <- return nd100010 (void)jhc_utf8_putchar(int) w192 f608 ni622 [] -> return () in f608 ni340 (void)jhc_utf8_putchar(int) 10 in case w100002 of 1 -> do w586 <- (bits32)Neg w470 ni588 <- store (FW@.fJhc.Inst.Show.showWord w586 &[]) ni172 <- store (CJhc.Prim.: &(CJhc.Prim.Char 45) ni588) f342 ni172 0 -> do ni178 <- store (FW@.fJhc.Inst.Show.showWord w470 &[]) f342 ni178 fW@.f328 :: bits32 bits32 bits32 -> [bits32] fW@.f328 w472 w474 w476 = do w100012 <- w472 `Lte` w474 case w100012 of 1 -> return w476 0 -> do w350 <- w474 - 1 w352 <- w472 - 1 w366 <- w476 - 1 w502 <- fW@.f328 w366 w472 w474 w522 <- fW@.f328 w350 w476 w472 w542 <- fW@.f328 w352 w474 w476 fW@.f328 w542 w522 w502
syntaxは関数型言語っぽいけど、やってる事は命令的。
まぁ最適化しちゃった結果かもしれないけども・・・。
それと、これは型は無い感じなのかな。多分Haskellのコードの時点で型チェックは通ってるからcompile(かtranslate)する時にバグが無ければ型安全で有る事は分かっているという感じなのかしら。
jhcのページにはgrinについて書いていなかったので元ネタがある気がする。
paper
http://www.cs.chalmers.se/~boquist/phd/index.html via http://madscientist.jp/~ikegami/diary/20070924.html
347pは洒落になってない。