Rubyist のための他言語探訪 【第 14 回】 Whitespace
著者:まつもとゆきひろ
Whitespace
今回は普段とは趣を変えて、実用性は全くないけれども話のネタとしては面白い言語「Whitespace」を紹介しましょう。
Whitespace は Durham 大学の Edwin Brady と Chris Morris によって開発され、2003 年 4 月 1 日にリリースされました。 つまり、エイプリルフールのジョークだったわけです。 しかし、Whitespace は単なるジョークではなく、(見かけはともかく) ちゃんと動作する言語です。 多くの言語 (Python などを除く) ではスペース、タブ、改行などの空白 (whitespace) を無視しますが、Whitespace では逆に空白以外の文字を無視します。 図 1 は Whitespace による Hello World プログラムです。 しかし、すべてが空白であるため、人間の目にはなんのことだかわかりません。
図 1 WhitespaceによるHello World
Whitespace の命令
人間に読めないプログラムを扱うのは難しいので、まず Whitespace の文法を紹介し、人間に読める形に置換してみましょう。 「異常な」外見を持つ Whitespace ですが、その構造は意外にストレートです。 Whitespace は単純なスタックベースのプログラミング言語です。 Whitespace の命令は「IMP (Instruction Modification Parameter)」、「コマンド」、「パラメータ」から構成されます。
IMP は命令の種類を決めるプレフィックスです。 スタック操作とフロー操作はもっとも頻繁に行われるので、1 バイトで表現されます。
表 1 IMP 一覧
| 種別 | IMP |
|---|---|
| スタック操作 | [space] |
| 整数演算 | [tab][space] |
| ヒープアクセス | [tab][tab] |
| フロー制御 | [newline] |
| 入出力 | [tab][newline] |
パラメータは命令によってあったりなかったりします。 表 2 に Whitespace の命令一覧を示します。
表 2 Whitespace 命令セット
| IMP | コマンド | パラメータ | 意味 |
|---|---|---|---|
| [space] | [space] | 数値*1 | 数値をスタックにプッシュ |
| [space] | [newline][space] | - | スタックトップを複製 |
| [space] | [newline][tab] | - | スタックの1番目と2番目を交換 |
| [space] | [newline][newline] | - | スタックトップを破棄 |
| [tab][space] | [space][space] | - | スタックの上から二つを足し算 |
| [tab][space] | [space][tab] | - | スタックの上から二つで引き算 |
| [tab][space] | [space][newline] | - | スタックの上から二つでかけ算 |
| [tab][space] | [tab][space] | - | スタックの上から二つで割り算 |
| [tab][space] | [tab][tab] | - | スタックの上から二つで剰余 |
| [tab][tab] | [space] | - | 値をアドレスに格納 |
| [tab][tab] | [tab] | - | アドレスから値をスタックに |
| [newline] | [space][space] | ラベル*2 | ラベル定義 |
| [newline] | [space][tab] | ラベル | サブルーチン呼び出し |
| [newline] | [space][newline] | ラベル | 無条件ジャンプ |
| [newline] | [tab][space] | ラベル | スタックトップがゼロならジャンプ |
| [newline] | [tab][tab] | ラベル | スタックトップが負ならジャンプ |
| [newline] | [tab][newline] | - | サブルーチン終了 |
| [newline] | [newline][newline] | - | プログラム終了 |
| [tab][newline] | [space][space] | - | スタックトップの文字を出力 |
| [tab][newline] | [space][tab] | - | スタックトップの数値を出力 |
| [tab][newline] | [tab][space] | - | 文字を読み込みアドレスに格納 |
| [tab][newline] | [tab][newline] | - | 数値を読み込みアドレスに格納 |
入出力 ([tab][newline])
図 2 はスペースを S、タブを T と置き換えた Hello World です。 これをさらにわかりやすい命令に逆アセンブルしたものを図 3 に示します。
図 2 置換を行った Hello World
SSSTSSTSSS T SSSSSTTSSTST T SSSSSTTSTTSS T SSSSSTTSTTSS T SSSSSTTSTTTT T SSSSSTSSSSS T SSSSSTSTSTTT T SSSSSTTSTTTT T SSSSSTTTSSTS T SSSSSTTSTTSS T SSSSSTTSSTSS T SSSSSSSSTSTS T SS
図 3 逆アセンブルした Hello World
PUSH "H" PUTCHAR PUSH "e" PUTCHAR PUSH "l" PUTCHAR PUSH "l" PUTCHAR PUSH "o" PUTCHAR PUSH " " PUTCHAR PUSH "W" PUTCHAR PUSH "o" PUTCHAR PUSH "r" PUTCHAR PUSH "l" PUTCHAR PUSH "d" PUTCHAR PUSH "\n" PUTCHAR FINISH
著者について
まつもとゆきひろは自他ともに認める日本を代表する言語オタクです。
言語好きが昂じて自分の言語を設計してしまった大馬鹿者です。
が、オタクとかハッカーとか呼ばれる人種はみんな多かれ少なかれそんなものじゃないでしょうか。
バックナンバー
- Rubyist のための他言語探訪 【第 1 回】 Python
- Rubyist のための他言語探訪 【第 2 回】 CLU
- Rubyist のための他言語探訪 【第 3 回】 Io
- Rubyist のための他言語探訪 【第 4 回】 Tcl
- Rubyist のための他言語探訪 【第 5 回】 Groovy
- Rubyist のための他言語探訪 【第 6 回】 Dylan
- Rubyist のための他言語探訪 【第 7 回】 Icon
- Rubyist のための他言語探訪 【第 8 回】 Forth
- Rubyist のための他言語探訪 【第 9 回】 日本語プログラミング言語「なでしこ」
- Rubyist のための他言語探訪 【第 10 回】 Erlang
- Rubyist のための他言語探訪 【第 11 回】 C++
- Rubyist のための他言語探訪 【第 12 回】 APL と J
- Rubyist のための他言語探訪 【第 13 回】 Prolog
- Rubyist のための他言語探訪 【第 14 回】 Whitespace


References:[Rubyist Magazine 0022 号] [0022 号 巻頭言] [各号目次]