Whitespaceeエディタは、プログラミング言語Whitespaceの開発環境です。
逆に、
Whitespaceは、2003年くらいに作られた難解プログラミング言語の1つです。
Whitespace最大の特徴は、3つの文字しか使わないということです。しかも、その3つの文字とは半角スペース・タブ・改行です。他の文字は全て無視されるので、普通の文章に混ぜてプログラムを書けるかもしれません。
Whitespaceには、符号付き整数のスタックが1つだけあります。スタックとは、値を順番に積んだり(追加したり)取り出したりできるというものです。値をスタックの一番上に積むことをプッシュといい、一番上を取り出すことをポップといいます。
例えば、空のスタックに2・3・5を順番に積むと、スタックは
2 3 5
という状態になります。ここでポップすると、スタックは
2 3
になります。
さらに、ヒープアクセスというものがあります。実はよく分からないのですが、整数を要素とした連想配列で、値も整数です。これは、整数を変数名とした変数であると思うとよいでしょう。
また、ラベルが存在します。ラベルがあると、他のところからラベルに実行位置を移動することができます。また、サブルーチンもあり、これも実行位置がラベルの位置に移動しますが、サブルーチンが終了すると元の位置に戻ることができます。
Whitespaceは、半角スペース([Space])、タブ([Tab])、改行([LF])の3つの文字のみを使用して全てを表します。そこで、命令の表し方を解説します。
命令はIMPと命令名に分かれ、IMPと命令名を続けて書きます。たくさんある命令をIMPで大きく分類し、その中から具体的な命令を選ぶという感じです。
例えば、IMPが[Tab][Space]で、命令名が[Space][LF](掛け算)だとすると、命令全体は[Tab][Space][Space][LF]と表されることになります。
さらに、一部の命令には引数が必要です。これは、命令に与えるパラメータで、命令の後に続けて書きます。引数には数値とラベルの二種類があります。
数値の表し方は、まず値が+(正)なら[Space]を、-(負)なら[Tab]を書き、その後はビットが0なら[Space]、1なら[Tab]として二進数で書きます。例えば、25(二進数で+11001)なら[Space][Tab][Tab][Space][Space][Tab]と書き、-18(二進数で-10010)なら[Tab][Tab][Space][Space][Tab][Space]と書きます。終了は[LF]です。
ラベルの場合は、自由な[Space]と[Tab]の組み合わせです。つまり、この二種類の文字を組み合わせて自由にラベル名を作るということです。これも[LF]で終了です。
IMPは5種類あります。
IMP | 意味 |
---|---|
[Space] | スタック操作 |
[Tab][Space] | 算術 |
[Tab][Tab] | ヒープアクセス |
[LF] | フローコントロール |
[Tab][LF] | 入出力 |
命令 | 引数 | 動作 |
---|---|---|
[Space] | 数値 | 引数の数値をスタックにプッシュする。 |
[LF][Space] | なし | スタックの一番上を複製する。 |
[Tab][Space] | 数値 | スラックの上から(数値)番目をコピーして一番上に置く。 |
[LF][Tab] | なし | スタックの一番上とその次を交換する。 |
[LF][LF] | なし | スタックの一番上を破棄する。 |
[Tab][LF] | 数値 | スタックの一番上をそのままに、その次から(数値)個を破棄する。 |
算術では、スタックを2つポップし、その2つについて計算して結果をスタックにプッシュします。
引き算や割り算のように数値の順番が関係あるものについては、先にポップしたほう(一番上にあったほう)が左側にきます。
命令 | 引数 | 動作 |
---|---|---|
[Space][Space] | なし | 足し算 |
[Space][Tab] | なし | 引き算 |
[Space][LF] | なし | 掛け算 |
[Tab][Space] | なし | 割り算 |
[Tab][Tab] | なし | 割った余り |
命令 | 引数 | 動作 |
---|---|---|
[Space] | なし | ストア(スタックから順にx,yをポップし、y番目のヒープ領域にxを書き込む) |
[Tab] | なし | リトリヴ(スタックからxをポップし、x番目のヒープ領域の値をプッシュする) |
フローコントロールは、プログラムの流れ(ラベル・条件分岐など)に関する命令です。
命令 | 引数 | 動作 |
---|---|---|
[Space][Space] | ラベル | ラベル(その場所をラベルにする) |
[Space][Tab] | ラベル | サブルーチンとしてラベルの場所に移動する(終了後戻る) |
[Space][LF] | ラベル | ジャンプ(ラベルの場所に移動する) |
[Tab][Space] | ラベル | スタックをポップして、0ならばジャンプする。 |
[Tab][Tab] | ラベル | スタックをポップして、0でないならばジャンプする。 |
[Tab][LF] | なし | サブルーチンを終了して元の場所に戻る。 |
[LF][LF] | なし | プログラムを終了する。 |
命令 | 引数 | 動作 |
---|---|---|
[Space][Space] | なし | スタックをポップして、その数値をASCIIコードに持つ文字を出力する。 |
[Space][Tab] | なし | スタックをポップして、その数値を出力する。 |
[Tab][Space] | なし | ユーザーに一文字入力してもらう。スタックからポップして、その値の位置に入力結果のASCIIコードをストアする。 |
[Tab][Tab] | なし | ユーザーに数値を入力してもらう。スタックからポップして、その値の位置に入力結果をストアする。 |
Whitespaceエディタでは、複数のファイルを同時に開くことができます。
カーソルは青い線で表されます。上下キーで移動し、またマウスクリックでも移動できます。スクロールは、マウスホイールや、Home/Endキー、PageUp/PageDownキーにも対応しています。
スペースキー、タブキー、エンターキーの3つを使って入力します。「ヘルプを表示する」の設定を利用する場合には、画面の右側にヘルプが表示されます。
テキストエディタに[Space]、[Tab]、[LF]を使うのと同じように入力できます。ヘルプを表示する場合、IMPを入力中の際にはIMPの一覧、命令を入力中の場合には命令の一覧が表示され、数値・ラベルを入力中の場合にはそれが表示されます。
入力したコードは、スペース・タブ・改行そのままではなく1行1命令として各命令の意味を同時に表示します。
また、命令と命令を区切るために空白をShift+Enterで入力することが可能です。これは、実行時には無視されます。BackSpaceキーでカーソルの前、Deleteキーでカーソルの後の命令を削除します。
入力を途中でやめたい場合、Escキーを押すと中止されます。
命令を入力した後、続けて数値を入力する場合は、0〜9のキーを使う方法と、スペースキーとタブキーを使ってプログラムそのままで入力する方法があり、両方使うことができます。ラベルを入力する場合は、プログラムと同様にそのまま入力します。どちらもエンターキーで入力完了します。
「ファイル」メニューから、「新規作成」「開く」「上書き保存」「名前を付けて保存」「テキストファイルを出力」ができます。「上書き保存」は、Ctrl+Sのショートカットキーが使用可能です。
また、ウィンドウにファイルをドラッグ&ドロップすることでもファイルを開くことができます。
ファイル形式は二種類あります。プログラムは、内部で独自形式で扱われています。「上書き保存」「名前をつけて保存」では、この独自形式で扱われます。拡張子は.wsbになります。「テキストファイルを出力」では、編集したものを、Whitespaceのソースコードとして出力します。
ファイルを開く場合は、両方の形式を開くことができます。拡張子が.wsbの場合独自形式として、それ以外の場合はテキストファイルのソースコードとして開きます。
また、現在開いているタブを閉じるには、タブを右クリックして「閉じる」を選択します。
実行に関するコマンドは、「実行」「ステップ実行」「停止」の3種類があります。
普通に現在開いているコードを実行します。F5キーでも実行することができます。
一命令ずつ実行する方法です。Shift+F5でもステップ実行できます。Enterキーを押すと次に進みます。この状態で「実行」すると、続きから通常の実行を行ないます。
ステップ実行を中止したり、また、実行すると出てくる出力欄などを消去します。
編集時、F9キーを押すとその地点をブレークポイントに設定します。通常の実行中でも、ここを通るとステップ実行に切り替わります。同じ場所でF9キーを押すと、解除できます。
メニューの「実行」で、次のオプションが設定できます。
ソフトの本体です。このファイルを起動すると、ソフトが起動します。
このファイルです。
Whitespaceのコードのサンプルがいくつか入っています。