HaskellでCodeGenを作る
コード生成部分の処理をどう書くか
HaskellでLLVMを触る
https://www.micahcantor.com/blog/js-to-asm-in-hs/
JavaScriptをアセンブリに変換する解説
問題になりがちなところ
変数のコンフリクトの解消
インデントの整形
Prettyprinterを使ってみるとか?
ElmのReportingではこれを使ってる
https://haskell.e-bigmoon.com/posts/2018/03-30-prettyprinter.html
nestという関数がある
http://hackage.haskell.org/package/prettyprinter
"{"でネスト深めて開業、"}"でネスト浅くして開業
;で開業する
estroem/C-compiler-in-Haskell-v2
アセンブリを吐くCコンパイラ
コード生成のコードもある
キレイだし参考になりそう
ちなみにv1もある
HaskellでASTからのコード生成(1) Writer+Stateモナドによる構造化 - プログラミングの実験場
GADTを用いる
コード
https://gist.github.com/nebuta/6128460
https://gist.github.com/nebuta/6128623
型クラスで tagless DSL メタプログラミング - keigoiの日記
概要
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);
}
https://keigoi.hatenadiary.org/entry/20111102/1320222417
language-c-quoteというライブあっ利
http://hackage.haskell.org/package/language-c-quote
Template Haskell?を使ってる