言語

ミニマムパーザ

本来のPEGよりも小さくしたミニマムパーザを作る。それには fail 単一値判定 順接 選択 否定先読み だけで充分だ。ただし、パーザを遅延評価するという実装上の都合として lazy も付ける。あとはアクションの記法を考えなくては。

目標

XXX(自作言語)で書ける部分はXXX(自作言語)で書く。 ライブラリとしても使えるように

並列化する未来

http://d.hatena.ne.jp/propella/20090103/p1について。 逐次型言語が足枷になりつつある点に同意。今は逐次型言語で並列処理をするためには同期や排他が必要だが、それらは、後付の仕組みだからだろう、抽象化に漏れがある箇所が多すぎる。 時間に関する制…

理論的背景

PPEGについてちょっと考え直してみたら、PEGを生成するParser Combinatorという扱いになるようだ。Parser CombinatorというとHaskellのものが有名だが、今回の用途だと向いていないかもしれない。とりあえず、このままschemeで書く。stalinでもコンパイルで…

Monad

入力を抽象化しまくったらMonadになった。

ちょっと浮気

PEGをGaucheで書いてみた。……想像以上に簡単に書けた。python要らない? (追記) http://practical-scheme.net/wiliki/wiliki.cgi?amb 特に役立っているはこのambマクロだと思う。 文法要素はすべてthunkにした。ambマクロを包んだthunkを実行するたびにバッ…

C++

C++版はひとまず後回しに。

decorators

decoratorsライブラリをもうちょっと充実させたい。言うまでもなくdocassertは毎回evalせずとも動くはずだし。Packrat関係で作ったメモ化デコレータも公開する予定。

PPEG

PPEG(Parameterized Parsing Expression Grammar)というのはどうだろう。要するにPEGの文法要素にパラメータを渡して解析の自由度を上げようというアイディア。理論的には夾雑物以外の何者でもないが、ライブラリの実装も文法の実装もかなり楽になるはずだ。…

とりあえず

C++版を書いてみようと思います。結局、PEGとVMの両輪さえあれば何でもできるということか。

負けた

gccがどれくらい速いのかというのを確認するためにintの階乗という簡単なプログラムを手書きアセンブラとC言語で書いて実行してみた。手書きアセンブラは末尾再帰にしたりレジスタ渡しにしたりその場で思い付く限りの高速化を加えたもの。 しかし、手書きア…

Forth--

今は簡単なDSLを作りながらXXX(自作言語)に必要なものを考えている。例えばForth風の言語を一つでっちあげてみた。言語系の要素は 無名関数定義 ':' ... ';' 辞書読み '?' 辞書書き '@' プリミティブ実行 '!' 数値 [1-9][0-9]* 識別子 それ以外全部 実行系の…

中間言語

現状の実行系は python関数を並べた配列一つがXXX(自作言語)関数の一つに相当する。 実行状態ポインタがXXX(自作言語)関数の一部を指している。 run()は実行状態ポインタのポイント先を実行→インクリメントの繰り返し。 jump系の操作では実行状態ポインタを…

命名!

自作言語の名前をXXX(自作言語)にしようと思う*1。メタ言語という点に因んだ名前が思いつかなかったが、 不定形という点を強調してみよう。 テケリ?いやいや。 あまり畏れ多い名前もダメ。 XXX(自作言語)なら響きも良いな。 という曲折を経て決定した。半分…

Packrat

PEG内PEGを使ってPackrat Parserを生成できるようにした。 Packrat Parserとは要するにメモ化付きのPEG実装だ。PEGでは非終端記号と入力列の位置だけから結果が求まる。つまりメモ化すれば(非終端記号の種類)×(入力列の長さ)程度の時間で解析が終わる。 た…

PEG on PEG

PEGでPEGを書いた。これで標準入力から文法を入力できる。 自前のPEGを書いていた動機はこの点にある。大抵のコンパイラ・コンパイラやパーザ・ジェネレータは静的なパーザしか生成できない。普通の用途ではそれで十分だし、速度面のメリットもある。しかし…

PEG

PEGでの開発速度を測ってみた。 後置記法電卓 実装+テストで3分。 中置記法電卓 実装+テストで5分。 lisp記法電卓 実装+テストで10分。 lispのみバグがあったので長い。それを差し引いても10分で書ければ悪くないだろう。

自作言語を作る!

……表題に偽りあり。既にpythonでプロトタイプが動いているので今から作るわけではない。しばらくしたら公開する予定だけどまだ名前を考えていない。 まあ、超スマートポインタもPEGも基本的にそっちの系列だし、既存言語の実装の次は自作言語の作成だよね。 …

抽象データ型

抽象データ型にはインターフェースの大きいものと小さいものがある。例えば、stackとqueueはlistよりも小さい。listとsetはmapよりも小さい。もちろん、配列が一つあればどんなデータ構造も表現できる(fortran!)けれど、面倒な手続きを介さなければならない…

思いつき

ちょっと思いついたことがあるので実装してみる。

プロファイリング

http://d.hatena.ne.jp/tazant/20081025/1224930470 プロファイリング手法は幾つかあるが、私が好きなのはランダムサンプリング方式。 準備 適当な間隔でタイマー割込するスレッド。 実行対象のプログラム。 方式 本体スレッドが動く前に割込スレッドを動か…

捨てた方が良いんじゃない?

すでに動いているソフトウェアを他言語へポーティングするのって簡単そうに思われるけどそれほど簡単ではないよね。いや、機械的コンバートなら楽勝なんだけど、コンバート後のソースコードって読めたものではないし、性能もぐだぐだになりがちだし、ほとん…

本質

言語の違いなど本質ではない 言語の違いこそ本質である どちらも正しい。 TMPなしのC++とJava、C#の間なら言語の違いなど本質ではない。ライブラリの違いの方が余程重要だ。逆にC、Lisp、Forthの間なら言語の違いこそ本質である。この違いをライブラリで埋め…

PEG

自作PEGで遊んでいて気付いたこと。 Forthの2スタック方式だと末尾再帰の最適化がとても簡単。

演算子

pythonの特殊メソッドは妙に充実している。 二項演算子を逆向きにも定義できるとは自由すぎる。

ノイズ続き

http://q.hatena.ne.jp/1222138124 これはひどい。汚染の上に汚染を重ねた時点でデータとして価値がない。しかも元のアンケートを踏まえて回答すれば、わざと正しい答えを書くか、わざと間違った答えを書くか、という二択になってしまう。別の母集団・別の文…

発見

shiroさんのところで紹介されていた。ついでにとても含蓄の深い言葉があったので引用しておく。事実、stalinは最適化に矢鱈に時間をかけているわけだし。 http://practical-scheme.net/wiliki/wiliki.cgi?Shiro%3Alog%3A2007%E5%BE%8C%E5%8D%8A >Stalinがす…

それと

schemeって本当に遅いの?scheme最速と評判のstalinのベンチマークが欲しいところ。

ノイズ

http://d.hatena.ne.jp/nishiohirokazu/20080922/1222094878 西尾さんの「20人中19人がノイズ」というのは、残念なことだが、事実だと思う。「これに答えられない方は解答をご遠慮ください。」と書いてあるのを無視して答える人がノイズでなければ何だという…

this

thisがあるのならhereやnowがあっても良いよね。