x86_64

配列を作る

今週末は配列を作ってました。 だいたいコンパイルは通ったのだけど、もう少しの所で止まってます。ポインタ操作は64bitつまり8byte単位で行うことになるので、サイズや、レジスタの取り扱いがちょいと面倒なのですが、慣れの問題なのかな?先にlong(8byte長…

アセンブラを学びながらScalaで作るコンパイラバックエンド入門(未完成)

http://hsk.github.com/timi/ソースコード http://github.com/hsk/timi/アセンブラを学びながらScalaで作るコンパイラバックエンド入門(未完成) を書いていた物を公開しました。未完成ですいませんが、徐々にバージョンアップしていく予定ですのでよろしくお…

コンパイラ入門

上からなめて、細かい修正をして、うーん。変な文章だなぁっと思ってます。 あと、バグがあるから、バグは潰さないとなぁ、テストしないとなぁ、ぐふっ っていうところで、バグがあったほうがいいのかもしれないけど、ないほうがいいかもしれず うーんっと悩…

社内のDev会で発表しました

ちょっと前に、時間貰ったので、今作ってるコンパイラの話をしました。最近はふと、flashのパーサの仕様を記述しておいて、パーサ自動生成だーっと思って、作りはじめて、優先順位地獄にはまって大変です。 普通のパーサのほうが楽なんじゃないかと思い始め…

AST2ST

抽象構文木から構文木への変換プログラムです。 手抜きはありますが、いちお、変換出来マッス。 object st2ast { def main(argv:Array[String]) { val st = ( ("main","=",("fun","(","void",")",( ("a","=",("add","(",((1,",",2),",",3),")")), "@", ("pri…

変換イメージ

コンパイラを作る上で大切なのがどんなデータがどう変換されていくかというイメージです。 それがはっきりしていればずっと、作るのが楽なはず。 そして、それだけを書き出してみるのはいい練習になると思います。 ということで、書いてみました。ソースコー…

パーサを書きなれよう

コンパイラのバックエンドを作っていて、あとはフロントエンドをくっつければ完成なわけですが、 フロントエンドも1からささっと作りたいけど、疲れて作れないのは悔しい。 ということで、1からささっとパーサを作る練習をしております。scalaで、clean bo…

関数ができたぞと

とりあえず、今週末は関数コールのコンパイルを作りました。 1から作るのは初めてなので、偉い、リファクタリングが必要だぁ。構造が変わるぅ。分けわかんねぇ。 あっちもこっちも直さないといけねぇ。っと、いろいろ大変でした。 でもまぁ、出来ました。 …

関数の定義だけ考える

昨日は、なんだか悩んでしまってたのですが、 関数には関数の呼び出し部分と、関数定義の2つがあって、当たり前なんですけど、 昨日はごっちゃになっていたので今日は関数定義の方だけ考えることにしました。 ということで、もう一度最初から int a(int a,i…

関数コール

Macでの関数の呼び出しについて調べないと、関数が実装出来ません。 ということで、関数コールについて調べてみます。 void a(int a,int b, int c,int d, int e, int f, int g, int h,int i, int j) { printf("%d\n", a+b+c+d+e+f+g+h+i+j); } void ac() { a…

やっぱり、独自路線を行くことに

今、必要なのは、関数型言語で書いた、とっても簡単なネイティブコンパイラ入門なのです。 なので、特にレジスタ割り付けは必要なくて、メモリに割り付けてしまうのがいいんです。 でもって、プログラムはリストになっていて、そのリストをコンパイルするだ…

アセンブラ出力練習ソース

最近は、時間もないので、1日に1回くらい、Ifまでのアセンブラ出力部を空で書けるように練習してみてます。 以下が、昼休みに書いたアセンブラ出力部のプログラムです。 作成順、1、hello world的プログラムを書きます。 2、test.cという、printIntとpri…

方針をちょっと変えた

今週末は、アセンブラ周りのif文について考えてました。 で、いろいろ悩んだ結果、mincamlのscalaバージョンのemit_x86.scala周りを修正して、というか削って、 こんな感じっていうプログラムを作って、いちお出来たことにしました。情けないんですけど、俺…

コンパイラ動く

現状、a=1+2*3+4/5みたいな式をb=1 c=2 d=3 e=4 f=5 a=b+c*d+e/f と展開するプログラムと a=b+c*d+e/f をi1 = c*d i2 = b + i1 i3 = e / f i4 = i2 + i3 a = i4 のように展開するプログラムを作って、コンパイル出来るようになりました。 ここの展開を自分で…