コンパイラ

「末尾最適化」を正しく理解する

以下の記事でPythonやRubyの末尾再帰関数をループに変換する手法が「末尾再帰最適化」や「末尾呼び出し最適化」として紹介されているのですが、これらの用語を使うのは間違いです。 紹介されている手法(動的束縛を利用して制御フローを変形する手法)自体は大…

JavaでAST作るのは大変

コンパイラの実装言語にあると良い機能でJavaでAST(抽象構文木)作るのが大変だという話に触れたのだけれども、実は自分の知らない良いやり方があるのではないかと思ってClojureなどJavaで実装された処理系のソースを覗いてみました。 結論:やっぱり大変。 C…

brainfuckのコードを自動生成するコンパイラ

S式からbrainfuckのコードを自動生成するプログラムを書いてみました。 コード生成が目的ではなくて単にできるだろうかと気になったのでやってみました。gaucheを使いました。 brainfuck インタプリタをスタックマシンっぽく使って動作します。 変数が使える…

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

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

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

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

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

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