JHC

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について書いていなかったので元ネタがある気がする。