高級言語でesolangのインタプリタを書く
esolangの仕様をよく理解する方法はなんでしょうか。
それはインタプリタを作ることです。
これはインタプリタを作ることが仕様を理解することにもつながり、逆にインタプリタを実装した時のコードから仕様を思い出すことができるということでもあります。
インタプリタを作るとそれがそのインタプリタで実行する言語の仕様になります。
そして、インタプリタを作る上で通れない問題もあります。
それはプログラムのテストです。
テストを書くということは、高度なコードを書かないにせよ、そのインタプリタで実装する言語の知識は必要になります。
自分でインタプリタを書くメリット
自分の好きな機能を追加できる
一番大きなメリットです。
一般公開されているインタプリタの使用では満足できない場合は自分で作るのが一番早いです。
例えば実行を途中で止める機能やステップ実行などの追加はこれに該当します。
あとはUIなんかもそうかもしれません。
インタプリタの仕様を知れる
esolangには仕様があやふやなものがあります。
中には仕様を満たしていないインタプリタさえもあります。
そうなると公開されているインタプリタの仕様が自分の考えているものと異なる場合があります。
そうすると開発途中で予期せぬ仕様に関する認識の齟齬で動かないなんてこともあります。
自分で作ったものならそんな齟齬も発生しづらいです。
自分でインタプリタを書くデメリット
めんどくさい
インタプリタを作るのはめんどくさいです。
Brainfuckとかは簡単ですが、Pietなどは難しいです。
とても難しいです。
esolangでインタプリタを書く
esolang学習の一種の到達点、それがesolangでesolangのインタプリタを作ることです。
これはesolangの中でもとりわけ仕様が簡単なBrainfuckなどが良いでしょう。
言語のインタプリタを作るためにはそこそこの技量が必要となります。
なぜなら、インタプリタには繰り返しや分岐、加減算やデータの管理などプログラミングの基礎的な知識が全て詰まっているからです。
もしesolangでインタプリタを作ることができたら、それはその言語をものにしたと言っても過言ではないでしょう。
Brainfuckのインタプリタを考える
とりあえずこんな感じのインタプリタができれば十分でしょう。
$ bfi "+++++[->++++++<]>+++.<++++++++++."
!
$ bfi -f exclamation.bf
!
コマンドライン引数とファイルで指定できたらそこそこのことはできます。
もっと機能を追加するならJavaScriptを使ったWebアプリにするのがおすすめです。
色々な自分にあった機能を追加することで開発効率を飛躍的に向上させることができます。
基本的には以下のような機能を追加するだけです。
code //Brainfuckのコードが入る変数
pc //プログラムカウンタ
tape //長さ30000くらいのbyte配列を用意
tp //テープポインタ
for(pc=0, pc < leng(code), pc++):
switch code[i]:
case '+':
tape[tp]++
break
:
:
case '.':
putchar(tape[tp])
break