
プログラミング言語は、人間が読み書きしやすいように進化してきました。……が、世の中にはその真逆を突き進む言語たちが存在します。
その名も 難解プログラミング言語(Esoteric Programming Language、通称 esolang)。
実用性はほぼゼロ。いや、完全にゼロです(キッパリ)
でも「言語処理系ってこういう仕組みなんだ」「結局、ループと条件分岐さえあれば何でも書けるんだな」という学びが詰まった、エンジニアのオモチャです。
今回はそんな esolang たちで、定番の Hello, World! ならぬ 「Hello, KENTEM!」 を出力するプログラムを書いてみました。
※掲載しているコードはすべてインタプリタで実際に動作確認済みです。
- エントリーNo.1:Whitespace — 「見えない」プログラム
- エントリーNo.2:Brainfuck — 命令はたったの 8 個
- エントリーNo.3:Piet — 抽象絵画がそのままプログラム
- エントリーNo.4:Pikalang — ピカチュウのための言語
- ラスボス:Malbolge — 人類には早すぎた言語
- まとめ
- おわりに
エントリーNo.1:Whitespace — 「見えない」プログラム
最初にして本命。Whitespace は 2003 年 4 月 1 日に Slashdot に掲載され、多くの人にエイプリルフールのジョークだと思われた(が、本物だった)言語です。使える文字はたったの 3 種類。
- 公式リファレンス:Whitespace - Esolang
- Wikipedia(英語)
| 文字 | 表記 |
|---|---|
| 半角スペース | [Space] |
| タブ | [Tab] |
| 改行 | [LF] |
つまり、ソースコードが目に見えません。エディタで開くと真っ白。
それ以外の文字(アルファベットや記号)はすべてコメントとして無視されます。
なので「ただの日記の中にプログラムを隠す」という、コナン真っ青のトリックじみたこともできます。
仕組み
Whitespace はスタックマシンです。命令は文字の並びで表現されます。
今回使うのはこの 3 つだけ。
- 数値の Push:
[Space][Space]+ 符号([Space]= 正) + 2進数([Space]= 0,[Tab]= 1) +[LF] - 文字出力:
[Tab][LF][Space][Space](スタックの先頭を文字コードとして出力) - プログラム終了:
[LF][LF][LF]
たとえば H(文字コード 72 = 2進数で 1001000)を出力するには:
[Space][Space][Space][Tab][Space][Space][Tab][Space][Space][Space][LF] ← 72 を Push [Tab][LF][Space][Space] ← 文字として出力
はい、意味わからんですね。でも無視して続けます。
Hello, KENTEM! 全文
これを 14 文字分繰り返すと完成です。まずは原文をそのままどうぞ。
|д・)ジー
・・・何も見えないですね?
でもこの中には 210 文字のスペース・タブ・改行がぎっしり詰まっていて、コピーしてWhitespaceインタプリタに貼れば本当に動きます。
全選択(Ctrl+A)すると存在だけは確認できます。
※コードブロックで書くとスペースとかだけなので、全部消してくれちゃうのでタグで無理やり書いてます・・・
とはいえこれでは解説のしようがないので、以降は可視化表記でいきます。
[Space][Space][Space][Tab][Space][Space][Tab][Space][Space][Space][LF] Push 72 ('H')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Tab][Space][Space][Tab][Space][Tab][LF] Push 101 ('e')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Tab][Space][Tab][Tab][Space][Space][LF] Push 108 ('l')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Tab][Space][Tab][Tab][Space][Space][LF] Push 108 ('l')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Tab][Space][Tab][Tab][Tab][Tab][LF] Push 111 ('o')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Space][Tab][Tab][Space][Space][LF] Push 44 (',')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Space][Space][Space][Space][Space][LF] Push 32 (' ')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Space][Space][Tab][Space][Tab][Tab][LF] Push 75 ('K')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Space][Space][Space][Tab][Space][Tab][LF] Push 69 ('E')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Space][Space][Tab][Tab][Tab][Space][LF] Push 78 ('N')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Space][Tab][Space][Tab][Space][Space][LF] Push 84 ('T')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Space][Space][Space][Tab][Space][Tab][LF] Push 69 ('E')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Space][Space][Tab][Tab][Space][Tab][LF] Push 77 ('M')
[Tab][LF][Space][Space] 出力
[Space][Space][Space][Tab][Space][Space][Space][Space][Tab][LF] Push 33 ('!')
[Tab][LF][Space][Space] 出力
[LF][LF][LF] プログラム終了
わずか 210 文字(ただし全部空白)。
ちなみに Git で管理すると diff が完全に無の状態で表示されます。素敵です。
エントリーNo.2:Brainfuck — 命令はたったの 8 個
esolang 界のレジェンド。1993 年に Urban Müller が「コンパイラを極限まで小さくできる言語」として設計しました。
命令は + - > < [ ] . , の 8 個だけで、巨大なバイト配列(テープ)とポインタを操作します。
- 公式サイト:brainfuck.org
- Wikipedia (英語)
| 命令 | 意味 |
|---|---|
+ / - |
現在のセルを +1 / -1 |
> / < |
ポインタを右 / 左へ |
[ / ] |
セルが 0 ならループ脱出 / 0 でなければループ先頭へ |
. |
現在のセルを文字として出力 |
, |
1 文字入力 |
Hello, KENTEM!
[-]>++++++++[<+++++++++>-]<.[-]>++++++++++[<++++++++++>-]<+.+++++++..+++.[-]>++++[<+++++++++++>-]<.[-]>++++[<++++++++>-]<.[-]>+++++[<+++++++++++++++>-]<.------.+++++++++.++++++.[-]>++++++[<+++++++++++>-]<+++.++++++++.[-]>++++[<++++++++>-]<+.
ポイントは 掛け算ループ です。H(72)を出力したいとき、+ を 72 回書く代わりに:
>++++++++[<+++++++++>-]<.
「隣のセルに 8 を置き、ループで 9 を 8 回加算(8 × 9 = 72)して出力」とします。e(101)→ l(108)のように文字コードが近いときは +++++++ と差分だけ足し算するのがセオリーです。
何にも実用性ないけど書いてみると意外とクセになります。
エントリーNo.3:Piet — 抽象絵画がそのままプログラム
Piet(David Morgan-Mar 作)は、ソースコードが画像の言語です。テキストは 1 文字もありません。
- 公式ページ:DM's Esoteric Programming Languages - Piet
- リファレンス:Piet - Esolang
仕組みはこうです。
- 使える色は 6 色相 × 3 明度の 18 色(+白・黒)
- 実行ポインタが色のブロックからブロックへ移動するとき、色相と明度が「どれだけ変化したか」が命令になる(例:明度が 1 段暗くなる = Push)
- Push される数値は、直前にいた色ブロックの面積(マス数)
つまり「何を描くか」ではなく「隣り合う色の差」がすべて。絵としての見た目は完全に自由です。
Hello, KENTEM!

