サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
2024年ランキング
nineties.hatenadiary.org
3年ぶりに更新します。この3年間にも(途中1年以上別の事をやっていましたが)自作の言語とその処理系の開発は続けていました。そろそろ紹介記事を書き始めようと思います。ホームページは既にありますが、こちらは昨年の夏から更新していないので内容が古くなっています。本記事を元にして後で更新します。 言語の名前はAmberと言います。Amberとは日本語で琥珀という意味です。実は同名の言語処理系がいくつか存在するのですが(larsivi / amber / wiki / Home — Bitbucket, GitHub - eknkc/amber: Amber is an elegant templating engine for Go Programming Language, inspired from HAML and Jade, The Amber Programming Languageなど
以下の記事でPythonやRubyの末尾再帰関数をループに変換する手法が「末尾再帰最適化」や「末尾呼び出し最適化」として紹介されているのですが、これらの用語を使うのは間違いです。 紹介されている手法(動的束縛を利用して制御フローを変形する手法)自体は大変面白いですね。 Pythonで末尾再帰最適化をする。 Rubyで末尾再帰最適化をする。 参考文献として以下を挙げておきます。 William D. Clinger "Proper Tail Recursion and Space Efficiency" ちゃんと読み直していないので、以下の説明に間違いがあるかも知れません。その場合はご指摘お願いします。 まず「末尾呼び出し(Tail Call)」は関数の一番最後の式(末尾式)であって、関数呼び出しであるものを指します。 void foo() { bar(); baz(); /* 末尾呼び出し
n個の対応する括弧のパターンの数を母関数を使って求めてみました。 これはid:nobsunさんが指摘なさっているようにカタラン数という数になるんですが、そういう前提知識なしで機械的に解きたいような場合に使えます。 いろんな教科書があると思いますが、私は以下の本で学びました。 参考書籍: コンピュータの数学 作者: ロナルド・L.グレアム,オーレンパタシュニク,ドナルド・E.クヌース,Ronald L. Graham,Oren Patashnik,Donald E. Knuth,有沢誠,萩野達也,安村通晃,石畑清出版社/メーカー: 共立出版発売日: 1993/08メディア: 単行本購入: 5人 クリック: 224回この商品を含むブログ (38件) を見るまず求めるパターンを全て書きだした形式的なべき級数を考えてみます。式の中の1は括弧を一個も使わないパターンのつもり。 T = 1 + ()
Haskellに副作用があるのか?というのは難しいテーマだと思いますが、少なくとも最適化理論での一般的な「副作用」の定義ではHaskellは全く副作用がない言語と言えると思います。 理論的に美しいという点がHaskellの設計の一番重要なところだと思うのですが、バックエンドの泥臭い話も面白いかもと思ったので書いてみます。 私は主に手続き型言語の最適化をやっていて関数型言語は詳しくありませんので、見当違いな事を書いていたら指摘して下さい。 まずは副作用の定義の為に「データ依存関係」(Wikipedia:依存関係)の説明をします。 ある変数xを使用・定義する二つの文を考える時、その評価順序関係には以下の4種類があり、それぞれの関係を以下のように呼びます。 真の依存 x = ... ... ... = x 逆依存 ... = x ... x = ... 出力依存 x = ... ... x =
ベンチマーク用途を目的としてRubyで書いたレイトレーサーを公開します。 http://github.com/nineties/raytracer 以下をPart3まで実装したものです。 http://www.devmaster.net/articles/raytracing_series/part1.php PPM形式の画像を生成するので適当に変換してください。 また、より良い書き方があれば教えて下さい。 たった300行に満たないスクリプトで以下の様なレンダリングができて、Rubyの記述力の高さに驚かされました。 私の環境(Core 2 Duo + Windows 7 + VMPlayer + Debian + Ruby 1.9.1)でのレンダリング時間は 1枚目:4分43秒 2枚目:41分12秒 でした。ちなみにオリジナルのC++コードはどちらも数秒という話です。
プログラミング言語の高級化はえてしてプログラムを複雑化し最適化を阻害してしまいます。 rowlの開発ではこのトレードオフについて神経質になろうと思っています。 最適化の基本 最適化には命令数削減・並列化・パイプライン最適化・レジスタ割り当て・スケジューリング・キャッシュ最適化・・・とさまざまな対象・手法が存在しますが、いずれにも共通する事は 元のプログラムをより良いものに変形する という事で、その際に重要なのは プログラムの意味を変えてはならない という最適化の基本原則です。プログラムの意味を変えない為にはプログラムの解析が必要で、その為の手法は大きく分けると フロー解析 型解析 です。最適化がしやすい言語とはこれらを精度よく行う事が出来る言語と言う事ができます。 また、Haskellの様な参照透過性が完璧に保たれている言語ではこれらの解析をすることなくプログラムの変形が可能です。 型解析
構造体とか配列とかどんな言語にも大体あるものは除きます。あくまで私の主観です。 lex/yacc/gperfなどのツール 特にyaccがないと複雑な言語のパースは大変。 バリアント 構文木の表現に一番適していると思う。 パターンマッチ コンパイラ内部はパターンマッチだらけ。 テーブルジャンプを用いた高速な実装ならなおよし。 ハッシュテーブル 名前の管理。必須。 バイナリ処理 バイナリファイル触るならもちろん。 ビットベクトル・ビット行列 フロー解析で必須。フロー解析に基づく最適化をするなら。 高速な集合演算があると良い。 SetやDisjoint Setなどのコンテナ 最適化の実装で使う。Disjoint Setはエイリアス解析で主に使う。もしやるなら。 グラフ 主にフローグラフ。値グラフでも使ったりする。 フローグラフはまばらなので基本的にAdjacency List表現。 Predec
このページを最初にブックマークしてみませんか?
『ブートストラッピングでコンパイラを作る日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く