2016-02-01から1ヶ月間の記事一覧
そういえばドラゴン本を買いました。これを参考にしてコンパイラ制作を加速させます。第5回で字句解析と構文解析を行いました。四則演算や関数適用などの簡易的な入力に対し、それを構文解析して抽象構文木を出力しましたが、今度はそれを変換します。例えば…
LLVM を用いて FizzBuzz を書きました。色々と躓いた点があったので、それを記述しておきます。まずはプログラム本体から @s1 = constant [10 x i8] c"FizzBuzz\0A\00" @s2 = constant [6 x i8] c"Buzz\0A\00" @s3 = constant [6 x i8] c"Fizz\0A\00" @s4 = …
引き続いて LLVM を勉強します。今回は、 FizzBuzz のC言語プログラムを LLVM に変換して、その内容を確認してみようと思います。C言語の FizzBuzz プログラムです。 #include <stdio.h> int main(void){ int i; for(i = 1; i <= 100; i++){ if(i % 15 == 0){ printf(</stdio.h>…
LLVM の勉強と平行して、コンパイラについて勉強します。コンパイラは、プログラムの入力から中間コード生成までの間に、字句解析と構文解析の作業を行います。ただの文字列からトークン列、構文木というように変換していきます。字句解析と構文解析はプログ…
ある場において出発地点、目的地点、通過可能な場所が与えられた時、出発地点から目的地点までたどり着くことが可能かどうかを判定する到達可能問題を解こうと思います。問題を想定します。幅 width 高さ height の場が与えられ、出発地点と目的地点が与えら…
第2,3回で x_86-64 のアセンブリに手を出してみましたが、プログラムをいきなりアセンブリに変換するのは困難です。普通は中間コードを経てアセンブリ、機械語に変換されます。色々調べてみると LLVM というものがあってそれ用の中間コードを作ると、あとの…
C++ と OCaml でダイクストラ法の実装を行いました。 ダイクストラ法では、夫々の辺に負でない長さが与えられたグラフ上で、二つの頂点間の最短距離とそれを与える経路を求められます。まずグラフを用意します。 インターネット上でいい感じのグラフを見つけ…
自作言語を作っている途中ですが、様々な手法を学習するため、 MinCaml という言語のコンパイラを作りながら関数型プログラミング言語のコンパイラ作成の概形と内容について学びます。MinCaml というのは OCaml のサブセットのような言語で、検索するとわか…