最近考えていた事。まだ不完全だけど書いてみる。
先ず、1+2のようなコードについて考える。構文解析すると以下のようなツリーに変換される。
+
12このツリーに対して、もし最適化可能であれば最適化後のツリーに置き換えるという操作をする。
この時、加算演算子の持つ2つの項は定数なので、評価結果は必ず一定である事が分かる。実際にこれを評価すると結果は3になるので、3に置き換えれば良い。
先に評価される部分を先に評価するようにしたいので、操作対象として指定したノードに対する操作をする前にそのノードが持つ項に対して評価される順番に同じ操作を行うように実装する。これは再帰関数によって容易に実装出来る。
これによって(1+2)+3のようなコードを最適化出来るようになる。
(var=1),(var+2)のようなコードについて考える。構文解析すると以下のようなツリーに変換される。
,
=
var1+
var2このツリーに対して置き換え操作を行う。
すると、最初にvar=1に対して置き換え操作が実行されるが、置き換えるべき部分は無い。次にvar+2に対して置き換え操作が実行され、そこでvarに対して置き換え操作が実行される。この時点での変数varの中身を特定出来れば、この文の最適化が出来る。
変数varの中身を特定する為には、実行される順と逆にツリーを探索し、変数varの状態を変更している箇所(この例ではvar=1)を探せば良い。但し、探索途中で変数varの状態を変更し得るのか変更し得ないのかがはっきりしないノードが存在した場合、そこで探索を中断する必要がある。
本当は(var<<2)&3のようなコードを評価すると必ず偽値になる事を計算する方法についても考えているのですが、まだ纏まらないので今度書きます。
聞く人として参加しました。今回は都合によりちゃんとした参加申し込みをせずに行きましたが、次回はどうにかします。
GCC拡張を利用したスレッデットコードとかはもしかしたらすぐに使うかも。(当然GCC依存にならないように別の処理系用のソースは用意しますが。)
::outside疑似要素の紹介山岸さんの発表。CSSのセレクタの仕様があまり柔軟ではなくて困る事は良くあるので、使えると便利そう。
面白そうではあるのだけど、一番重要な部分が前提知識不足で良く分からなかった。
CPUのキャッシュメモリを利用する高速化手法とかメモリ管理とかについて聞きながら烏龍茶を飲んだ。
という事でやっと終わりました。遅すぎ。
値段あたりの表現出来るデータ量をHDと比較してみる。
500GBのHDを10000円とし、A4の紙一枚を1円とする。適当に調べて決めた値なので疑問に思った方は調べ直して教えてくれると助かります。
紙は1平方ミリメートルあたり1bitのデータを表現出来るとすると、A4の紙の面積は62370平方ミリメートルなので、片面で62370bit、両面で124740bitのデータを表現出来る。
500GBのHD一台と同じ値段のA4の紙は10000枚。12474000000bitは約148.701668MB。
紙は限られた資源を利用して作られた非常に高価な物です。大切に使いましょう。
BNFで言語の構文を定義。(機械的に処理する目的で使う訳ではないので適当に拡張しても問題は無い。)
パース後のツリー構造の仕様を書く。
パーサーを書く。
ライブラリは特定の機能を使い回せる形にして開発効率を上げたりする為の物であり、初心者が楽にプログラムを書く為の物ではない。
目的によって選ぶべき言語は違うと思う。
コンピューターのハードウェアに近い部分を制御したいならアセンブリ言語,C、コンピューターに関する理論を学びたいならBrainfuck,Sheme、Webアプリケーションを作りたいならPython,Ruby,PHP,Perlを使うのが良いと思う。
もし目的が決まっていて、その上で特定の言語が良いとか悪いとかいう議論なら理解出来るのだけど、どのような用途にでも適している言語は無い。
あと、最もタメになる「初心者用言語」に関する議論とは関係無いけど、最もタメになる「初心者用言語」まとめでBrainfuckとWhitespaceを同じような言語として扱っているけど、これは全く違う言語。
Brainfuckは完全に一文字で一つの命令になっているのに対し、Whitespaceは一つの命令を複数のパラメーターの組み合わせで表現している。また、計算モデルも全く違う。(Grassも違う気がするけど仕様をちゃんと読んだ訳ではないので触れない事にする)