「buyobuyon古」の編集履歴(バックアップ)一覧はこちら
「buyobuyon古」(2007/02/23 (金) 14:32:10) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
**buyobuyon古
2月より前の書き込みです。
メモもいくらか入っているので念のため残しておきます。
#comment(vsize=5,nsize=20,size=40)
***1/27(Sa)
なんだかんだで手こずっています…。いろいろ細かいところが気になって…。
とりあえず今日中に仮想マシンコード生成を仕上げて、
明日くらいから試験勉強を始めたいのですが。
そうすると、とりあえず動くコンパイラ(最適化無し)完成が、
試験終了から1週間+α後くらいになると思うのですが、それで大丈夫ですかね?
- 私も今日EXW書いてしまったら、&br()試験勉強に入るつもりです。&br()(動作テストとかしないままに放置するのはちょっと怖いですが…)&br()&br()で、テスト後に動作テストをしようと思っています~。&br()でも、せいぜいfibくらいなんで大丈夫です☆&br()(i.e.手書きで事足りることくらいしかしないです)&br()FPUを乗せるのはfibが動いてからということで… -- yastak (2007-01-27 16:57:51)
- コンパイラ制作の遅れのせいでいろいろとご迷惑をおかけしてしまって申し訳ないです。&br()完成すれば早速min-rtのコンパイルもできると思うのですが。&br()&br()仮想マシンコード生成の方は…、なかなか終わりません…。1000行はいきそうだな…。 -- buyobuyon (2007-01-27 19:38:51)
- 1000行。。。&br()すごいですね。&br()Cのコンパイラやった人はほとんどいないみたいから&br()是非頑張ってくださいね〜☆&br()&br()私も明日くらいにシミュレータのFPUをとりあえず完成させて、&br()はやくテスト勉強の入らなきゃ。(harry) (2007-01-27 21:05:42)
- 中間発表3のページに進捗状況を書き込んでおきました。&br()harryさん、資料の作成、よろしくお願いしますね。 -- buyobuyon (2007-01-27 22:26:21)
- メモ:仮想マシンコード生成以降は、ntypeの中身がいい加減になる。別に問題はないはず(そもそも、型の情報はこの時点で捨ててしまっても良いはず)。 -- buyobuyon (2007-01-28 00:54:44)
- 仮想マシンコード生成、たった今、記述し終わり、&br()これから(今日やる元気はないので明日以降)デバッグに入ります。&br()ぴったり999行…、ヘッダファイルと合わせると1000行超えますね。&br()とはいえ、無駄な記述が多いので、1000行以内に収めるのは簡単ですが。 -- buyobuyon (2007-01-28 02:38:13)
- 動きました。寝ます。&br()一応、fibの仮想マシンコードを載せておきます。&br()&br()FUNCTIONS: &br()&br() function fib_00000002&br() args: x_00000003 &br() body: &br() __knvar_0000000b := &br() CONST(1)&br() __knvar_0000000c := &br() ILESS(__knvar_0000000b, x_00000003)&br() __knvar_0000000d := &br() BNOT(__knvar_0000000c)&br() return&br() IF __knvar_0000000d THEN&br() return&br() MOV(x_00000003)&br() ELSE&br() __knvar_00000007 := &br() CONST(2)&br() __knvar_00000008 := &br() ISUB(x_00000003, __knvar_00000007)&br() __knvar_0000000a := &br() CALLDIR(fib_00000002 __knvar_00000008)&br() __knvar_00000005 := &br() CONST(1)&br() __knvar_00000006 := &br() ISUB(x_00000003, __knvar_00000005)&br() __knvar_00000009 := &br() CALLDIR(fib_00000002 __knvar_00000006)&br() return&br() IADD(__knvar_00000009, __knvar_0000000a)&br()&br()&br()MAIN: &br()a_00000001 := &br() CONST(15)&br()c_00000004 := &br() CALLDIR(fib_00000002 a_00000001)&br()return&br() ()&br()&br() -- buyobuyon (2007-01-28 03:46:02)
***1/26(Fr)
引き続き仮想マシンコード生成実装中ですが、
外部変数関連で問題が見つかったので、K正規化付近を直しています。
***1/25(Th)
仮想マシンコード生成実装中です。
ワードアドレッシングにしたこととアラインメント問題が生じないこと(∵sizeof(int) = sizeof(float))、int/float混合型のレジスタにしたことのおかげで、かなり楽に進められそうな気がします。
とはいえ、ここらで構造体を新しくしたいので、その定義と生成・破棄関数、テスト用出力関数の作成に時間がかかりそうな気がします。
とりあえず、MinCaml同様、クロージャや組、配列はヒープ領域に保存することにします。
***1/24(We)
次は仮想マシンコード生成です。
ええと、ワードアドレッシングだと言うことは、
例えば、int型の配列は先頭アドレスがpならk番目の要素がp+kにあるのですよね?
***1/23(Tu)
ええと、クロージャ変換のテスト&デバッグの続きをやっています。
意外と正常に動作しているような気が…。
- やっぱり変数名にチルダがつくと気持ち悪いので、アンダースコアにしました。&br()アセンブラには影響なし。&br()ライブラリの一部をアセンブリ言語で記述する場合に、&br()変数名の末尾で"<アンダースコア><数値>"という形にならないよう気をつけてもらえれば。&br()"div_2"みたいな名前はだめ、"div2"や"div_by2"などはOKです。&br()別に"div_2"にしても、MLのソースの方でたまたま2つめに解析される変数の名前が"div"である場合にしか問題は生じませんが。 -- buyobuyon (2007-01-23 13:13:20)
- fib(15)を求めるプログラムのクロージャ変換はOK。&br()って、自由変数を持たない関数しかないので、あまり意味はないですが…。 -- buyobuyon (2007-01-23 13:22:17)
- 動作確認の前に、もっと賢い方のクロージャ変換にしてみました。&br()ちなみにfib(15)は次のようになりました。&br()&br()FUNCTIONS: &br()&br() function fib_00000002&br() args: x_00000003 &br() fvs: &br()LET __knvar_0000000b~11 (type(int)) = &br() INT(00000001)&br()IN&br() LET __knvar_0000000c~12 (type(bool)) = &br() LESS&br() VAR(__knvar_0000000b~11)&br() VAR(x_00000003~3)&br() IN&br() LET __knvar_0000000d~13 (type(bool)) = &br() BNOT&br() VAR(__knvar_0000000c~12)&br() IN&br() IF&br() VAR(__knvar_0000000d~13)&br() THEN&br() VAR(x_00000003~3)&br() ELSE&br() LET __knvar_00000007~7 (type(int)) = &br() INT(00000002)&br() IN&br() LET __knvar_00000008~8 (type(int)) = &br() ISUB&br() VAR(x_00000003~3)&br() VAR(__knvar_00000007~7)&br() IN&br() LET __knvar_0000000a~10 (type(int)) = &br() APPDIR&br() fib_00000002&br() VAR(__knvar_00000008~8)&br() IN&br() LET __knvar_00000005~5 (type(int)) = &br() INT(00000001)&br() IN&br() LET __knvar_00000006~6 (type(int)) = &br() ISUB&br() VAR(x_00000003~3)&br() VAR(__knvar_00000005~5)&br() IN&br() LET __knvar_00000009~9 (type(int)) = &br() APPDIR&br() fib_00000002&br() VAR(__knvar_00000006~6)&br() IN&br() IADD&br() VAR(__knvar_00000009~9)&br() VAR(__knvar_0000000a~10)&br()&br()&br()MAIN: &br()LET a_00000001~1 (type(int)) = &br() INT(0000000f)&br()IN&br() LET c_00000004~4 (type(int)) = &br() APPDIR&br() fib_00000002&br() VAR(a_00000001~1)&br() IN&br() Unit()&br() -- buyobuyon (2007-01-23 20:38:37)
- 一応、MAKECLSはなくなっていますね。&br()&br()問題はクロージャを作る必要がある時に正しく処理されるか…。&br()これからテストしてみます。 -- buyobuyon (2007-01-23 20:42:09)
- いくらか修正したところ、クロージャ変換は正常に動くようになりました。&br()コンパイラ演習第3回の講義資料に載っていた例と、その他の例をいくつか試してみましたが、&br()一応問題なく動作しました。&br()&br()min-rtも一応変換してみましたが、途中の最適化(不要定義除去など)が未実装であるためか、&br()MAKECLSが結構いっぱいできてしまいました…。&br()&br()まぁ、とりあえずは仮想マシンコード生成に移りたいと思います。 -- buyobuyon (2007-01-24 00:13:34)
***1/22(Mo)
"賢い"クロージャ変換("もっと賢"くはない)を記述し終えました。
が、実行してみたらセグメンテーションフォールトが出たので、まだまだかかりそうです。
- とりあえず、いろいろいじっているうちに危険な実行時エラーは出なくなりました。&br()とはいえ、まだ動作確認をするには至っていません。&br()&br()ひどく眠いので、続きはまた明日。 -- buyobuyon (2007-01-22 23:24:40)
***1/21(Su)
とりあえず、クロージャ変換の大まかな部分を書き上げたところです。
自由変数を探す部分がまだで、あと必要のないクロージャ生成をなくす部分も後まわしにしてあります。
混乱しながら書いたのでだいぶ間違っているような気がします。
デバッグにもそこそこ時間がかかるかと…。
ちょっと中間発表までに仕上げるのは無理のような気がします。
とはいえ、あまり先延ばしにしていられないので…。
***1/19(Fr)
昨日は無断欠席してしまい申し訳ありません。
何か最近体調が不安定で…。
とりあえず現在は、理不尽なテスト日程に驚きながらクロージャ変換実装中です。
- お大事にしてください~!&br()健康第一で、無理にあせったりしないでね! -- yastak (2007-01-20 15:11:44)
- テスト迫っていますよね。。。&br()&br()風邪を引かないように体を気をつけてくださいね~&br()お大事に -- harry (2007-01-20 15:49:39)
- ありがとうございます。&br()クロージャ変換実装中に型推論の一部&br()(型推論で型が決まらないものをint型と見なす処理)に&br()問題があることが発覚し、&br()そのあたりの自分のコードが解読できなくて今悩んでいます。&br()止まらないはずのプログラムがなぜか止まってくれる…。 -- buyobuyon (2007-01-21 13:55:18)
- 場合分けの一カ所でintとみなすのを忘れたという単純なミスでした。&br()止まらないはずのプログラムが止まるというのも、ただの勘違いでしたし。 -- buyobuyon (2007-01-21 14:06:02)
- メモ:MinCamlではKNormalizeの時点でNODE_ARRAYを外部関数の適用に帰着させているが、自作コンパイラではNODE_ARRAYのまま進めることにする。 -- buyobuyon (2007-01-21 17:07:44)
- メモ:ライブラリ関数の名前の末尾は "~数値"という形を避ける。 -- buyobuyon (2007-01-21 17:23:30)
- ↑読みにくいな…、"<チルダ><数値>"を避ける -- buyobuyon (2007-01-21 18:24:28)
- 不要なクロージャ生成をなくす処理(いわゆる、"もっと賢い"クロージャ変換)は次にまわして、とりあえず"賢い"クロージャ変換を行うことにする。 -- buyobuyon (2007-01-21 20:51:53)
***1/11(Th)
今日もコンパイラは進展なし。
tsuyさんが作成してくれたライブラリを眺めていました。
***1/9(Tu)
今更ですが、あけましておめでとうございます。
今年もよろしくお願いいたします。
ええと…、本当に申し訳ないです。前回書き込んでからまた何も進んでおらず…。
***12/31(Su)
ええと…、すみません。
今日が自分への締め切りだったはずなのですが…、全然進んでいません。
課題もろとも進行が止まっているもので…、ここらで気合いを入れないと。
とりあえず、良いお年を、ということで。
- それを聞いて安心…してる場合じゃないですよね、&br()同じくいまやっと必死です…。&br()&br()そして同じく、溜まった課題も休み中に何とかしたいですね(>_<)&br()お互いに頑張りましょう~。&br()良いお年を! -- yastak (2006-12-31 23:47:59)
***12/14(Th)
すみません、また風邪をひいてしまい、今日は休ませていただきました。
コンパイラは進まず、連続系の課題も終わらず…。
- やはり風邪でしたか。&br()お大事に。 -- tsuy (2006-12-14 22:43:59)
- ぉお、やはり…。&br()お大事にね!ノロウイルスにも注意です(>_<) -- yastak (2006-12-15 01:17:04)
- ありがとうございます。&br()朝、吐き気がしたので、最初はノロウイルス!!!と思ったのですが、&br()腹痛などは無く、むしろ喉や頭が痛い感じなので、ただの風邪のようですね。&br()まだ多少ボケ~っとしていますが(いつものことか…)、おかげさまでだいぶ良くなりました。&br()そして課題は進まず…。 -- buyobuyon (2006-12-15 17:30:35)
- 似たような時期に似たような状況でした。&br()お大事に~帰宅時に30秒以上も手を洗うと&br()風の予防になるみたいなのをテレビで見たけど、&br()果たして効果があるのだか。。。 -- harry (2006-12-17 16:33:01)
- harryさんもお大事に。&br()&br()う~、何か風邪がぶりかえしてきています…。&br()もしかしたら明日も休ませてもらうかもしれません。&br()何か急ぎで決めるべきことなどあれば、適当に決めておいてください。私がそれにあわせますので。&br() -- buyobuyon (2006-12-17 21:36:20)
***12/11(Mo)
予定表を埋めてみました。
一応、予定表通りに進めば、今年中にmin-rt.mlがコンパイルできるようになります。
まぁ(false → A)は恒真なので・・・。
今は連続系の課題を引きずっているので、ちょっと猶予をください。
***12/9(Sa)
A正規化について。
今回は、MinCaml同様、
let x = (if y then e1 else e2) in e3
のような末尾でないif式を認める、ゆるいA正規形を採用しました。
ところで、MinCamlのソースを見たところ、例えば
let (a, b) = let x = 5 in f x in a
をA正規化してもそのままで、
let x = 5 in let (a, b) = f x in a
とはならないようになっているような気がするのですが、
このように変換すると何か問題が生じるのですかね?
それともK正規化の時点でこの形が現れないようになっているとか?
- どうやらそれっぽいなぁ…。&br()Syntax.LetTupleのK正規化のところにinsert_letの呼び出しがある…。&br()K正規化の時点でLetTupleのdef部は変数になってないといけないわけね。 -- buyobuyon (2006-12-09 04:01:35)
- A正規化、あっさり完成しました。 -- buyobuyon (2006-12-09 04:11:21)
***12/8(Fr)
昨日できなかったK正規化をやっています。
ほとんどできたのですが、min-rtにはlight_dirvecなる外部変数があり、型がtupleなのですよ。
MinCaml仕様だと、外部変数は関数か配列でないといけないので、
このままだとコンパイルできないのですよね…。
light_dirvecで検索してみたら、firexhlのみ検索にかかったのですが、中身を見ることができず…。
なぜ外部変数にこのような規制をかけたのかがわからないのに仕様を変えるのはちょっと怖いですが、
コンパイルできないと仕方がないので、外部変数にどんな値が入っていてもOKになるようにします。
- できたかな。ただ、チェックするのが面倒です…。&br()って、中間木ではなくてソースの形に戻して表示する関数を作れば良かったのか…。&br()早速取りかかります。 -- buyobuyon (2006-12-08 23:26:29)
- チェック完了。一応、私の考えるところの「K正規化」はできていました。&br()「K正規化」は500行以内に収まりました。 -- buyobuyon (2006-12-09 00:26:25)
- メモ(ちょっと忘れかけていたこと):内部データ構造では、関数の引数とtupleの要素が逆順で入っている。print_mlsource関数の出力もそうなっている。ただしcreate_arrayの引数の順序は正常。 -- buyobuyon (2006-12-09 00:29:25)
***12/7(Th)
今日は大掃除(!?)に巻き込まれて全く作業できませんでした。今から一応K正規化の続きをやってみますが今日も終わらない可能性大。
- お疲れ様です(>_<) -- yastak (2006-12-07 23:32:48)
- 何か今日は筋肉痛で… -- buyobuyon (2006-12-08 22:36:04)
- 同じく筋肉痛です… -- tsuy (2006-12-08 22:43:43)
- まぁ体を動かした次の日のうちに筋肉痛になったのが不幸中の幸いかな。 -- buyobuyon (2006-12-08 22:48:27)
***12/6(We)
書き込み中に戻るボタンを押してしまって、書いたことがすべて消えてしまいました… (; ;)
昨日はソースファイルを整理しただけで、メインの作業はほとんど進みませんでした。
この後は、とりあえず「遅くても良いので正しく動く」アセンブリコードを出力できるようにすることを最優先にして、最適化(MinCamlで実装されているインライン展開なども含む)はすべてあとまわしにしたいと思っています。レジスタ割り付けも、とりあえずは、生きているすべての値をメモリに置いておき、演算のたびにメモリからレジスタに値を取り出し、演算結果をメモリに書き込むような感じで済ませてしまおうかと思っているのですが、どうせなら初めからまじめに実装した方が良いような気もして、まだどうするか迷っています。まぁ、レジスタ割り付けはだいぶ先のことなので。
とりあえず、今日はK正規化をやります(今日中には終わらないかも)。以下は仕様に関するメモ。
・&strike(){外部変数として使用できるのは、関数か配列のみ(MinCaml同様)。}
・MinCaml同様、外部関数は関数適用でしか使用できないものとする(できるようにすることは可能ですが、ちょっと厄介なので)。
・比較演算は、MinCamlのようにIFLTとIFEQに変換せずに、「比較」として残す。
・IF文は、条件式が真(-1)ならthen部、偽(0)ならelse部を実行する。すなわち、BNE命令による条件分岐に対応。
今日は、K正規化で使用するサブの関数を作成しました。メインの関数は一オペランドの命令(NOTやSQRTなど)についてのみ記述しました。他の構文についてもだいたい同様にできるはずなので、残りは明日中にはできると思います。
- あ~、だめかもしれない。ちょっと一部勘違いをしていました…。 -- buyobuyon (2006-12-06 23:19:09)
- 一応、定数、算術演算、if文までできました。 -- buyobuyon (2006-12-07 00:46:12)
***12/4(Mo)
型推論のテスト&デバッグ完了しました。仕様が変わった点やmin-rt.mlへの変更点は以下の通り。
・min-rt.mlでは、Array.createではなく、create_arrayらしい。min-rtの方にあわせた。
・min-rt.mlの最後の 0 を () に変更
- 型エラー時には、どこでエラーが発生したかわかるように、簡単なメッセージ(何型と何型の間の衝突か、構文木のうちどの部分でエラーが発生したか)を出力するが、行番号などは出力されないので、使いにくい。 -- buyobuyon (2006-12-04 23:37:43)
***12/3(Su)
型推論はだいたいできた感じ。後は、unify済みのものを再検査して、変数の型の処理と、型が決まっていないものをint型とみなす(MinCaml仕様)処理を行えばOKかな。あと、構文解析部分の問題で、セミコロンで複数の式を書いた時に、セミコロンの左側がUNIT型でなくても型エラーとならないようになってしまっているので、それをなおします。
- うん、完成したっぽい。試しに簡単な式を与えてテスト実行してみたら、私が誤って正しいと判断してしまった式まで&br()ちゃんと型エラーとしてくれたので、たぶん大丈夫でしょう。&br()例によってmin-rt.mlを与えてみたところ、型エラーとなりました。&br()コンパイラが悪いのかmin-rt.mlが悪いのかわからないので、とりあえず明日、原因を検証してみます。 -- buyobuyon (2006-12-04 00:55:44)
- すでに日が変わっていた…。今日の3限の時間帯にやりますね。 -- buyobuyon (2006-12-04 00:56:24)
***12/2(Sa)
型推論実装中です。OCamlで試してみたところ、
true > false
(1, 2) > (0, 3)
がどちらもtrueになりました。ということは、型推論では>と=のチェックは、演算子の左右の式の型が(中身が何であれ)等しいことだけ確認すればよいのかな。
- 11/30は水曜日でないことに今更気づいた。 -- buyobuyon (2006-12-02 18:53:48)
- まだunifyを実装していない(常に1を返す関数にしてある)というのに、さっそく嫌な実行時エラーが…。&br()今日中には終わらない予感…。 -- buyobuyon (2006-12-02 21:38:42)
- 今のエラーは解決。&br()とりあえず局所的には使い終わったものの、後で再び使う可能性のあるものは、&br()一度ゴミ箱に入れておいて、完全に使い終わった後でまとめてfreeする方針をとっていたのですが、&br()ゴミ箱に入れるだけでなくその場でfreeもしてしまうようなコードを書いていたようで、&br()二重freeが起きてしまっていたようです。 -- buyobuyon (2006-12-02 21:55:02)
- まだまだ型推論関係でやることが残っているものの、&br()試しに途中段階でコンパイルして実行してみたところ、&br()α変換はうまくいっていることが確認できました。 -- buyobuyon (2006-12-02 21:58:38)
- LetRec関連でまた手間取ったもので…、今日中に型推論を終わらせるのは無理そうです。&br()MinCamlでいうTyping.gに相当する関数を今日中に仕上げ、unifyは明日実装します。 -- buyobuyon (2006-12-02 23:07:12)
- なんかテストするのが明後日、デバッグが明明後日とかになりそう…。 -- buyobuyon (2006-12-02 23:09:07)
- 一応、Typing.g相当部分は完了しました。&br()ただ、unifyが未実装だということもあり、まだほとんどテストを&br()していないため、正常に動作しているかどうかはわかりません。&br()今日は700行くらい書いたかな…。 -- buyobuyon (2006-12-03 01:05:42)
***12/1(Fr)
すみません、今日は何もやっていません。
あえて言うなら、作業予定を立てたことくらいか…。
コンパイラ作成の方は、どのタイミングでfreeしたらよいかなどといった、OCamlでは気にしなくても
良かったC言語特有の問題があり、簡単だと思っていた部分で意外と手間取っていたりします。
別にmallocしてfreeしないプログラムにする、と割り切ってしまえば良いのでしょうが、それも何なので…。
そんなわけで、作業予定通りに進むかどうかわかりませんが、とりあえずあまり課題が
たまっていない今のうちに頑張ってみます。
ところで、次の次の月曜日が中間発表らしいですが、それぞれの進捗状況は各自説明するとして、
全体の資料は誰が作ります?来週の月曜の空き時間か木曜の放課後あたりで決めますか?
***11/30(We)
長らく更新していなかった後でこんなことを言うのは申し訳ないのですが、まだ型推論すら完成していません。しばらく連続系の課題にはまっていたもので…、すみません。
型推論の実装で悩んでいるのですが、型推論の本筋で悩んでいる訳ではなくて、Cでうまく書けなくて悩んでいるような感じなので、もう少しお待ちを。金曜日中には型推論は終わらせるつもりです。
***11/16(Th)
悩んだすえ、min-rt.mlの
let true = 1 in
といった記述が悪いことに気づく。
しかしながら依然としてmin-rtはコンパイルできないまま…。
- 変なエラーまで出始めた…。 -- buyobuyon (2006-11-16 23:16:20)
- min-rtを(おそらく正しく)構文解析できるようになりました。&br() 式;&br()という形の式を認識できなかったのと、sscanfがうまく動作しなかったのと、&br()あとは細かいミスが原因だったようです。 -- buyobuyon (2006-11-17 00:22:14)
***11/15(We)
数日間眠くてぼ~っとしています。まぁもともとぼ~っとはしていますが…。
結局その後は、2回freeしてしまうという嫌なバグを修正しただけで、何も進んでおりません。
- げっ、パーザーがmin-rtを受け付けない…。 -- buyobuyon (2006-11-16 02:07:20)
***11/11(Sa)
引き続き構文解析中です。
一応、データ構造の定義が終わったので、後はひたすらルールを書いていくだけかと。
とはいっても、まだテストもコンパイルも試していないので、これからが大変だと思いますが。
とりあえず可読性無視でプログラムを書いているので(自分でも読めないくらいです)、
後で一から作り直さないといけないかもしれません。
それにしても、unionとenumなんて使うの今回が初めてかも…。
- conflicts: 135 shift/reduce, 26 reduce/reduce&br()だそうです…。続きはまた後日にします。&br() -- buyobuyon (2006-11-11 17:09:44)
- ちょっと手を加えたら、&br() conflicts: 141shift/reduce&br()に。前進なのやら後退なのやら…。 -- buyobuyon (2006-11-11 19:56:15)
- conflictが無くなり、無事コンパイルできました。&br()ただ、出力を行う関数を作成していないので、まだテストは&br()していません。疲れたので続きはまた後日。&br()&br()よくよく見てみたら、min-camlの構文解析でも100を超える数の&br()conflictsが出ていました…。 -- buyobuyon (2006-11-11 23:20:10)
- 出力を行う関数を作成してテストしてみました。&br()fibのプログラムを構文解析させてみたところ、正しく構文木が作成されました。&br()というわけで、今度こそ、続きはまた後日。 -- buyobuyon (2006-11-12 00:22:10)
- 構文解析までで1000行か…。先が思いやられる。 -- buyobuyon (2006-11-12 00:24:14)
***11/10(Fr)
たいへん申し上げにくいのですが、全然進んでいません。
ようやく字句解析器らしきものができたかなという感じです。
まだ構文解析器の方ができていないもので、テストすらしていないのですが…。
今更ながらC言語で作ると言ったことを後悔しています。
まぁ、lex & yaccの段階が終われば多少やりやすくなると思いますが。
受理言語は、min-camlとほとんど同じです。
ただ、sqrtとかinvsqrtとかが加わっています。
たぶん、今後しばらくは構文解析器の作成でとまどっていると思います。
何か本を買って読まないとだめかなぁ…?
***10/29(Su)
ご無沙汰です。
休み中は風邪で寝込んでいました。
ここ一週間は全くコードを書いておりません。というか、まだ書けないというか…。
MinCamlのソースを理解することは何とかできるのですが、
自分でそれを再現しろ、と言われたらできなさそうな感じで、
この調子だと、コンパイラができたとしても、結局MinCamlを焼き直しただけのものに
なってしまいそうなのですよね…。
う~む、どうしようか。
とりあえず、もうしばらくはMinCamlのソースとのにらめっこを続けてみますね。
***10/25(We)
今、インライン化あたりの勉強をしています…、
って、ただコンパイラ課題やっているだけです。すみません。
***10/24(Tu)
げっ、命令セットだめじゃん。
というのは、浮動小数点数演算についてなのですが、よくよく考えたら整数と同じ方法で比較を行うことはできませんよね。+0と-0が違うし…。
というわけで浮動小数点数比較命令を追加する必要がありそうです。
もっとも、0x80000000Uと0x00000000Uとを同等にみなすような整数表現が発明できれば、その必要はなくなりますが…。
- あっ、まだ違う…。&br()-0に限らず負の値の場合は必ず整数と逆になりますね。&br()やっぱり比較命令は必要か…。&br()でも<だけあれば十分ですよね? -- buyobuyon (2006-10-24 23:04:18)
***10/23(Mo)
今日はお疲れ様でした。
さて、シミュレータをアップしました。
ただ、fibを動かす以外に全くテスト実行を行っていないので、いくらかバグがあるかと。
使用したfibも再帰呼び出し型ではないので、ほとんど命令を使用していません。
あと、仕様が決まっていない部分は勝手な仕様を決めて実装しました(たとえば除算で、0で割ったら0を返すなど)。
それとFPUまわりは実装していません(処理を記述すればすぐに動かせる状態にはなっている)。
今日は眠いので、細かい説明はまた後日。
***10/22(Su)
ええと…。すみません、新しいことは特に何もやっていません。
Linux上のOpenOfficeで中間発表資料を開いてみて、ずれを修正したくらいです。
なお、今アップしてあるのは修正前のものです。
- チョコごちそうさまです !! -- はりー (2006-10-23 14:06:33)
***10/21(Sa)
[[中間発表資料もどき>中間発表1]]を作ったので、皆さん改良しましょう。
というわけで、私は連続系アルゴリズム演習に逃げま~す |彡サッ
- ありがとうです☆&br()発表では何か言えるように準備しておきます(><)/ -- yastak (2006-10-21 02:59:58)
***10/20(Fr)
シミュレータもどきができました。
FPU部分に関しては、まだ仕様が固まっていないので未実装ですが、他の命令は一応正しく動くはずです。でも各命令ごとにテストしたわけではないので、バグだらけかも…。一応fibだけはハンドアセンブルして動作することを確認しました。
シミュレータを作っていて、いくつか気になることがでてきたので(0で割ったときにどうするかなど)、今度また話しあって細かい仕様を決めましょう。
- 早っ!&br()見習います(><) -- yastak (2006-10-20 15:43:46)
- 中間発表資料とコンパイラを早く作れという話も… (^^;) -- buyobuyon (2006-10-20 19:35:38)
***10/19(Th)
自分がコンパイラ係であることを無視して、シミュレータの原型を作っています。思ったより面倒かも…。ある程度できたらアップします。でもその前に諦めてしまいそう…。
中間発表資料は、、、すみません m(_ _)m もう少しお待ちを。
**buyobuyon古
2月より前の書き込みです。
メモもいくらか入っているので念のため残しておきます。
***1/27(Sa)
なんだかんだで手こずっています…。いろいろ細かいところが気になって…。
とりあえず今日中に仮想マシンコード生成を仕上げて、
明日くらいから試験勉強を始めたいのですが。
そうすると、とりあえず動くコンパイラ(最適化無し)完成が、
試験終了から1週間+α後くらいになると思うのですが、それで大丈夫ですかね?
- 私も今日EXW書いてしまったら、&br()試験勉強に入るつもりです。&br()(動作テストとかしないままに放置するのはちょっと怖いですが…)&br()&br()で、テスト後に動作テストをしようと思っています~。&br()でも、せいぜいfibくらいなんで大丈夫です☆&br()(i.e.手書きで事足りることくらいしかしないです)&br()FPUを乗せるのはfibが動いてからということで… -- yastak (2007-01-27 16:57:51)
- コンパイラ制作の遅れのせいでいろいろとご迷惑をおかけしてしまって申し訳ないです。&br()完成すれば早速min-rtのコンパイルもできると思うのですが。&br()&br()仮想マシンコード生成の方は…、なかなか終わりません…。1000行はいきそうだな…。 -- buyobuyon (2007-01-27 19:38:51)
- 1000行。。。&br()すごいですね。&br()Cのコンパイラやった人はほとんどいないみたいから&br()是非頑張ってくださいね〜☆&br()&br()私も明日くらいにシミュレータのFPUをとりあえず完成させて、&br()はやくテスト勉強の入らなきゃ。(harry) (2007-01-27 21:05:42)
- 中間発表3のページに進捗状況を書き込んでおきました。&br()harryさん、資料の作成、よろしくお願いしますね。 -- buyobuyon (2007-01-27 22:26:21)
- メモ:仮想マシンコード生成以降は、ntypeの中身がいい加減になる。別に問題はないはず(そもそも、型の情報はこの時点で捨ててしまっても良いはず)。 -- buyobuyon (2007-01-28 00:54:44)
- 仮想マシンコード生成、たった今、記述し終わり、&br()これから(今日やる元気はないので明日以降)デバッグに入ります。&br()ぴったり999行…、ヘッダファイルと合わせると1000行超えますね。&br()とはいえ、無駄な記述が多いので、1000行以内に収めるのは簡単ですが。 -- buyobuyon (2007-01-28 02:38:13)
- 動きました。寝ます。&br()一応、fibの仮想マシンコードを載せておきます。&br()&br()FUNCTIONS: &br()&br() function fib_00000002&br() args: x_00000003 &br() body: &br() __knvar_0000000b := &br() CONST(1)&br() __knvar_0000000c := &br() ILESS(__knvar_0000000b, x_00000003)&br() __knvar_0000000d := &br() BNOT(__knvar_0000000c)&br() return&br() IF __knvar_0000000d THEN&br() return&br() MOV(x_00000003)&br() ELSE&br() __knvar_00000007 := &br() CONST(2)&br() __knvar_00000008 := &br() ISUB(x_00000003, __knvar_00000007)&br() __knvar_0000000a := &br() CALLDIR(fib_00000002 __knvar_00000008)&br() __knvar_00000005 := &br() CONST(1)&br() __knvar_00000006 := &br() ISUB(x_00000003, __knvar_00000005)&br() __knvar_00000009 := &br() CALLDIR(fib_00000002 __knvar_00000006)&br() return&br() IADD(__knvar_00000009, __knvar_0000000a)&br()&br()&br()MAIN: &br()a_00000001 := &br() CONST(15)&br()c_00000004 := &br() CALLDIR(fib_00000002 a_00000001)&br()return&br() ()&br()&br() -- buyobuyon (2007-01-28 03:46:02)
***1/26(Fr)
引き続き仮想マシンコード生成実装中ですが、
外部変数関連で問題が見つかったので、K正規化付近を直しています。
***1/25(Th)
仮想マシンコード生成実装中です。
ワードアドレッシングにしたこととアラインメント問題が生じないこと(∵sizeof(int) = sizeof(float))、int/float混合型のレジスタにしたことのおかげで、かなり楽に進められそうな気がします。
とはいえ、ここらで構造体を新しくしたいので、その定義と生成・破棄関数、テスト用出力関数の作成に時間がかかりそうな気がします。
とりあえず、MinCaml同様、クロージャや組、配列はヒープ領域に保存することにします。
***1/24(We)
次は仮想マシンコード生成です。
ええと、ワードアドレッシングだと言うことは、
例えば、int型の配列は先頭アドレスがpならk番目の要素がp+kにあるのですよね?
***1/23(Tu)
ええと、クロージャ変換のテスト&デバッグの続きをやっています。
意外と正常に動作しているような気が…。
- やっぱり変数名にチルダがつくと気持ち悪いので、アンダースコアにしました。&br()アセンブラには影響なし。&br()ライブラリの一部をアセンブリ言語で記述する場合に、&br()変数名の末尾で"<アンダースコア><数値>"という形にならないよう気をつけてもらえれば。&br()"div_2"みたいな名前はだめ、"div2"や"div_by2"などはOKです。&br()別に"div_2"にしても、MLのソースの方でたまたま2つめに解析される変数の名前が"div"である場合にしか問題は生じませんが。 -- buyobuyon (2007-01-23 13:13:20)
- fib(15)を求めるプログラムのクロージャ変換はOK。&br()って、自由変数を持たない関数しかないので、あまり意味はないですが…。 -- buyobuyon (2007-01-23 13:22:17)
- 動作確認の前に、もっと賢い方のクロージャ変換にしてみました。&br()ちなみにfib(15)は次のようになりました。&br()&br()FUNCTIONS: &br()&br() function fib_00000002&br() args: x_00000003 &br() fvs: &br()LET __knvar_0000000b~11 (type(int)) = &br() INT(00000001)&br()IN&br() LET __knvar_0000000c~12 (type(bool)) = &br() LESS&br() VAR(__knvar_0000000b~11)&br() VAR(x_00000003~3)&br() IN&br() LET __knvar_0000000d~13 (type(bool)) = &br() BNOT&br() VAR(__knvar_0000000c~12)&br() IN&br() IF&br() VAR(__knvar_0000000d~13)&br() THEN&br() VAR(x_00000003~3)&br() ELSE&br() LET __knvar_00000007~7 (type(int)) = &br() INT(00000002)&br() IN&br() LET __knvar_00000008~8 (type(int)) = &br() ISUB&br() VAR(x_00000003~3)&br() VAR(__knvar_00000007~7)&br() IN&br() LET __knvar_0000000a~10 (type(int)) = &br() APPDIR&br() fib_00000002&br() VAR(__knvar_00000008~8)&br() IN&br() LET __knvar_00000005~5 (type(int)) = &br() INT(00000001)&br() IN&br() LET __knvar_00000006~6 (type(int)) = &br() ISUB&br() VAR(x_00000003~3)&br() VAR(__knvar_00000005~5)&br() IN&br() LET __knvar_00000009~9 (type(int)) = &br() APPDIR&br() fib_00000002&br() VAR(__knvar_00000006~6)&br() IN&br() IADD&br() VAR(__knvar_00000009~9)&br() VAR(__knvar_0000000a~10)&br()&br()&br()MAIN: &br()LET a_00000001~1 (type(int)) = &br() INT(0000000f)&br()IN&br() LET c_00000004~4 (type(int)) = &br() APPDIR&br() fib_00000002&br() VAR(a_00000001~1)&br() IN&br() Unit()&br() -- buyobuyon (2007-01-23 20:38:37)
- 一応、MAKECLSはなくなっていますね。&br()&br()問題はクロージャを作る必要がある時に正しく処理されるか…。&br()これからテストしてみます。 -- buyobuyon (2007-01-23 20:42:09)
- いくらか修正したところ、クロージャ変換は正常に動くようになりました。&br()コンパイラ演習第3回の講義資料に載っていた例と、その他の例をいくつか試してみましたが、&br()一応問題なく動作しました。&br()&br()min-rtも一応変換してみましたが、途中の最適化(不要定義除去など)が未実装であるためか、&br()MAKECLSが結構いっぱいできてしまいました…。&br()&br()まぁ、とりあえずは仮想マシンコード生成に移りたいと思います。 -- buyobuyon (2007-01-24 00:13:34)
***1/22(Mo)
"賢い"クロージャ変換("もっと賢"くはない)を記述し終えました。
が、実行してみたらセグメンテーションフォールトが出たので、まだまだかかりそうです。
- とりあえず、いろいろいじっているうちに危険な実行時エラーは出なくなりました。&br()とはいえ、まだ動作確認をするには至っていません。&br()&br()ひどく眠いので、続きはまた明日。 -- buyobuyon (2007-01-22 23:24:40)
***1/21(Su)
とりあえず、クロージャ変換の大まかな部分を書き上げたところです。
自由変数を探す部分がまだで、あと必要のないクロージャ生成をなくす部分も後まわしにしてあります。
混乱しながら書いたのでだいぶ間違っているような気がします。
デバッグにもそこそこ時間がかかるかと…。
ちょっと中間発表までに仕上げるのは無理のような気がします。
とはいえ、あまり先延ばしにしていられないので…。
***1/19(Fr)
昨日は無断欠席してしまい申し訳ありません。
何か最近体調が不安定で…。
とりあえず現在は、理不尽なテスト日程に驚きながらクロージャ変換実装中です。
- お大事にしてください~!&br()健康第一で、無理にあせったりしないでね! -- yastak (2007-01-20 15:11:44)
- テスト迫っていますよね。。。&br()&br()風邪を引かないように体を気をつけてくださいね~&br()お大事に -- harry (2007-01-20 15:49:39)
- ありがとうございます。&br()クロージャ変換実装中に型推論の一部&br()(型推論で型が決まらないものをint型と見なす処理)に&br()問題があることが発覚し、&br()そのあたりの自分のコードが解読できなくて今悩んでいます。&br()止まらないはずのプログラムがなぜか止まってくれる…。 -- buyobuyon (2007-01-21 13:55:18)
- 場合分けの一カ所でintとみなすのを忘れたという単純なミスでした。&br()止まらないはずのプログラムが止まるというのも、ただの勘違いでしたし。 -- buyobuyon (2007-01-21 14:06:02)
- メモ:MinCamlではKNormalizeの時点でNODE_ARRAYを外部関数の適用に帰着させているが、自作コンパイラではNODE_ARRAYのまま進めることにする。 -- buyobuyon (2007-01-21 17:07:44)
- メモ:ライブラリ関数の名前の末尾は "~数値"という形を避ける。 -- buyobuyon (2007-01-21 17:23:30)
- ↑読みにくいな…、"<チルダ><数値>"を避ける -- buyobuyon (2007-01-21 18:24:28)
- 不要なクロージャ生成をなくす処理(いわゆる、"もっと賢い"クロージャ変換)は次にまわして、とりあえず"賢い"クロージャ変換を行うことにする。 -- buyobuyon (2007-01-21 20:51:53)
***1/11(Th)
今日もコンパイラは進展なし。
tsuyさんが作成してくれたライブラリを眺めていました。
***1/9(Tu)
今更ですが、あけましておめでとうございます。
今年もよろしくお願いいたします。
ええと…、本当に申し訳ないです。前回書き込んでからまた何も進んでおらず…。
***12/31(Su)
ええと…、すみません。
今日が自分への締め切りだったはずなのですが…、全然進んでいません。
課題もろとも進行が止まっているもので…、ここらで気合いを入れないと。
とりあえず、良いお年を、ということで。
- それを聞いて安心…してる場合じゃないですよね、&br()同じくいまやっと必死です…。&br()&br()そして同じく、溜まった課題も休み中に何とかしたいですね(>_<)&br()お互いに頑張りましょう~。&br()良いお年を! -- yastak (2006-12-31 23:47:59)
***12/14(Th)
すみません、また風邪をひいてしまい、今日は休ませていただきました。
コンパイラは進まず、連続系の課題も終わらず…。
- やはり風邪でしたか。&br()お大事に。 -- tsuy (2006-12-14 22:43:59)
- ぉお、やはり…。&br()お大事にね!ノロウイルスにも注意です(>_<) -- yastak (2006-12-15 01:17:04)
- ありがとうございます。&br()朝、吐き気がしたので、最初はノロウイルス!!!と思ったのですが、&br()腹痛などは無く、むしろ喉や頭が痛い感じなので、ただの風邪のようですね。&br()まだ多少ボケ~っとしていますが(いつものことか…)、おかげさまでだいぶ良くなりました。&br()そして課題は進まず…。 -- buyobuyon (2006-12-15 17:30:35)
- 似たような時期に似たような状況でした。&br()お大事に~帰宅時に30秒以上も手を洗うと&br()風の予防になるみたいなのをテレビで見たけど、&br()果たして効果があるのだか。。。 -- harry (2006-12-17 16:33:01)
- harryさんもお大事に。&br()&br()う~、何か風邪がぶりかえしてきています…。&br()もしかしたら明日も休ませてもらうかもしれません。&br()何か急ぎで決めるべきことなどあれば、適当に決めておいてください。私がそれにあわせますので。&br() -- buyobuyon (2006-12-17 21:36:20)
***12/11(Mo)
予定表を埋めてみました。
一応、予定表通りに進めば、今年中にmin-rt.mlがコンパイルできるようになります。
まぁ(false → A)は恒真なので・・・。
今は連続系の課題を引きずっているので、ちょっと猶予をください。
***12/9(Sa)
A正規化について。
今回は、MinCaml同様、
let x = (if y then e1 else e2) in e3
のような末尾でないif式を認める、ゆるいA正規形を採用しました。
ところで、MinCamlのソースを見たところ、例えば
let (a, b) = let x = 5 in f x in a
をA正規化してもそのままで、
let x = 5 in let (a, b) = f x in a
とはならないようになっているような気がするのですが、
このように変換すると何か問題が生じるのですかね?
それともK正規化の時点でこの形が現れないようになっているとか?
- どうやらそれっぽいなぁ…。&br()Syntax.LetTupleのK正規化のところにinsert_letの呼び出しがある…。&br()K正規化の時点でLetTupleのdef部は変数になってないといけないわけね。 -- buyobuyon (2006-12-09 04:01:35)
- A正規化、あっさり完成しました。 -- buyobuyon (2006-12-09 04:11:21)
***12/8(Fr)
昨日できなかったK正規化をやっています。
ほとんどできたのですが、min-rtにはlight_dirvecなる外部変数があり、型がtupleなのですよ。
MinCaml仕様だと、外部変数は関数か配列でないといけないので、
このままだとコンパイルできないのですよね…。
light_dirvecで検索してみたら、firexhlのみ検索にかかったのですが、中身を見ることができず…。
なぜ外部変数にこのような規制をかけたのかがわからないのに仕様を変えるのはちょっと怖いですが、
コンパイルできないと仕方がないので、外部変数にどんな値が入っていてもOKになるようにします。
- できたかな。ただ、チェックするのが面倒です…。&br()って、中間木ではなくてソースの形に戻して表示する関数を作れば良かったのか…。&br()早速取りかかります。 -- buyobuyon (2006-12-08 23:26:29)
- チェック完了。一応、私の考えるところの「K正規化」はできていました。&br()「K正規化」は500行以内に収まりました。 -- buyobuyon (2006-12-09 00:26:25)
- メモ(ちょっと忘れかけていたこと):内部データ構造では、関数の引数とtupleの要素が逆順で入っている。print_mlsource関数の出力もそうなっている。ただしcreate_arrayの引数の順序は正常。 -- buyobuyon (2006-12-09 00:29:25)
***12/7(Th)
今日は大掃除(!?)に巻き込まれて全く作業できませんでした。今から一応K正規化の続きをやってみますが今日も終わらない可能性大。
- お疲れ様です(>_<) -- yastak (2006-12-07 23:32:48)
- 何か今日は筋肉痛で… -- buyobuyon (2006-12-08 22:36:04)
- 同じく筋肉痛です… -- tsuy (2006-12-08 22:43:43)
- まぁ体を動かした次の日のうちに筋肉痛になったのが不幸中の幸いかな。 -- buyobuyon (2006-12-08 22:48:27)
***12/6(We)
書き込み中に戻るボタンを押してしまって、書いたことがすべて消えてしまいました… (; ;)
昨日はソースファイルを整理しただけで、メインの作業はほとんど進みませんでした。
この後は、とりあえず「遅くても良いので正しく動く」アセンブリコードを出力できるようにすることを最優先にして、最適化(MinCamlで実装されているインライン展開なども含む)はすべてあとまわしにしたいと思っています。レジスタ割り付けも、とりあえずは、生きているすべての値をメモリに置いておき、演算のたびにメモリからレジスタに値を取り出し、演算結果をメモリに書き込むような感じで済ませてしまおうかと思っているのですが、どうせなら初めからまじめに実装した方が良いような気もして、まだどうするか迷っています。まぁ、レジスタ割り付けはだいぶ先のことなので。
とりあえず、今日はK正規化をやります(今日中には終わらないかも)。以下は仕様に関するメモ。
・&strike(){外部変数として使用できるのは、関数か配列のみ(MinCaml同様)。}
・MinCaml同様、外部関数は関数適用でしか使用できないものとする(できるようにすることは可能ですが、ちょっと厄介なので)。
・比較演算は、MinCamlのようにIFLTとIFEQに変換せずに、「比較」として残す。
・IF文は、条件式が真(-1)ならthen部、偽(0)ならelse部を実行する。すなわち、BNE命令による条件分岐に対応。
今日は、K正規化で使用するサブの関数を作成しました。メインの関数は一オペランドの命令(NOTやSQRTなど)についてのみ記述しました。他の構文についてもだいたい同様にできるはずなので、残りは明日中にはできると思います。
- あ~、だめかもしれない。ちょっと一部勘違いをしていました…。 -- buyobuyon (2006-12-06 23:19:09)
- 一応、定数、算術演算、if文までできました。 -- buyobuyon (2006-12-07 00:46:12)
***12/4(Mo)
型推論のテスト&デバッグ完了しました。仕様が変わった点やmin-rt.mlへの変更点は以下の通り。
・min-rt.mlでは、Array.createではなく、create_arrayらしい。min-rtの方にあわせた。
・min-rt.mlの最後の 0 を () に変更
- 型エラー時には、どこでエラーが発生したかわかるように、簡単なメッセージ(何型と何型の間の衝突か、構文木のうちどの部分でエラーが発生したか)を出力するが、行番号などは出力されないので、使いにくい。 -- buyobuyon (2006-12-04 23:37:43)
***12/3(Su)
型推論はだいたいできた感じ。後は、unify済みのものを再検査して、変数の型の処理と、型が決まっていないものをint型とみなす(MinCaml仕様)処理を行えばOKかな。あと、構文解析部分の問題で、セミコロンで複数の式を書いた時に、セミコロンの左側がUNIT型でなくても型エラーとならないようになってしまっているので、それをなおします。
- うん、完成したっぽい。試しに簡単な式を与えてテスト実行してみたら、私が誤って正しいと判断してしまった式まで&br()ちゃんと型エラーとしてくれたので、たぶん大丈夫でしょう。&br()例によってmin-rt.mlを与えてみたところ、型エラーとなりました。&br()コンパイラが悪いのかmin-rt.mlが悪いのかわからないので、とりあえず明日、原因を検証してみます。 -- buyobuyon (2006-12-04 00:55:44)
- すでに日が変わっていた…。今日の3限の時間帯にやりますね。 -- buyobuyon (2006-12-04 00:56:24)
***12/2(Sa)
型推論実装中です。OCamlで試してみたところ、
true > false
(1, 2) > (0, 3)
がどちらもtrueになりました。ということは、型推論では>と=のチェックは、演算子の左右の式の型が(中身が何であれ)等しいことだけ確認すればよいのかな。
- 11/30は水曜日でないことに今更気づいた。 -- buyobuyon (2006-12-02 18:53:48)
- まだunifyを実装していない(常に1を返す関数にしてある)というのに、さっそく嫌な実行時エラーが…。&br()今日中には終わらない予感…。 -- buyobuyon (2006-12-02 21:38:42)
- 今のエラーは解決。&br()とりあえず局所的には使い終わったものの、後で再び使う可能性のあるものは、&br()一度ゴミ箱に入れておいて、完全に使い終わった後でまとめてfreeする方針をとっていたのですが、&br()ゴミ箱に入れるだけでなくその場でfreeもしてしまうようなコードを書いていたようで、&br()二重freeが起きてしまっていたようです。 -- buyobuyon (2006-12-02 21:55:02)
- まだまだ型推論関係でやることが残っているものの、&br()試しに途中段階でコンパイルして実行してみたところ、&br()α変換はうまくいっていることが確認できました。 -- buyobuyon (2006-12-02 21:58:38)
- LetRec関連でまた手間取ったもので…、今日中に型推論を終わらせるのは無理そうです。&br()MinCamlでいうTyping.gに相当する関数を今日中に仕上げ、unifyは明日実装します。 -- buyobuyon (2006-12-02 23:07:12)
- なんかテストするのが明後日、デバッグが明明後日とかになりそう…。 -- buyobuyon (2006-12-02 23:09:07)
- 一応、Typing.g相当部分は完了しました。&br()ただ、unifyが未実装だということもあり、まだほとんどテストを&br()していないため、正常に動作しているかどうかはわかりません。&br()今日は700行くらい書いたかな…。 -- buyobuyon (2006-12-03 01:05:42)
***12/1(Fr)
すみません、今日は何もやっていません。
あえて言うなら、作業予定を立てたことくらいか…。
コンパイラ作成の方は、どのタイミングでfreeしたらよいかなどといった、OCamlでは気にしなくても
良かったC言語特有の問題があり、簡単だと思っていた部分で意外と手間取っていたりします。
別にmallocしてfreeしないプログラムにする、と割り切ってしまえば良いのでしょうが、それも何なので…。
そんなわけで、作業予定通りに進むかどうかわかりませんが、とりあえずあまり課題が
たまっていない今のうちに頑張ってみます。
ところで、次の次の月曜日が中間発表らしいですが、それぞれの進捗状況は各自説明するとして、
全体の資料は誰が作ります?来週の月曜の空き時間か木曜の放課後あたりで決めますか?
***11/30(We)
長らく更新していなかった後でこんなことを言うのは申し訳ないのですが、まだ型推論すら完成していません。しばらく連続系の課題にはまっていたもので…、すみません。
型推論の実装で悩んでいるのですが、型推論の本筋で悩んでいる訳ではなくて、Cでうまく書けなくて悩んでいるような感じなので、もう少しお待ちを。金曜日中には型推論は終わらせるつもりです。
***11/16(Th)
悩んだすえ、min-rt.mlの
let true = 1 in
といった記述が悪いことに気づく。
しかしながら依然としてmin-rtはコンパイルできないまま…。
- 変なエラーまで出始めた…。 -- buyobuyon (2006-11-16 23:16:20)
- min-rtを(おそらく正しく)構文解析できるようになりました。&br() 式;&br()という形の式を認識できなかったのと、sscanfがうまく動作しなかったのと、&br()あとは細かいミスが原因だったようです。 -- buyobuyon (2006-11-17 00:22:14)
***11/15(We)
数日間眠くてぼ~っとしています。まぁもともとぼ~っとはしていますが…。
結局その後は、2回freeしてしまうという嫌なバグを修正しただけで、何も進んでおりません。
- げっ、パーザーがmin-rtを受け付けない…。 -- buyobuyon (2006-11-16 02:07:20)
***11/11(Sa)
引き続き構文解析中です。
一応、データ構造の定義が終わったので、後はひたすらルールを書いていくだけかと。
とはいっても、まだテストもコンパイルも試していないので、これからが大変だと思いますが。
とりあえず可読性無視でプログラムを書いているので(自分でも読めないくらいです)、
後で一から作り直さないといけないかもしれません。
それにしても、unionとenumなんて使うの今回が初めてかも…。
- conflicts: 135 shift/reduce, 26 reduce/reduce&br()だそうです…。続きはまた後日にします。&br() -- buyobuyon (2006-11-11 17:09:44)
- ちょっと手を加えたら、&br() conflicts: 141shift/reduce&br()に。前進なのやら後退なのやら…。 -- buyobuyon (2006-11-11 19:56:15)
- conflictが無くなり、無事コンパイルできました。&br()ただ、出力を行う関数を作成していないので、まだテストは&br()していません。疲れたので続きはまた後日。&br()&br()よくよく見てみたら、min-camlの構文解析でも100を超える数の&br()conflictsが出ていました…。 -- buyobuyon (2006-11-11 23:20:10)
- 出力を行う関数を作成してテストしてみました。&br()fibのプログラムを構文解析させてみたところ、正しく構文木が作成されました。&br()というわけで、今度こそ、続きはまた後日。 -- buyobuyon (2006-11-12 00:22:10)
- 構文解析までで1000行か…。先が思いやられる。 -- buyobuyon (2006-11-12 00:24:14)
***11/10(Fr)
たいへん申し上げにくいのですが、全然進んでいません。
ようやく字句解析器らしきものができたかなという感じです。
まだ構文解析器の方ができていないもので、テストすらしていないのですが…。
今更ながらC言語で作ると言ったことを後悔しています。
まぁ、lex & yaccの段階が終われば多少やりやすくなると思いますが。
受理言語は、min-camlとほとんど同じです。
ただ、sqrtとかinvsqrtとかが加わっています。
たぶん、今後しばらくは構文解析器の作成でとまどっていると思います。
何か本を買って読まないとだめかなぁ…?
***10/29(Su)
ご無沙汰です。
休み中は風邪で寝込んでいました。
ここ一週間は全くコードを書いておりません。というか、まだ書けないというか…。
MinCamlのソースを理解することは何とかできるのですが、
自分でそれを再現しろ、と言われたらできなさそうな感じで、
この調子だと、コンパイラができたとしても、結局MinCamlを焼き直しただけのものに
なってしまいそうなのですよね…。
う~む、どうしようか。
とりあえず、もうしばらくはMinCamlのソースとのにらめっこを続けてみますね。
***10/25(We)
今、インライン化あたりの勉強をしています…、
って、ただコンパイラ課題やっているだけです。すみません。
***10/24(Tu)
げっ、命令セットだめじゃん。
というのは、浮動小数点数演算についてなのですが、よくよく考えたら整数と同じ方法で比較を行うことはできませんよね。+0と-0が違うし…。
というわけで浮動小数点数比較命令を追加する必要がありそうです。
もっとも、0x80000000Uと0x00000000Uとを同等にみなすような整数表現が発明できれば、その必要はなくなりますが…。
- あっ、まだ違う…。&br()-0に限らず負の値の場合は必ず整数と逆になりますね。&br()やっぱり比較命令は必要か…。&br()でも<だけあれば十分ですよね? -- buyobuyon (2006-10-24 23:04:18)
***10/23(Mo)
今日はお疲れ様でした。
さて、シミュレータをアップしました。
ただ、fibを動かす以外に全くテスト実行を行っていないので、いくらかバグがあるかと。
使用したfibも再帰呼び出し型ではないので、ほとんど命令を使用していません。
あと、仕様が決まっていない部分は勝手な仕様を決めて実装しました(たとえば除算で、0で割ったら0を返すなど)。
それとFPUまわりは実装していません(処理を記述すればすぐに動かせる状態にはなっている)。
今日は眠いので、細かい説明はまた後日。
***10/22(Su)
ええと…。すみません、新しいことは特に何もやっていません。
Linux上のOpenOfficeで中間発表資料を開いてみて、ずれを修正したくらいです。
なお、今アップしてあるのは修正前のものです。
- チョコごちそうさまです !! -- はりー (2006-10-23 14:06:33)
***10/21(Sa)
[[中間発表資料もどき>中間発表1]]を作ったので、皆さん改良しましょう。
というわけで、私は連続系アルゴリズム演習に逃げま~す |彡サッ
- ありがとうです☆&br()発表では何か言えるように準備しておきます(><)/ -- yastak (2006-10-21 02:59:58)
***10/20(Fr)
シミュレータもどきができました。
FPU部分に関しては、まだ仕様が固まっていないので未実装ですが、他の命令は一応正しく動くはずです。でも各命令ごとにテストしたわけではないので、バグだらけかも…。一応fibだけはハンドアセンブルして動作することを確認しました。
シミュレータを作っていて、いくつか気になることがでてきたので(0で割ったときにどうするかなど)、今度また話しあって細かい仕様を決めましょう。
- 早っ!&br()見習います(><) -- yastak (2006-10-20 15:43:46)
- 中間発表資料とコンパイラを早く作れという話も… (^^;) -- buyobuyon (2006-10-20 19:35:38)
***10/19(Th)
自分がコンパイラ係であることを無視して、シミュレータの原型を作っています。思ったより面倒かも…。ある程度できたらアップします。でもその前に諦めてしまいそう…。
中間発表資料は、、、すみません m(_ _)m もう少しお待ちを。