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を繰り返し適用する
code:c
for(i=0; i<10, i++) {
printf("%d", i);
}