2014年10月17日金曜日

purple dragon bookのAppendix Aにあるfront-endについて

色々考えたのですが、いきなりLexican scanner generatorをJuliaでゴリゴリ書き始めるのも一つですが、LLVM系の知識が足りないのをどう獲得していこうかと考えていました。

そこで、Lexier -> Parser -> LLVM front-end という順を少し変更して、まずはpurple dragon bookのAppendix Aにある、簡単な言語のfront-end (Javaで書かれています)を、Juliaに移植してみてはどうだろうか、と思うに至った訳です。

このJavaで書かれた900行弱のfront-endは簡単なプログラミング言語のフロントエンドで、three address codeを出力します。dragon bookのfront-endのプログラミング言語とthree address codeとは、こんな感じの表現です。

# purple dragon book の俺言語
{
int a; int b; int c; int d; float term;

a = b + c;
a = b - c;
a = b * c;
a = b / c;
a = -b;

d = a - b - c;
d = a * b * c;
d = a + b * c;
d = a * b + c;

d = (a - b) - c;
d = a - (b - c);
d = (a + b) * c;
d = a * (b + c);

        term = b*b -4.0*a*c;

}

# 出力されたthree address code
L1: a = b + c
L3: a = b - c
L4: a = b * c
L5: a = b / c
L6: a = minus b
L7: t1 = a - b
d = t1 - c
L8: t2 = a * b
d = t2 * c
L9: t3 = b * c
d = a + t3
L10: t4 = a * b
d = t4 + c
L11: t5 = a - b
d = t5 - c
L12: t6 = b - c
d = a - t6
L13: t7 = a + b
d = t7 * c
L14: t8 = b + c
d = a * t8
L15: t9 = b * b
t10 = 4.0 * a
t11 = t10 * c
term = t9 - t11
L2:

仮にJava front-endをそのまま100%意味を温存してJuliaに移植してみても、肝心のthree address codeが動くエミュレーターなどがなければ、実装してもサンプルのソースコードをrunすることはできません。そこで、dragon book流のthree address codeではなく、LLVM IRを出力したらどうか、と考えつきました。

おそらくこのぐらいの大きさのプログラミング言語(ソース言語)ならば、LLVM IRのほんの小さなsub setしか使わないと思いますし、LLVM IRの簡単な勉強になるかなぁと思った次第です。ただそのためにソース言語は少し変更しなければ成らないかもしれません。

ひとまずGitHubにrepo掘って、少しづつ移植してみたいと思いました。

同時にLLVM IRの勉強のために http://llvm.org/releases/3.5.0/docs/tutorial/index.html などを読み進めながら移植を進めたいと思います。

同時にpurple dragon bookのchapter 3(Lexical Analysis)を読んで、Lexの構造について勉強したいと思います。基本的なことは分かっているつもりですが、実装するのに必要な細かい知識、深い知識が欠けていると思うので、少しづつ読み進めたいと思います。

というわけで、TODOリスト


  1. purple dragon bookのfront-endをJulia移植する
  2. http://llvm.org/releases/3.5.0/docs/tutorial/index.html のチュートリアルを読んで、LLVM IRとLLVM front-endの実装に詳しくなる
  3. purple dragon bookのLexical Analysisの章を精読する
ですね。

あ、ちなみにpurple dragon bookは洋書(古い版)を読んでいます。紹介した和書ではないです。

0 件のコメント:

コメントを投稿