Whitespace
読み:ホワイトスペース
外語:Whitespace
全てを空白文字(スペース、タブ、改行)のみで記述する、非常に稀有な
プログラミング言語
。
目次
言語概要
由来
主張
解説
特徴
サンプルソース
チューリングコンプリート
言語仕様
IMP
スタック操作
演算
I/O
言語概要
枠組み ‐
手続き型
、スタック指向
初出日 ‐ 2003(平成15)年4月1日
設計者 ‐ (不明)
開発者 ‐ Durham University Computing Society
最新版 ‐ 0.3
言語影響関係
被影響 ‐
Brainfuck
加影響 ‐ (不明)
主要動作環境 ‐ UNIX
由来
主張
作者グループは、由来について次のように述べている。
最新の主要なプログラミング言語は、空白文字(スペース、タブ、改行)構文を考慮せず、まるで文字が無いかのように、それらを無視している。我々は、
文字集合
内で非常に友好的なメンバーであるはずのこれら空白文字に対する、甚だしい不公平だと考えている。
それらが無視されねばならないのは、それらが見えないからだろうか。Whitespaceは、均衡を取り戻そうとする言語である。あらゆる非空白文字は無視され、スペース、タブ、および改行のみが認識される構文となる。
解説
空白文字を無視する
プログラミング言語
ばかりの現状は、不公平である、という主張である。
これはどういう意味かと言うと、例えば
C
、
C++
、
Java
といった最近の言語の場合、ソースの見易さを考慮し、
インデント
を入れることで可視性を向上させている。これはつまり、インデントに何文字の空白を入れても、言語上なんらの変化も無いということを意味している。
そこで、この不公平を是正するには、立場を逆転した言語が必要であり、それがこのWhitespace、ということになる。
Whitespaceでは、空白文字以外は何を書いても全て「コメント」の扱いとして無視される。
特徴
サンプルソース
公式サイトには、お約束ともいえる
hello, world
を表示するサンプルソース「
hworld.ws
」が掲載されている。
頭に「Say hello.」とあるが、これはコメントであり、動作には無関係である。それ以降は全て空白文字で記述されているため、ただ背景が広がって見えるのみである。
しかし恐るべきことに、これは間違いなくソースリストなのであり、実際に動作する。
$ ./wspace hworld.ws
Hello, world of spaces!
Done.
Stack size 0
Heap size 24
$
知らない人がソースリストを見ても、プログラムであること自体分からないという、他に類例のないプログラミング言語である。
このソースを見たり、書いたりするためには、スペースやタブを、色を変える等して表示する機能を有したエディターが必要である。
チューリングコンプリート
これは2003(平成15)年4月1日という
エイプリルフール
に公開された。このため
Slashdot
のネタにされ、
アレゲ
な連中が大挙して押し寄せ40万以上のヒットになった、としている。
作者たちは、「Is this an April Fool's Joke?」(これはエイプリルフールのジョークか)という問いに対しては、明確に「ノー」と回答している。理由は、
コンパイラー
は動作し、サンプルも動作し、そして本当に、利用者はプログラムを書くことが出来るからだ、としている。
この言語の実用性自体は皆無である(作者ら自体、これを日常的なプログラミング言語としては使っていないだろう)が、これでも
チューリングコンプリート
な言語であり、理論上は他の一般的なプログラミング言語と同等の能力を持っている。
言語仕様
命令は、「IMP(命令変更パラメーター)」「コマンド」「
パラメーター
」を組にして記述される。
様々な機能があるが、演算については値を
スタック
に積み、それに対して演算命令を発行するスタイルを採用している。
IMP
IMPには、次のものがある。
[Space] スタック操作
[Tab][Space] 演算
[Tab][Tab] ヒープアクセス
[LF] フロー制御
[Tab][LF] I/O
IMPごとに、続くコマンドは異なるものが使われる。
多くのコマンドで、パラメーターに数値かラベルが必要となる。
数値は二進数で表現され、[Space]で0、[Tab]で1を表わし、[LF]によって終端される。なお数値は常に符号付きであり、正の数は[Space]、負の数は[Tab]から始まる。形式は
1の補数
であることに注意。
ラベルは、[LF]で終端される、[Space]と[Tab]からなる文字列である。なお、名前空間は一つしかないので、ラベルはそれぞれがユニークでなければならない。
スタック操作
スタック操作は最も基本的な操作のため、IMPも[Space]一つと短くなっている。
[Space] 数値 ‐ <数値>をスタックに積む
[LF][Space] ‐ スタックの一番上を複製する
[Tab][Space] 数値 ‐ スタックの<数値>番目を複写し、一番上に積む
[LF][Tab] ‐ スタックの一番上と二番目を交換する
[LF][LF] ‐ スタックの一番上の内容を捨てる
[Tab][LF] 数値 ‐ スタックの一番上は維持したまま、スタックを<数値>項目スライドする
演算
演算コマンドは、スタックの上位二つを対象に実行され、結果に置き換えられる。最初に積まれた側が、
演算子
の左となる。
[Space][Space] ‐ 加算
[Space][Tab] ‐ 減算
[Space][LF] ‐ 乗算
[Tab][Space] ‐ 整数除算
[Tab][Tab] ‐
剰余
拡張の余裕は、[Tab][LF]と、[LF]から始まるものである。
I/O
処理系は、外部との交信が出来なければならない。そこで、数や文字を読み書きするためのI/O命令がある。これらを用いれば、文字列処理ルーチンを書くことが可能である。
[Space][Space] ‐スタックの一番上を文字として出力する
[Space][Tab] ‐ スタックの一番上を数値として出力する
[Tab][Space] ‐ 一文字を読み、それをスタックの一番上に積む
[Tab][Tab] ‐ 一つの数値を読み、それをスタックの一番上に積む
拡張の余裕は、[LF]で終わるものと、[LF]から始まるものである。
再検索