トップ «前の日記(2014-07-18 (Fri)) 最新 次の日記(2014-07-28 (Mon))» 編集

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-07-19 (Sat)

つぶやき

Tiger in Haskell のコンパイルに -Wall つけたら、おびただしい数の警告が。


はじめから -Wall つけておくべきだったか。
新しく書くコードでは警告でないように。すでに書いたコードからも、すこしずつ警告の数は減らしていこう。


8章は、もうひととおり読んだので、 canon.sml を Canon.hs へ翻訳写経する。
これから書くコードは -Wall でも警告でないように。


[Tiger][Haskell] chap7 中間コードへの変換

https://github.com/unnohideyuki/Tiger-in-Haskell/tree/master/chap7

きのう、おととい気づいた修正をやって、さらに、文字列比較を実装。

$ cat ../testcases/test6.tig
/* define valid mutually recursive procedures */
let

function do_nothing1(a: int, b: string)=
                do_nothing2(a+1)

function do_nothing2(d: int) =
                do_nothing1(d, "str")

in
        do_nothing1(0, "str2")
end

↑の処理結果は、こうなった↓(すこし手で整形してる)

$ ./driver.exe < ../testcases/test6.tig
(UNIT,[Proc {body = EXP (ESEQ (EXP (CONST 0)) (CALL (NAME "L0_do_nothing1") [TEMP 0,CONST 0,NAME "L3"])), 
             frame = Frame {name = "main", formals = [InFrame (-3)], locals = [], fp = 0}},
       Str "L3" "str2",
       Proc {body = EXP (CALL (NAME "L0_do_nothing1") [TEMP 5,TEMP 4,NAME "L2"]), 
             frame = Frame {name = "L1_do_nothing2", formals = [InFrame (-3),InReg 4], locals = [], fp = 5}},
       Str "L2" "str",
       Proc {body = EXP (CALL (NAME "L1_do_nothing2") [TEMP 3,BINOP PLUS (TEMP 2) (CONST 1)]), 
       frame = Frame {name = "L0_do_nothing1", formals = [InFrame (-3),InReg 2,InReg 1], locals = [], fp = 3}}])

以下の問題はいずれも直ってる:

  • 一次変数番号が重複していた
  • パラメータ変数の access をまちがっていた
  • L3 にあたる fragments が消えてしまっていた

また、

$ cat ../additonalcases/teststrcmp.tig
"ab" > "cd"

↑これは、↓こうなるようにしてみた。

$ ./driver.exe < ../additonalcases/teststrcmp.tig
(INT,[Proc {body = EXP (ESEQ (SEQ (CJUMP GT (CALL (NAME "_strcmp") [NAME "L0",NAME "L1"]) (CONST 0) "L2" "L2") (LABEL "L2")) (CONST 0)), 
            frame = Frame {name = "main", formals = [InFrame (-3)], locals = [], fp = 0}},
      Str "L1" "cd",
      Str "L0" "ab"])

results.log はボチボチ確認していくこととして、8章にすすもう。


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 | お勉強 | エントロピー | ツン読 | | 将棋 | 政治について | | 模写してみよう | 確率論 | 設定など | 雑文 | 音声