/Crop

Primary LanguageC++

Crop Programming Language

Crop (Colored-tiles Rotation Puzzle) とは,2 次元グリッドをベースとしたチューリング完全プログラミング言語である.

概要

Crop 言語のプログラムは,2 次元の色付き (実装上は整数) グリッドを受け取り,処理を行って出力するシステムにおける記述である.処理命令は RotationLoop の 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 Virtual Machine)

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

問題点 (Issue)

現在の問題点: パーサがないので,適切な空白がないと正しく変換できない.また,チェッカーがないので,実行時までエラーが出ない可能性がある.

課題 (Task)

  • より安全なコンパイラの実装
  • インタプリタの実装
  • デバッグ可能なコンパイラの実装
  • パズルゲームのアプリ開発
  • ビジュアライザの作成
  • テストコードの作成
  • ツールチェインの作成
  • 周辺ツールの作成