この絵の中では、実行ポインタが左上から右へ進み、行末で下に折り返して蛇行しながら、色の変化で「Push → Push → 掛け算 → 出力」を 14 文字分繰り返しています。
たとえば冒頭の幅 8 のブロックと幅 9 のブロックは「8 × 9 = 72 = H」の計算です。右下の L 字ブロックは終端で、四方を黒に囲まれた袋小路に実行ポインタを閉じ込めて停止させています。
黒は通行止め、白は素通り、そして画像を 1 ピクセルでも塗り間違えると別のプログラムになる、正直意味が分からない言語です・・・。
エントリーNo.4:Pikalang — ピカチュウのための言語
Pikalang は Blake Grotewold が作ったジョーク言語で、プログラムを構成する単語はすべてピカチュウの鳴き声です。
- リファレンス:Pikalang - Esolang
語彙は pi ka pika chu pipi pichu pikapi pikachu の 8 語。
勘のいい方はお気づきでしょう、8 語ということは……そう、エントリーNo.2 の Brainfuck と 1 対 1 対応しています。Pikalang は「Brainfuck の記号を別の単語に置き換えただけの言語」です。
他にもいっぱい Brainfuck 派生の言語はあり、仕組みも簡単なので新しく作ることもできます!
| Pikalang | Brainfuck | 意味 |
|---|---|---|
pipi / pichu |
> / < |
ポインタを右 / 左へ |
pi / ka |
+ / - |
現在のセルを +1 / -1 |
pika / chu |
[ / ] |
ループ開始 / 終了 |
pikachu / pikapi |
. / , |
文字出力 / 入力 |
Hello, KENTEM!
先ほどの Brainfuck プログラムを機械的に翻訳すれば完成です。
pika ka chu pipi pi pi pi pi pi pi pi pi pika pichu pi pi pi pi pi pi pi pi pi pipi ka chu pichu pikachu pika ka chu pipi pi pi pi pi pi pi pi pi pi pi pika pichu pi pi pi pi pi pi pi pi pi pi pipi ka chu pichu pi pikachu pi pi pi pi pi pi pi pikachu pikachu pi pi pi pikachu pika ka chu pipi pi pi pi pi pika pichu pi pi pi pi pi pi pi pi pi pi pi pipi ka chu pichu pikachu pika ka chu pipi pi pi pi pi pika pichu pi pi pi pi pi pi pi pi pipi ka chu pichu pikachu pika ka chu pipi pi pi pi pi pi pika pichu pi pi pi pi pi pi pi pi pi pi pi pi pi pi pi pipi ka chu pichu pikachu ka ka ka ka ka ka pikachu pi pi pi pi pi pi pi pi pi pikachu pi pi pi pi pi pi pikachu pika ka chu pipi pi pi pi pi pi pi pika pichu pi pi pi pi pi pi pi pi pi pi pi pipi ka chu pichu pi pi pi pikachu pi pi pi pi pi pi pi pi pikachu pika ka chu pipi pi pi pi pi pika pichu pi pi pi pi pi pi pi pi pipi ka chu pichu pi pikachu
全 241 命令。10 万ボルトの代わりに「Hello, KENTEM!」を撃ってくれます。
ポケモン好きには是非オススメしたい言語です(嘘)
ラスボス:Malbolge — 人類には早すぎた言語
真打ち登場です。
Malbolge はダンテ『神曲』の地獄の名を冠した、「プログラミングを可能な限り困難にする」ことだけを目的に設計されたイカれた言語です(誉め言葉)。
実行のたびにコードが自分自身を暗号化して書き換わり、同じ文字でもメモリ上の位置によって命令の意味が変わります。
あまりに難解で、最初の Hello World は人間ではなく探索プログラムが約 2 年がかりで生成したという逸話つき。
作者自身、一度も Malbolge プログラムを書いたことがないそうです。
- リファレンス:Malbolge - Esolang / Wikipedia (英語)
Hello, KENTEM!
白状すると、人力では作ってません。Claudeに作ってもらいました。
正直人間には手で書くのは無理だと思います・・・。
('B;:^>=}5Y32VU5.-Qr*)M'&J$#G!~}C{z@xw={]yr8vonm3qS0{mlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(E~%$#@R~`_{zyKJvoWVr~So/@l+=ihK9edcba~_1]\>-wXWc
172 文字、もはや呪文です。こんなんでもインタプリタで実行し、Hello, KENTEM! が出力されることを確認済み。
1 文字違うだけで起動すらしない言語なので、動くこと自体が奇跡です。
まとめ
| 言語 | 難解ポイント | コード量 |
|---|---|---|
| Whitespace | ソースが見えない | 210 文字(全部空白) |
| Brainfuck | 命令 8 個・脳内アセンブリ | 241 文字 |
| Piet | ソースコードが絵画 | 36 × 26 マス |
| Pikalang | 語彙が全部ピカチュウの鳴き声 | 約 900 文字 |
| Malbolge | 自己暗号化・位置依存命令 | 172 文字 |
ふざけた言語たちに見えますが、書いてみると スタックマシン、文字コード、ループ最適化、命令セット設計 といった低レイヤの知識が勉強できます。
普段お使いの高級言語が「どれだけ人間に優しいか」を実感できるので一度触ってみるのをオススメします!
ありがたみが感じられることでしょう・・・(しみじみ)
各言語はオンラインのインタプリタ(TIO: Try It Online など)で手軽に試せます。
ぜひ、お好きな言語であなたの「Hello, 〇〇!」を書いてみてください!
おわりに
KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp