トップ «前の日記(2014-02-14 (Fri)) 最新 次の日記(2014-05-21 (Wed))» 編集

uDiary

海野秀之(うんのひでゆき)の外部記憶

Twitter (twilog) / RSS / アンテナ / ぶくま

2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|

2014-05-14 (Wed)

[Haskell][Tiger] Modern Compiler Implementation in Haskell?

Haskell で、Haskell コンパイラを書いてみたいなぁと思うものの、手も足もでない日々、っていうか、 なんにもできてない日々続行中だったのですが、ふと、読みかけの本があったのを思い出した。 "Modern Compiler Implementation in ML" である。

もう、ML 覚える気まったくないんだけど、この本は好きなので、再挑戦しよう。 ただし、Haskell でかく。

たとえば、Program 1.5 Representation of straight-line programs は、ML ではこうなのだが、

type id = string

datatype binop = Plus | Minus | Times | Div

datatype stm = CompoundStm of stm * stm
             | AssignStm of id * exp
             | PrintStm of exp list
     and exp = IdExp of Id
             | NumExp of int
             | OpExp of exp * binop * exp
             | EseqExp of stm * exp

わりとあっさり Haskell でも書ける:

-- Tigerbook PROGRAM 1.5
-- Representation of straight-line programs.

type Id = String

data Binop = Plus | Minus | Times | Div

data Stm = CompoundStm Stm Stm
         | AssignStm Id Exp
         | PrintStm [Exp]

data Exp = IdExp Id
         | NumExp Int
         | OpExp Binop Exp Exp
         | EseqExp Stm Exp

わーい。パターンマッチのない言語で書くのは苦しそうだけど、Haskell だったらよゆーだ。

maxargs も書いてみた:

-- maxargs
maxargs :: Stm -> Int
maxargs stm =
  case stm of
    CompoundStm stm1 stm2 -> max (maxargs stm1) (maxargs stm2)
    AssignStm _ e         -> maxargs_exp e
    PrintStm es           -> max (length es) (maxargs_es es)
  where
    maxargs_es :: [Exp] -> Int
    maxargs_es [] = 0
    maxargs_es (e:es) = max (maxargs_exp e) (maxargs_es es)
    maxargs_exp :: Exp -> Int
    maxargs_exp e =
      case e of
        EseqExp stm _ -> maxargs stm
        _             -> 0
*Main> maxargs prog
2

ふむ。

よーし、この調子で Tigerbook も読めて、Haskell も書けるようになるんだ(ったらいいな)。


2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|
Categories 3imp | Card | Cutter | Dalvik | Euler | Football | GAE/J | Hand | Haskell | Re:View | Ruby | Scheme | TQD | Tiger | TigerBook読 | UikiTeXi | Verilog | Violin | Web | parconc | tDiary | お勉強 | エントロピー | ツン読 | | 将棋 | 政治について | | 模写してみよう | 確率論 | 設定など | 雑文 | 音声