言語自作に関する思いを書く
(1)
- [Q] なぜインタプリタにこだわるのか?#1
- [A] インタプリタなら、実行しない部分をちゃんと書いておく必要はない。それがうれしい。
- 開発中に「とりあえずここまでで実行してみるか」って思ったときに、「宣言されていない関数を呼び出している部分があります」っていうエラーが出てくるのが本当にうっとうしい。「そこはどうせテスト実行しない部分なんだからどうでもいいだろ」って思うのに・・・。
- それでダミー関数を置いたりするわけだけど、それが効率のいいやり方だとは到底思えない。
- 他にも宣言していない変数を参照しているとか、そういうエラーもうっとうしい。だからそこは今回は実行しない部分だからどうでもいいって言っているのに!
- [Q] なぜインタプリタにこだわるのか?#2
- [A] インタプリタなら、eval命令を容易に実現できる。つまりプログラムでプログラムを生成し、それを直ちに実行できる。実行中に自分自身に関数や構造体を追加したり削除できたらどんなにいいだろう。
- いまでもC言語などでは機械語を出力して実行することはできる(JITコンパイラは基本的にそうやっている)。でも機械語を出力するので機種依存がある。機械語を出力するので、難易度が高い。EssenならEssenのプログラムを出力するだけでJITコンパイルをできるようにしてやろうではないか。
- [Q] プリプロセッサは排除したいのはなぜか?
- [A] ただのテキスト置換で言語の機能を補うというのは、うまいやり方ではない。#defineで関数もどきを書くときに、演算子の優先順位を何とかするために引数をカッコでくくるとか、バッドノウハウにしかみえない。そんなのが正解なんだろうか。
- 同じことがしたいのならinline関数で代用できるべきだし、#defineでやったほうが効率がいいのなら、それはもはやinline関数のほうを改良すべきなのであって、プリプロセッサによるテキスト置換が正当化されるわけではない。
- ただ、#if 0 ~ #endif でコメントアウトするのはネストできるので有益だと思う。でもこの記法は適切だとは思えないので、ネストできる記法を考えたい。
(2)
|