HaskellでCodeGenを作る
JavaScriptをアセンブリに変換する解説
問題になりがちなところ
変数のコンフリクトの解消
インデントの整形
nest
という関数がある
"{"でネスト深めて開業、"}"でネスト浅くして開業
;
で開業する
アセンブリを吐くCコンパイラ
キレイだし参考になりそう
コード
概要
ASTからC言語のコードを生成する
中間言語を作らない代わりに汎用性の高いLang型クラスを作る
C言語用のインスタンスをつくる
今回の記事では解説されていないが、この型クラスを使えばC言語以外の言語用のインスタンスも作れる
ので、同じASTから様々なコードを生成できる抽象化になっている
関数だけでなく、if文、loopなども
いつ読み返したら役立ちそうか
コード生成をやるとき
やってることのメモ
型クラスLangについて
疑問
int
なんで真偽値は Exp l Bool
のみなのに、整数は Int -> Exp l Int
のように関数になっているんだ?
普通に Exp l Int
だけじゃだめなのか
ifThenElse
EB -> EI1 -> EI2 -> EI3
の形になっているが、なんで一階層深い?
if B then E1 else E2
なのなら、 EB -> EI1 -> EI2
じゃだめなのか?
loop
loop -> from -> to -> (acc) -> f
の形になっている
fromからtoまでaccumulatorにfを繰り返し適用する
cfor(i=0; i<10, i++) {
printf("%d", i);
}