2013-01-01から1年間の記事一覧

分からない理由2 全体像が把握出来てない

全体像が把握出来てないとどのくらい進んでいるのかも分からず焦ってしまいます。そんな時は、まず全体像を把握しましょう。 2.1 集合と関係と関数 2.2 順序集合 2.3 列 2.4 帰納法 集合はJavaのコレクションでいうとSetです。関係とはMapみたいなもん。関数…

分からない理由1 形式的な言語が分からない

まず、このような問題については檜山正幸さんの ーーー 「形式的」とは何だろう ーーー があります。http://www.chimaira.org/docs/FormalReasoning.htm形式的なモデルを使うのに慣れてないのが1つの答えです。このページを読むと形式的な文章が読みやすく…

TAPL2章が分からない8つくらいの理由

全体像は分かって来たので理論的な所も読みたくなってきました。 2章にはTAPLで使う定義がまとめてあり、必要なときに見ればいいと書いてあります。しかし、出来れば理解したい所です。でも覚えられない。何が分からないのかが分からない状況です。辛い理由…

TAPLの実装を写経する

今日も https://github.com/ilya-klyuchnikov/tapl-scala/ を写経しました。なんで、TAPLを読んでいるのかというと、俺俺コンパイラを作る為に型理論の勉強が必要だからです。でもTAPLをすぐに読める状況ではないので何が書いてあるのかを把握する為に、実装…

TAPLの実装を写経する

内容の理解が大切で、低利定理証明系のCoqも面白いんですけど、実装の理解も大切です。とりあえず、ソースを眺めてるだけだと分からない事も多いので写経しながら、自分の好みにあわせて書き換えてみてます。Scalaのioを使ってテキストを読み込み、パーサー…

Coqを勉強してます。

Coq

コンパイラを作るには型理論を理解しているとよくて、型理論を理解するには数学的な証明とかが出来ると良くて、数学的な証明をコンピュータ上で出来ると楽に正確に勉強出来ると思うので、Coqを勉強してます。なんとなく、勉強してる訳ではなくて必要に迫られ…

TAPLを見てます。

コンパイラを作るには型理論を理解しているとよいそうなのでTAPLを読んでいます。最初からまじめに読もうとすると反射的に眠くなって駄目です。難しい。大学の時の代数学とかを思い出します。大学の時に勉強した数学は苦手ですっかり忘れてしまいました。か…

飽きてきました

最初からレジスタマシン的に一から作り直してみてます。 で、データ構造の実験段階のものは出来た感じです。 val,var,配列、構造体が出来たと。あと、OCamlの let a = 1 in let a = a + 1 in :が書き換え出来ない変数なんだけど、名前を更新して行けて便利な…

コンパイラを新規作成するなら書き換え不能な変数をデフォルトにするべし

LLVMは型に厳しいアセンブラです。なので、型をきっちり合わせないと怒られます。 今までJavaのバイトコードに似た内部コードをLLVMに変換する形でコンパイラを作ってきました。 そして、そこそこのプログラムは動作するようにはなりました。 だけど関数ポイ…

ほぼ出来た

LLVM化が、ほぼ出来ました。 OpenGLのプログラムがやっと動いた。スタックにはレジスタ名と型をペアで突っ込むとよいみたいでした。 phi対応が面倒かった。 あと、基本ブロック対応のために、ラベルを関数が返すとかにした。 スタックマシンと似たようなコン…

LLVMを使い始めました。

LLVMいいですね。ドキュメントが結構書きたかった物に近くて大分落ち込みました。 最初からLLVMやっておけば良かったとか思ったりしつつ、 イヤイヤ、64bitCPU触っておくのもやっぱり大切だったと思うよと思います。 とりあえず、LLVMで四則演算するコンパイ…

公開講座を卒業する

水曜日にSML#の公開講座の最終回に参加してきました。 で、最後ってことで公開講座懇親会をするということで行ってきました。 で、日記書き始めると、SML#よりもScalaが素晴らしいみたいな話になってしまうので寝かせておいたのでした。おお、憧れの大堀先生…

