2010-06-01から1ヶ月間の記事一覧

プログラミング言語の最適化のしやすさについて

プログラミング言語の高級化はえてしてプログラムを複雑化し最適化を阻害してしまいます。 rowlの開発ではこのトレードオフについて神経質になろうと思っています。 最適化の基本 最適化には命令数削減・並列化・パイプライン最適化・レジスタ割り当て・スケ…

コンパイラの実装言語にあると良い機能

構造体とか配列とかどんな言語にも大体あるものは除きます。あくまで私の主観です。 lex/yacc/gperfなどのツール 特にyaccがないと複雑な言語のパースは大変。 バリアント 構文木の表現に一番適していると思う。 パターンマッチ コンパイラ内部はパターンマ…

純粋関数型言語の処理系を作ってみることにした

関数型言語というと型システムなどフロントエンド部に注目が集まりやすいと思いますが、私はバックエンドの実装に興味があります。 そこで小さな純粋関数型言語の処理系を作ることにしました。名前は安直ですがpurefにします。方針 勉強用の実装 飾りは付け…

構文木・レキサ・パーサ

構文木は教科書7ページに書いてあります。非常にシンプルです。Haskellのような複雑な言語も構文糖衣を取り除くと,同様の言語まで単純化されます。そんなバカなと思う人は,GHCのソースのghc/compiler/coreSyn/CoreSyn.lhsを読んでみて下さい。 レキサ/パーサ…

cppの生成するディレクティブのフラグの意味

C言語のソースをcppにかけると生成されるディレクティブの意味。 # 1 "/usr/include/math.h" 1 3 4 最初の数字はファイルの行番号で、末尾の数字は 1 : includeを開始して新たなファイルに移る (ENTERフラグ) 2 : includeを終了して元のファイルに戻る (LEAV…

電卓

今日ふと高校時代に電卓遊びにハマっていた事を思い出したので、メモしておきます。√のない計算機でNの平方根を求めたい場合は [N(数字)][M+]と押したあと [MR][x][MR][-][N][/][2][/][MR][M-]を繰り返します。 Nのm乗根の場合は [N][M+]と押したあと [MR][x…

rowl1言語コンパイラをコンパイルするコンパイラ作成中

ようやくブートストラッピングの次のステップであるrowl1言語開発に着手しました。rowl1言語コンパイラはrowlVM上で動作するプログラムとして作成します。 rowl1コンパイラ記述言語のアセンブリ言語のアセンブラ http://github.com/nineties 中のrowl-assemb…

これまでの進捗の整理

アセンブリ(gas)でrowl0言語のコンパイラを作成した rowl0言語でrowl1言語のコンパイラ(型システム含む)を実装したが、バグ多発でいったん白紙に戻す。 rowl0言語でLISP風rowl-core言語のインタプリタを作成した rowl-core言語でvm記述言語を定義しvm記述言…

実行可能ファイルのフォーマット

実行可能ファイル(拡張子.rlx)からのロード・実行を実装しました。http://github.com/nineties/rowl/commit/c454fd019919dee0526ecc96b256091ca1da9771実行可能ファイルのフォーマットは先頭から 1ワード : ファイルの総バイト数(=N) 1ワード : グローバル参…

rowlVM/GC ブロック・ページの管理(再考)

今朝書いたのは綺麗ではなかったので考えなおします。多分車輪の再発明だと思いますが。 ポイントはページ⇔ページデスクリプタ間のアドレス変換のシンプル化です。 ページデスクリプタ・ページの配置を以下のようにします。 |<---------------------- 1 Mbyt…

rowlVM/GC ブロック・ページの管理

この論文 Compacting Garbage Collection with Ambiguous Roots ではあらかじめ固定長のメモリブロックがあって個定数のページがあるような実装になっているので直します。 GHCのアロケータ実装を参考にしています。まず、メモリはブロック単位(1Mbyte)でア…

データ型の定義

現在rowlVMにGCを実装中です。型のない言語で書いているのもあって、コードは汚くなってきましたがこのままいきます。 実装するGCは速度が気になりますが、とりあえずはMostly Copying GCで行こうと思います。下を参考にして、自分なりに修正をして実装しま…

マシンレジスタ割り当て

現在のマシンレジスタの割り当て状況のメモ。 %eax 汎用レジスタ %ebx 汎用レジスタ %ecx プログラムカウンタ %edx ゼロレジスタ(常に0が入っている) %esi スタックポインタ %edi ベースポインタ %ebxと%esi,%ediの値は保存しなければならない為関数の先頭…

組み込み型・命令(暫定)

コンパイラ・インタプリタ作成に特化した型・命令(consセルやビット配列)を用意して個性を出す方針。1バイトで足りるだろうか。組み込み型 ブール型 整数 (8bit・16bit・32bit・64bit) 浮動小数点数 (単精度・倍精度) 以上非ボックス化型 シンボル consセル …

関数が定義できるようになった。

rowlVM上で関数定義が出来るようになりました。 以下はfibonacciの定義。バイトコード長は22バイトです。今は手書きだけど、後でコンパイラ作ります。 (byte[] 100 fib @(assemble `( arg0 imm_i3 isub (if_lt hoge) arg0 imm_i1 isub (vcall 0 4) ; 0番(fib…

rowl VM/GC の実装

現在VM/GCの実装中です。 これまでの開発経過です。 1. rowl-coreインタプリタを開発 LISPの様なS式で書かれたrowl-core言語を処理する簡易インタプリタを以前作ったrowl0で実装しました。 言語機能が低いうちはインタプリタの方が簡単に作れるので、開発を…