本文へスキップ
totonoe.tech

難解プログラミング言語を整える

中級

Whitespaceを整える。

= スペース・タブ・改行の3文字だけで書く「見えない言語」を、見える形にして実行する

Whitespace が初めての方は、先に そもそも Whitespace とは・何の役に立つのか をどうぞ。

① コードを入れる(見えない文字はS/T/L表示に切り替えて確認)

実際のスペース/タブ/改行を貼り付けても、S/T/Lの文字(大文字小文字どちらも可)を貼り付けても、どちらも読み取ります。

Whitespaceコード 実行するまで送信ゼロ
0 命令(解析後)

入力命令(readchar / readnum)は上の「標準入力」欄の文字列を読みます。欄が空のまま実行すると「入力が足りません」のエラーで止まります。 無限ループになっても、必ず一定の命令数で自動停止します。

実行結果

出力
(まだ実行していません)

③ 命令の逆アセンブル

入力中のコードを、命令ごとに機能・色分けして表示します(最大300命令)。

# 命令 引数 意味

④ テキスト → Whitespace を生成する

1文字ずつ push して出力する、単純な構成のコードを作ります。

出力させたい文字列 入力するそばから生成
S/T/L表示(見た目確認用)
 
実コード(見えない文字。コピーして使えます)

そもそも Whitespace とは

スペース・タブ・改行だけで書く、「見えないプログラム」。

Whitespace(ホワイトスペース)は、Edwin Brady と Chris Morris が2003年4月1日(エイプリルフール)に発表した言語です。使うのはスペース・タブ・改行の3種類だけ。ほかの文字はすべて無視されるので、ソースコードは一見すると白紙に見えます。

冗談として作られましたが、数を積み重ねて計算する仕組み(スタック)や記憶領域、ジャンプなどが一通りそろった、本格的な言語です。ふつうの言語では、空白は見た目を整えるだけで意味を持たないことが多いのに対し、Whitespace は空白こそが意味のすべてという点が違います。

何の役に立つのか

  • アセンブリ言語に近い仕組みの入門になる

    命令は「積む」「足す」「ジャンプ」など機械に近いものばかりで、低レベルな言語の考え方を学べます。

  • 空白の落とし穴に気づける

    タブとスペースの混在で起きるトラブルは、実務でも起こります。見えない文字の怖さを知る良い例です。

  • 情報を隠す技法の発想に触れられる

    文章の空白に別の情報を紛れ込ませる技法が実際にあり、その発想と通じます。

  • 逆アセンブラやパーサーを作る練習になる

    見えない文字の並びを読み解いて命令に直す作業は、プログラム解析の入門になります。

  • 話のネタ・研修のアイスブレイクになる

    「白紙に見えるのにプログラム」という話は、画面を見せるだけで盛り上がります。

普通の言語と比べると

  • 英数字や記号は無視されるので、ふつうの文章の中にプログラムを紛れ込ませることもできます。
  • 数値は、符号1桁と2進数の桁の並びで書きます。
  • 見た目では中身が分からないため、このページのように、S・T・L の記号に置き換えて表示して確かめるのが定番です。

上の実行環境でサンプルを動かし、見えない文字をS・T・L表示に切り替えて、中身を確かめてみてください。

見えないところに意味がある・3つ

使える文字が3つだけ、という発想の面白さ。

  1. 1

    命令はスペース・タブ・改行の組み合わせだけ

    普通の言語は英数字や記号を使いますが、Whitespace は「見えない3文字」の並び方だけで スタック操作・算術・ヒープ・ジャンプ・出力のすべてを表現します。それ以外の文字(英数字や記号)は コメット扱いで完全に無視されるので、プログラムの中に好きな文章を"隠す"こともできます。

  2. 2

    2003年、エイプリルフールに生まれた

    Edwin Brady と Chris Morris が2003年4月1日に発表したジョーク言語ですが、スタックマシン・ ヒープ・サブルーチン呼び出し(call/ret)まで一通り揃った、れっきとした計算可能な言語です。 このツールの③(逆アセンブル)は、見た目には何も無いファイルの"中身"を暴いて見せています。

  3. 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の「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。

続けて整える

運営サイト

私たちが運営するサイト