はじめに GHCではHaskellのソースコードをコンパイルするときに、いくつかの中間コードを経由する。 C--(Cmm)を理解する第一歩として、これを中間言語とするBrainf*ckコンパイラを作成してみる。つぎのように、段階的に実装していく予定だ。 Brainf*ckのコードを人力でCmmにコンパイルして、GHCで実行可能ファイルを作成する(この記事) Brainf*ckの(Cmmへの)コンパイラをGHCで作成する(現在は、ここまで) テキストファイルとしてCmmのソースコードを出力する テキストファイルとして出力するのではなく、Cmmの(GHC内で使われる)構文木を生成して、直接、実行可能ファイルを生成する 生成されるCmmを最適化されたものにする +や-のn個の連続を、それぞれ、値にnたす、値からnひく命令として解釈する メモリへの最初の+や-、そして[-]のあとの+や-を、たし算
![C--(あるいはCmm)を中間表現とするBrainf*ckコンパイラを作成する - (1) 人力コンパイル - Qiita](https://cdn-ak-scissors.b.st-hatena.com/image/square/611920a8d1240ffbd1a2c35ba1e2326f87deed14/height=288;version=1;width=512/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Fadvent-calendar-ogp-background-7940cd1c8db80a7ec40711d90f43539e.jpg%3Fixlib%3Drb-4.0.0%26w%3D1200%26mark64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9Qy0tJTI4JUUzJTgxJTgyJUUzJTgyJThCJUUzJTgxJTg0JUUzJTgxJUFGQ21tJTI5JUUzJTgyJTkyJUU0JUI4JUFEJUU5JTk2JTkzJUU4JUExJUE4JUU3JThGJUJFJUUzJTgxJUE4JUUzJTgxJTk5JUUzJTgyJThCQnJhaW5mJTJBY2slRTMlODIlQjMlRTMlODMlQjMlRTMlODMlOTElRTMlODIlQTQlRTMlODMlQTklRTMlODIlOTIlRTQlQkQlOUMlRTYlODglOTAlRTMlODElOTklRTMlODIlOEIlMjAtJTIwJTI4MSUyOSUyMCVFNCVCQSVCQSVFNSU4QSU5QiVFMyU4MiVCMyVFMyU4MyVCMyVFMyU4MyU5MSVFMyU4MiVBNCVFMyU4MyVBQiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzM0EzQzNDJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9N2M1NDhhYTdjNDAwYjVmMjE3NmM1Y2MzYzRjZWQyM2Y%26mark-x%3D120%26mark-y%3D96%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9OTcyJnR4dD0lNDBZb3NoaWt1bmlKdWpvJnR4dC1jb2xvcj0lMjMzQTNDM0MmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz0yNmE1NWE0YzRmN2I4ZTI5N2RiMWE5YWJlMzNmYzg0Mw%26blend-x%3D120%26blend-y%3D500%26blend-mode%3Dnormal%26s%3D6cec8e2825aee5ffc38d3e3651feeddd)