[Scala] 現在の進捗

とにもかくにも、言語を作り続けてます。 ここの所の作業は以下のようになってます。 SML#へ移植してみる Scala版でopenglを動かす SML#バージョンでもopenglを動かす 型チェックを厳しく エラーが1行だけど、位置情報がそこそこ出るようにする switch文の…

#なコマンドライン解析

予約に失敗してD言語ハッカソン行けなかったので移植はコンパイルを通した状態で断念しました。 後しばらくは、Dの集まりもないだろう。やっぱりSML#だなということで、SML#に黙々と移植をしてました。 いちお、作っていたテストは全部通って、OpenGLを動か…

Scalaで作ったコンパイラをDに移植してみた。

D

D言語のオフ会があるようなので、出てみたいなぁと思いつつ、ネタがない。 Scalaのコンパイラの話をしたいけど、それじゃ、ぜんぜんD言語じゃない。 ということで、2500行くらいなら、移植も楽なはずと思って、Dに移植し始めてみました。 パーサコンビネータ…

ScalaConfのHackathonに行ってきました。

結構黙々とコンパイラを作ってました。 話したい人は話してくださいとの事だったので、せっかくなので現状作っている言語の ソースをざざっと、話してきました。id:kmizu さんに以下のように書き換えると短くなると指摘してもらいました。 case class EOp(op…

保守的GC

C

そこそこコンパイラ言語が動いているので、 GCありの言語用の保守的GCを作ってみました。 スピードは例によって気にしてないので遅いと思います。これを 完全なGCに出来たら良いなと思うけど、どうしたらいいのかなと。 #include <stdio.h> #include <stdlib.h> typedef struct </stdlib.h></stdio.h>…

強力なマクロ

Lispのような構文定義可能なマクロを実現させたい。 しかし大量にあるマクロを扱うとなると線形探索でのパターンマッチングではとても遅くなってしまいます。幅優先探索にしてツリー状にマクロのデータを保存して、範囲をしぼるとかいう手もあるでしょうし、…

片側括弧のみマクロ

#define BEGIN { #define END } のような括弧の対応が合わないマクロは凶悪です。 これに対応できる構造化されたマクロのアイディアが必要です。こいつらは、ネストした括弧の中におさめることができなかったりします。 #def (#BEGIN) ({) #def (#END) (}) …

複数行に渡るマクロが汚い

複数行に渡るマクロを書く場合、行末に、\をつければ可能ですが、あれは汚いです。\を付けない書き方をしたいです。 #def (#add($a,$b)) { ($a + $b) } みたいに書けたほうがよいでしょう。

ネストしよう

現状のC言語のマクロはネストしないのが常識のようになっていて非常に汚く感じます。 少なくともgccでは、プリプロセッサが行頭になくてはならない訳ではないようです。なので、#ifdef等があったらネストして書いたら良いと思うのですが、ネストしないで書き…

headmaster 2013

C Ada

おお、すげぇ。http://d.hatena.ne.jp/ytqwerty/20130301#p1すごい。mingwの条件付きでのみだそうですが、 windows.hのAdaへの自動変換が出来たそうです。でもって、どのプロジェクトでも出来てないってのは嘘だったそうです。すいません。TODO: 内容を修正…

SML#勉強会で末尾再帰最適化が分かった!

東北大で大堀先生の話が聞けるので行ってみてます。 入門な感じなので簡単なんじゃないかと思ってたのですけど、 関数型言語の授業を受けた事がないので絶好の機会なので楽しみにしてます。今回の授業では、末尾再帰最適化の話がありました。 実は複雑な末尾…

一山超えた

とりあえず、出来たけど、デカいしソースはまだ汚いのでソースは公開しない方向で。 PL/0やPascalやOberonのソースを読んだりしてて、Oberonでの解説があるんですけど、 英語なのと、参照使いまくってるので、ソースの理解がまだ出来てないとかあって、 もっ…