難解プログラミング言語を整える
中級Whitespaceを整える。
= スペース・タブ・改行の3文字だけで書く「見えない言語」を、見える形にして実行する
Whitespace が初めての方は、先に そもそも Whitespace とは・何の役に立つのか をどうぞ。
① コードを入れる(見えない文字はS/T/L表示に切り替えて確認)
実際のスペース/タブ/改行を貼り付けても、S/T/Lの文字(大文字小文字どちらも可)を貼り付けても、どちらも読み取ります。
入力命令(readchar / readnum)は上の「標準入力」欄の文字列を読みます。欄が空のまま実行すると「入力が足りません」のエラーで止まります。 無限ループになっても、必ず一定の命令数で自動停止します。
実行結果
(まだ実行していません)
③ 命令の逆アセンブル
入力中のコードを、命令ごとに機能・色分けして表示します(最大300命令)。
| # | 命令 | 引数 | 意味 |
|---|
④ テキスト → Whitespace を生成する
1文字ずつ push して出力する、単純な構成のコードを作ります。
そもそも Whitespace とは
スペース・タブ・改行だけで書く、「見えないプログラム」。
Whitespace(ホワイトスペース)は、Edwin Brady と Chris Morris が2003年4月1日(エイプリルフール)に発表した言語です。使うのはスペース・タブ・改行の3種類だけ。ほかの文字はすべて無視されるので、ソースコードは一見すると白紙に見えます。
冗談として作られましたが、数を積み重ねて計算する仕組み(スタック)や記憶領域、ジャンプなどが一通りそろった、本格的な言語です。ふつうの言語では、空白は見た目を整えるだけで意味を持たないことが多いのに対し、Whitespace は空白こそが意味のすべてという点が違います。
何の役に立つのか
-
アセンブリ言語に近い仕組みの入門になる
命令は「積む」「足す」「ジャンプ」など機械に近いものばかりで、低レベルな言語の考え方を学べます。
-
空白の落とし穴に気づける
タブとスペースの混在で起きるトラブルは、実務でも起こります。見えない文字の怖さを知る良い例です。
-
情報を隠す技法の発想に触れられる
文章の空白に別の情報を紛れ込ませる技法が実際にあり、その発想と通じます。
-
逆アセンブラやパーサーを作る練習になる
見えない文字の並びを読み解いて命令に直す作業は、プログラム解析の入門になります。
-
話のネタ・研修のアイスブレイクになる
「白紙に見えるのにプログラム」という話は、画面を見せるだけで盛り上がります。
普通の言語と比べると
- 英数字や記号は無視されるので、ふつうの文章の中にプログラムを紛れ込ませることもできます。
- 数値は、符号1桁と2進数の桁の並びで書きます。
- 見た目では中身が分からないため、このページのように、S・T・L の記号に置き換えて表示して確かめるのが定番です。
上の実行環境でサンプルを動かし、見えない文字をS・T・L表示に切り替えて、中身を確かめてみてください。
見えないところに意味がある・3つ
使える文字が3つだけ、という発想の面白さ。
- 1
命令はスペース・タブ・改行の組み合わせだけ
普通の言語は英数字や記号を使いますが、Whitespace は「見えない3文字」の並び方だけで スタック操作・算術・ヒープ・ジャンプ・出力のすべてを表現します。それ以外の文字(英数字や記号)は コメット扱いで完全に無視されるので、プログラムの中に好きな文章を"隠す"こともできます。
- 2
2003年、エイプリルフールに生まれた
Edwin Brady と Chris Morris が2003年4月1日に発表したジョーク言語ですが、スタックマシン・ ヒープ・サブルーチン呼び出し(call/ret)まで一通り揃った、れっきとした計算可能な言語です。 このツールの③(逆アセンブル)は、見た目には何も無いファイルの"中身"を暴いて見せています。
- 3
数値は2進数、文字は数値コードで出力する
push する数値は符号1桁+2進数の桁列という形で書きます。文字を出力する outchar は、 その数値を文字コードとして解釈して出力するだけなので、④の生成機能は「1文字ずつ push して outchar する」だけの単純な構成です。
送信ゼロ・入力は標準入力欄から
実行はすべてこの端末の中だけで完結します(送信ゼロ)。readchar / readnum (文字・数値を読み込む命令)は、①の「標準入力」欄に入れた文字列から読み取ります。入力が足りない状態で出会うとエラー停止します。 無限ループになるコードでも、一定の命令数に達すると必ず自動停止します。
このツールについて
Whitespace は「スペース・タブ・改行」の3文字だけで書く、2003年エイプリルフールに発表されたエソラングです。それ以外の文字はすべて無視される(コメット扱い)ため、見た目には何も書いていないファイルが、実は立派なプログラムということが起こります。入力はこの端末の中だけで処理されます(送信ゼロ)。
スペース・タブ・改行の3文字だけで書く言語 Whitespace を実行。見えない実コードと S/T/L 表示を切り替えでき、逆アセンブル表とテキスト→コード生成つき。
主な機能
- 実コード⇄S/T/L 表示の切り替え
- スタック・算術・ヒープ・フロー制御・出力を実行
- 命令ごとの逆アセンブル表(色分け)
- テキスト→Whitespace コード生成
- 無限ループでも必ずステップ上限で停止
- 入力命令は非対応・送信ゼロ
よくある質問
Q. Whitespace とは何ですか?
A. スペース・タブ・改行の3文字だけで書くプログラミング言語です。2003年4月1日に Edwin Brady と Chris Morris が発表しました。それ以外の文字はすべて無視されるため、見た目は空のファイルが実はプログラム、ということが起こります。
Q. なぜ実コードは何も見えないのですか?
A. 命令がスペース・タブ・改行だけで構成されているためです。「S/T/L 表示に切り替える」ボタンで、見えない3文字を S(スペース)・T(タブ)・L(改行)の記号に置き換えて確認できます。
Q. キーボードからの入力はできますか?
A. できます。実行の前に「標準入力」の欄へ文字を入れておくと、readchar はそこから1文字ずつ、readnum は改行までの整数を読みます。入力が足りないときは「入力なし」のエラーで停止します。
Q. 無限ループのコードを実行するとどうなりますか?
A. 一定の命令数(20万命令)に達すると自動的に停止し、エラーとして表示します。ブラウザが固まることはありません。
Q. 生成したコードは他の Whitespace 処理系でも動きますか?
A. 標準的な push(数値をスタックに積む)と outchar(文字として出力)だけで構成しているため、多くの処理系で動きます。入力命令などの対応状況は処理系によって差があります。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。