Crop (Colored-tiles Rotation Puzzle) とは,2 次元グリッドをベースとしたチューリング完全プログラミング言語である.
Crop 言語のプログラムは,2 次元の色付き (実装上は整数) グリッドを受け取り,処理を行って出力するシステムにおける記述である.処理命令は Rotation と Loop の 2 種類だけであり,それぞれ,次のような動作を行う.
-
Rotation: グリッドのすべての行あるいは列に対し,その行あるいは列が含む指定した色のマスの個数だけ,指定した方向にすべてのマスを移動させる.はみ出たマスはループして反対の端に戻る.
-
v 0 > 0
-
-
Loop: 条件を満たす間,ブロック内の命令を実行する.条件は,「マス X がある色 Y である」またはそれらの否定のどちらかである.
-
on [0, 2] == 0: > 1 on [0, 2] != 1: < 1
-
-
これらの他に,グリッドサイズの初期化文とマクロ定義,コメントを受け入れる.さらに将来的に拡張機能として関数定義を追加するかもしれないが,少なくとも Crop を成り立たせる上で初期化文以外は必要のない機能である.
-
init [10, 20] set RED 0 ^ RED # これはコメント # これはコメント
-
CRVM は,Crop 言語のバイトコードを実行するための仮想マシンであり,以下のような動作を実現する.
INIT N M
: グリッドの大きさを N 行 M 列に設定し,標準入力から入力を受け付ける.これは通常プログラムの最初に 1 度だけ実行される.- バイトコード:
00010000 + byte(N) + byte(M)
- バイトコード:
ROTATE D C
: グリッドを色 C を基準にして方向 D へ回転させる.- バイトコード:
0010 + op(D) + byte(C)
op(D)
:0000
: 下方向,0001
: 右方向,0010
: 上方向,0011
: 左方向
- バイトコード:
JUMP X
: 無条件でプログラムカウンタを X に移動させる.- バイトコード:
00110000 + byte(X)
- バイトコード:
JUMPIF X
: フラグが立っている場合,プログラムカウンタを X に移動させる.- バイトコード:
00110001 + byte(X)
- バイトコード:
JUMPIFN X
: フラグが立っていない場合,プログラムカウンタを X に移動させる.- バイトコード:
00110010 + byte(X)
- バイトコード:
TEST X Y Z
: グリッドのマス X, Y の色が Z であるかをフラグに設定する.- バイトコード:
01000000 + byte(X) + byte(Y) + byte(Z)
- バイトコード:
.cr/.crop (ソースファイル) -> crpp -> .cri (プリプロセスファイル) -> crc -> .crs (中間コード) -> crasm -> .cro (バイトコード) -> crvm
現在の問題点: パーサがないので,適切な空白がないと正しく変換できない.また,チェッカーがないので,実行時までエラーが出ない可能性がある.
- より安全なコンパイラの実装
- インタプリタの実装
- デバッグ可能なコンパイラの実装
- パズルゲームのアプリ開発
- ビジュアライザの作成
- テストコードの作成
- ツールチェインの作成
- 周辺ツールの作成