処理系を書くのに向いている処理系は?
注意:俺基準
- その環境での最大精度浮動小数点実数とか長いビットの整数とか使える
- OSの文字コード変換APIとかにそれなりに簡単にアクセスできたほうが嬉しい
- 型は強型よりも構造一致で見てくれるほうが嬉しそうな気がする
- GCがある→コンパイラ向け、ない→インタプリタ向け
- 簡潔に書ける→コンパイラ向け、堅牢に書けて速度追求も可能→インタプリタ向け
- オプションで余計な実行時チェックを一掃できたりすると一層インタプリタ向け
- 他の処理系から簡単にリンクできたりすると一層インタプリタ向け
- 重たいVMとかの上で動く言語はどちら向けでもない
とりあえず経験からDelphiはとてもインタプリタ向き。Delphiでインタプリタ書くと楽しいです。コンパイラ書くとめんどいです。
D言語はGCがある分コンパイラ向けですが、Delphiと比べGCがある以上の記述力の向上があるわけではなく、中途半端。アクセス違反とかあまりにも容易に起こせるのも×。その際アクセス違反が起きたコードアドレス教えてくれないのがもっと×。*1 *2モジュール中でprivate/publicを何度でも切り替えられるのはちょっとだけ嬉しい。
適当なこの箇条書きに照らしてみるとAdaもインタプリタ向きと思われます。AdaプラスBoehmGCなら?とか考えましたが、D言語と同じ末路になりそう。暗黙の実行時チェックを多く行ってくれるのと、とにかく記述が面倒なのとでトントンぐらいか?gcc/GNATというコンパイラ自己記述の例が見えるところにある言語ではあるのですが…。
こう考えると成程OCamlはコンパイラ向きであるととても思えますが、最初の2項目つまりその環境の能力を引き出す機能に欠けているのが難点かな…。単に外部ルーチン書けばいいだけの話なんですけど。あとこれだけOCamlが処理系向けと絶賛されているこの世界では、OCamlに落ち着いてしまうよりもDelphiやD言語その他を無理して使ったほうが削りカスほどの心を満たせるような気がしないでもない。
ILogScript…条件はかなり良さそうですが、私は型チェックの無い言語で処理系のような複雑なものを書く自信がありません…。
*1:id:shinichiro_hさんに聞いた話ではLinux版は教えてくれるのですね…。
*2:考えてみればアンフェアな評価だ。エラー箇所がわからないなんつうのは処理系を作るときだけの問題じゃないから。