プログラミング言語を作るということ

汎用的なプログラミング言語を作るということは、成功は多くのユーザーを獲得し使ってもらうことにあるだろう。
しかし、おそらく、100つの自作言語があれば1つの言語が成功するか否かだろう。
それだけ、プログラミング言語を開発し使ってもらうことは難しい。

まず、はじめにそれなりの言語を作り発表する。しかしほとんどの場合見向きもされない。
そこで、プログラミング言語を作って失敗するトラウマを抱えることになる。
これはモチベーションに大きく影響して、失敗を恐れて完成したものを作ることを避けるようになってしまうように思う。
完成したのに、相手にされない恐怖があるのだ。


それを克服するには成功イメージを常に持っておくといい。
ということで、出来たら、ああなってこうなってという、成功イメージを描きましょう。
なに、そんなに難しいことじゃないです。
俺の言語が出来上がれば、仕事でもちろん使えるし、マクロで仕事楽できるし、いいことづくめだと。

いうことで、じゃあ、何しようという話になるので今後の目標

1.MinCamlScala版を動かせるようにする。
2.CompactのScala版のsbaz登録。
3.CompactをMinCamlのフロントエンドにする。

ま、こんなところでいいかなと。大きすぎる目標は達成できないと思うので。
でもやる気が出ない。具体的にどうするかイメージがなくて嫌なのよね。

Scala版は各フェーズごとに理解を進める。
まずは、単純なprintを各フェーズごとに行っていく。Scalaならpretty printな関数を書かなくても自動的にできるので楽チンだ。

フェーズは11フェーズで、3までは理解してるつもりなので4のK正規化から把握していけばいいってわけです。

1.字句解析(Lexer.token)トークン列を作る
2.構文解析(Parser.exp)抽象構文木を作る
3.型推論(Typing.f)   型を決める
4.K正規化(KNormal.f) 構造を平たくする
5.α変換(Alpha.f)変数名をユニークにする SSAみたいなやつ
6.最適化(iter)
6.1.β簡約(Beta.f)等しい変数を置き換える
6.2.ネストしたletの簡約(Assoc.f)括弧内Letを平たくする
6.3.インライン展開(Inline.f)関数呼び出しの展開
6.4.定数畳み込み(ConstFold.f)値が分かっている計算を計算して定数にする
6.5.不要定義削除(Elim.f)使われない変数、関数の削除
7.クロージャ変換(Closure.f)ネスト関数を平らに
8.仮想マシンコード生成(Virtual.f)
9.SPARCの13 bit即値最適化(Simm13.f)
10.レジスタ割り当て(RegAlloc.f)
11.アセンブリ生成(Emit.f)

とここまで書いて、やる気出たので、ガッとmainを修正していちお、アセンブラを出力できるようになった。
だけど、spark用だった。orz

ということで、x86用の物を移植(といっても未完成らしいのだけど)で、アセンブラ出力は出来たけど、
windowsじゃうごかないのかな?というところまで進んだのでした。