2016-10-01から1ヶ月間の記事一覧

連鎖性言語を作る11

原因がまったく想像できない難解なバグに遭遇した場合、怪しいところから調べるのではなく、当たり前に大丈夫なはずのところから本当に大丈夫であることを確定していくほうが結果的に速く原因に辿り着けることがある。急がば回れという話だが、真剣におかし…

連鎖性言語を作る10

オレ言語のコードをRubyコードに変換してevalすれば、VMで実行するのと比べてディスパッチが無くなって速くなる。毎回evalするとRubyのコンパイルが発生してオーバーヘッドがあるので、evalでProcを生成して、実行時はそれを呼ぶだけ、という形にしておくの…

連鎖性言語を作る9

VMの命令列にコンパイルして実行するようになったのでなんとなくVMっぽい気がする感じになったところで、命令が2個しかないのは物足りない。これを増やすことを考えてみよう。オレ言語はスタック指向であり、スタックマシンのVMとは相性がよい。相性がよいと…

連鎖性言語を作る8

オレ言語の実装として、Rubyの配列にオブジェクトを詰めたものをASTとして扱っているのは特徴的だ。実際コード自身がオブジェクトを並べたような見た目をしているのでこれはこれで直感的とも言える。ところでVMはそのASTを解釈して実行しているわけなので、…

連鎖性言語を作る7

スタックエフェクトはForthではコメントだがFactorではコンパイル時にチェックされる記述になっている。コンパイルはワードの定義時ではなく実行時にされる。らしい。 例えば、 : aaa ( x -- x ) drop ;などと定義すると、これを呼び出すときに「effect-erro…

連鎖性言語を作る6

リテインスタックを作ろう。これは通常のデータスタックとは別のスタックで、一時保存用のものとなる。作るのは非常に簡単で、VMにインスタンス変数を追加して、データスタックとのやりとりをする>r、r>を追加する。 @retain_stack = [] :">r" => ->{@retain…