この世に存在する、奇妙なプログラミング言語がわかります。
みなさんこんにちは、syuyaです。
最近、ますます注目を集めている”プログラミング”。
プログラミングをする為には、それぞれの目的に合った『プログラミング言語』を選択し、その言語の”コード”を書く必要があります。
現在多くの環境で使用されているメジャーなプログラミング言語は10~20種類と言われていますが、マイナーな言語も含めるとその全数は200種類を超え、さらにその派生言語を含めると1000種類以上が存在すると言われています。
その目的に合わせて適したプログラミング言語が存在し、プログラマは目的に合わせてプログラミング言語を選択し、コードを書いていきます。
そんなプログラミング言語の中には、ほとんど全く使い道の無い言語や、果てはプログラマが”遊び”で作った”ネタ言語”まで、様々な言語が存在しています。
この記事では、そんなプログラミング言語の内でも特に奇妙な、または難解なプログラミング言語をご紹介しています。

プログラミング言語を学ぶなら、自宅で現役エンジニアから学べる TechAcademy [テックアカデミー]がおすすめ。
プログラミングを修得すれば、フリーランスエンジニアとして在宅で仕事をする事も可能です。
また、今後世界のIT化はさらに加速すると予想され、それに伴いプログラミングを出来る人間の需要はますます増えていくものと思われます。
自宅で好きな時間に仕事をこなし、ストレスから解放された毎日を過ごす――そんな働き方は、一部の人だけのものではありません。
実際に在宅ワークやフリーランスとして活躍する多くの人が、プログラミングスキルをゼロから学んでキャリアを変えてきました。
オンライン対応のプログラミングスクールなら、地方に住んでいても忙しくても、今すぐ学び始められます。
分からない所は現役エンジニアの先生がが懇切丁寧に指導してくれるので、全くの初心者でも安心してプログラミングを学ぶ事が出来ます。
詳細は下記のボタンをタップしてご覧ください。
- 1. Brainfuck・・・プログラミング言語のミニマリズムの極致
- 2. Whitespace・・・見えないけれど、確かにそこにある言語
- 3. LOLCODE・・・崩れた言葉で、意外とマジメに動くジョーク言語
- 4. Malbolge・・・悪意でできた、地獄のための言語
- 5. INTERCAL・・・プログラミング言語への皮肉と嘲笑をコード化した言語
- 6. Befunge・・・プログラムが迷路になった言語
- 7. Shakespeare・・・詩人のためのプログラミング言語
- 8. Piet・・・色で描くプログラム、命令が迷路になるアート言語
- 9. Chef・・・おいしそうなレシピの皮をかぶったプログラミングコード
- 10. FALSE・・・読めないことが美徳の、ミニマル設計の極地
- 11. GolfScript・・・可読性を切り捨てて短さに命を懸けた、沈黙の暗号詩
- 12. ArnoldC・・・ターミネーター専用コード
- 13. Cow・・・牛にしか理解できないコード
- まとめ
1. Brainfuck・・・プログラミング言語のミニマリズムの極致
+[----->+++<]>+.---.+++++++..+++.[--->+<]>-----.---[->++++<]>-.--------.+++.------.--------.-[--->+<]>.
Brainfuck(ブレインファック)は、1993年にスイス人プログラマーのアーバン・ミュラー(Urban Müller)によって考案された、極めてミニマルでありながらもTuring完全な難解プログラミング言語です。
その奇抜な名前は「脳を壊すほど難解な言語」という意味合いを含んでおり、実際に読み書きともに極端に困難で、プログラマーの精神力を試すような構造を持っています。
この言語の最大の特徴は、わずか8種類の記号のみで構成されているという点です。
記号は >
(ポインタを右に移動)、<
(左に移動)、+
(現在のセルの値をインクリメント)、-
(デクリメント)、.
(出力)、,
(入力)、[
(ループ開始)、]
(ループ終了)の8つだけで、文字や数字、変数名などは一切使用されません。
その結果、ソースコードはまるで意味不明な記号の羅列のようになり、視覚的にも論理的にも非常に読みづらいものになります。
Brainfuckの内部構造は、C言語などでおなじみの配列とポインタをベースとしています。
1次元のバイト配列(通常30000セル)が用意され、ポインタがその上を移動しながらセルの値を操作します。
ループ機構は中括弧のような[
と]
で表され、セルの値がゼロになるまで繰り返すといった単純な仕組みですが、複雑な条件処理や文字列出力を行うには高度な工夫が必要となります。
たとえば、たった一行の”Hello, World!”を出力するプログラムを書くためには、上記のように数百文字にも及ぶ+
や>
の羅列を書き、各文字のASCIIコードをひとつひとつ加算・出力する必要があります。
そのコードは人間にとってはほとんど暗号に等しく、ミスの修正も非常に骨が折れます。
にもかかわらず、この言語で書かれたプログラムはきちんと動作し、理論的には他の一般的な言語と同様にあらゆる処理を実現できるという点が、Brainfuckのユニークな魅力です。
このように、Brainfuckは実用性よりも実験性や美学、そしてユーモアを重視した言語です。
プログラミング教育の場で使われることはまずありませんが、コンピュータ科学や言語設計に興味のある人々にとっては、一度は触れてみたくなる“通過儀礼”的な存在でもあります。
一言で表すなら、「人間には優しくないが、理論的には完璧な言語」。
あるいは、「美しくも狂気に満ちた、プログラミングの禅問答」とでも言えるでしょう。
無駄を極限まで削ぎ落としたこの言語は、私たちに“言語とは何か”“最小限の表現でどこまで可能なのか”という問いを投げかけ続けているのです。
2. Whitespace・・・見えないけれど、確かにそこにある言語
⇥␣␣␣␣␣␣␣↵
⇥␣␣␣␣␣␣␣↵
⇥␣␣␣␣␣␣⇥↵
⇥␣␣␣␣␣␣␣↵
⇥␣␣␣␣␣␣␣↵
⇥␣␣␣␣␣␣␣↵
⇥␣␣␣␣␣␣⇥↵
⇥␣␣␣␣␣␣␣↵
⇥␣␣␣␣␣␣⇥↵
⇥␣␣␣␣␣␣⇥↵
⇥␣␣␣␣␣␣␣↵
⇥␣␣␣␣␣␣⇥↵
␣↵ //␣...スペースキー ⇥...タブキー ↵...エンターキーのボタン押下を示す 実際は全て空白となる
Whitespace(ホワイトスペース)は、2003年にイギリスのプログラマー、エドウィン・ブラディ(Edwin Brady)とクリス・モリス(Chris Morris)によって開発された、非常にユニークかつ風変わりな難解プログラミング言語です。
この言語の最大の特徴は、コードがすべて「不可視文字」で構成されているという点にあります。
通常のプログラミング言語では使われることのない「スペース」「タブ」「改行」の3つの空白文字だけを構文として使い、それ以外の文字はすべて無視される(=コメントとして扱われる)というルールを持っています。
この仕様によりWhitespaceで書かれたプログラムは、たとえソースコード内に大量の文字があっても、スペース・タブ・改行以外はすべて無視されるため、実質的に“何も書いていないように見える”という特異な性質を持ちます。
通常のテキストエディタ上ではどこに何が書かれているか判別が非常に困難であり、まるで“幽霊のようなコード”です。
見ることも編集することも極めて難しく、プログラマーにとっては一種の視覚的・精神的トレーニングのような存在です。
Whitespaceの命令体系は、意外にも整然としており、典型的なスタックベースの命令セットを採用しています。
値をスタックに積む「Push」、加算・減算・乗算などの「演算」、ジャンプや条件分岐などの「フロー制御」、さらには入出力も可能であり、Turing完全な言語として理論的にはあらゆる処理を行うことができます。
実際にはこれらの命令がすべてスペース・タブ・改行の組み合わせで定義されており、人間が読み解くには専用のインタプリタや可視化ツールが不可欠です。
この言語の面白い点は、既存の言語との共存も可能であるということです。
たとえば、C言語やPythonなどのソースコードの中にWhitespaceの命令を“隠して”書き込むことができ、見た目には通常のコードにしか見えないのに、Whitespaceとしては完全なプログラムになっている、という“ステガノグラフィ(情報の隠蔽)”的な使い方もできます。
まさに「見えないコード」であり、「気づかれないコード」であり、プログラミングにおける“存在と不可視の美学”を体現したような設計です。
実用性はほぼ皆無であるにもかかわらず、Whitespaceは難解言語ファンの間で非常に人気が高く、「スペースやタブにも意味を持たせられるのだ」というアイデアの面白さや、極端なルール設計の潔さ、そして“まったく見えないコードを書ける”というジョーク性の高さから、今でも語り草となっている言語です。
3. LOLCODE・・・崩れた言葉で、意外とマジメに動くジョーク言語
HAI 1.2
VISIBLE "Hello, World!"
KTHXBYE
LOLCODE(ロルコード)は2007年ごろにアメリカのプログラマー、アダム・リンジー(Adam Lindsay)によって設計された、インターネット・ミーム文化を取り入れたジョーク系プログラミング言語です。
名前のとおりLOLCODEは「LOLcats(ロルキャッツ)」という、猫の写真に崩れた英語のキャプションをつけて楽しむネットミーム文化をベースにしており、コード全体が「壊れた英語」や「インターネットスラング」で書かれるのが最大の特徴です。
この言語は、ある意味で自然言語とプログラミングの境界線をからかうような存在であり、読み書きするだけでニヤリと笑ってしまうような表現に満ちています。
たとえば、プログラムの冒頭は HAI
(Hi)で始まり、終了は KTHXBYE
(”OK thanks bye”)で終わります。
変数の宣言は I HAS A
(I have a…)、出力は VISIBLE
、代入は R
(are)、条件分岐は O RLY?
(Oh, really?)といった具合に、すべてがミーム的な英語で行われます。
たとえば、”Hello, World!
” を出力する最も基本的なLOLCODEのプログラムは上記の通りとなっています。
このたった3行のコードには、LOLCODEの魅力が凝縮されています。
「HAI」で始まり「VISIBLE」で表示し「KTHXBYE」で終了。
すべてがくだけた英語のようでありながら、ちゃんと命令として機能しているという言語としてのユーモアとフォーマットの美しさが同居しているのです。
LOLCODEは文法自体は簡単でとっつきやすく、また見た目にも楽しいため、教育やイベント、プレゼンテーションなどで「変わり種プログラミング言語」として紹介されることがあります。
ただし真面目な開発には向いておらず、複雑な処理には不向きです。
とはいえスタック操作やループ、条件分岐、関数風の記述も一応可能であり、「意外とちゃんと動く」一面もあります。
この言語の本質はプログラミング言語の堅苦しさをひっくり返し、ユーモアと遊び心を持ち込むことにあります。
開発者の技術的な知識や知性を、あえて崩れた表現で包み込むことで、逆説的に「コードを書くとは何か」「文法とは何か」を問いかけているようにも見えます。
4. Malbolge・・・悪意でできた、地獄のための言語
('&%:9]!~}|z2Vxwv-,POqponl$Hjig%DCBA@?>=<;:9876543wzYVUTSRQPONMLKJIHGFEDCBA@>
Malbolge(マルボルグ)は、1998年にイタリア出身のプログラマー、Ben Olmstead(ベン・オルムステッド)によって作られた、”世界で最も難解”と称されるプログラミング言語です。
コードの名前はダンテの『神曲』に登場する地獄の第8圏『Malebolge(邪悪の堀)』に由来しており、まさにその名のとおり書くのも読むのも苦痛に満ちた地獄のような言語です。
Malbolgeは難解言語として数多くある中でも、突出して”人間にとって書きづらい構造”を持っています。
実際、設計者であるベン・オルムスレッド自身も自分で最初の”Hello, World!プログラム”を書くことができず、最初の動作サンプルは探索アルゴリズム(遺伝的アルゴリズム)によって自動生成されたという逸話が残っています。
これは言語設計として非常に稀であり、ある種の狂気すら感じさせる逸話です。
Malbolgeの特徴はその暗号のような構文と実行時の自己変化にあります。
コードは8ビット文字の並びで構成されますが、その意味はプレーンな命令として実行されるのではなく、実行時に暗号化的な写像(crazy operation)を受けて変化しながら処理されます。
加えて自己変形型の実行モデルを持っており、1つの命令を実行するたびにその命令自身が書き換わるという設計になっています。
このため単純な繰り返しや条件分岐ですら、非常に高度な計算とトリックが必要です。
またメモリ構造も独特で、10進数ベースでしか動作せず、しかも制御の難しさを増すような設計になっています。
そのため”明示的にプログラムを書くことが困難”というよりも、”偶発的に動作するコードを発見する”というアプローチに近いものがあります。
これはまさしく、”プログラミング言語を書く”というよりも”暗号を解読する”という方が相応しいプロセスとなっています。
たとえば、Malbolgeにおける”Hello, World!”のコードは上記のような意味不明な文字列の集合体になります
この文字列は一見してプログラムとは到底思えず、むしろ意味不明なデータの羅列にしか見えません。
しかし上記のコードを正しいMalbolgeインタプリタに通せば、きちんと ”Hello, World!
” を出力するのです。
理解不能な外見とは裏腹に、確かにそこに動作のロジックが隠されているという、この逆説的な設計がMalbolge最大の魅力でもあり狂気でもあります。
Malbolgeは実用性など一切考慮されておらず、完全に「人間に優しくないこと」そのものを目的に設計された言語です。
ここまで来るともはやプログラミング言語というよりも、暗号・芸術・拷問・哲学の中間に位置するような存在です。
その存在理由は「難解さ」以外にはほとんど見当たらないにもかかわらず、今日でも難解言語愛好家たちの心をとらえ続けています。
5. INTERCAL・・・プログラミング言語への皮肉と嘲笑をコード化した言語
PLEASE DO ,1 <- #13
PLEASE DO ,1 SUB #1 <- #238
PLEASE DO ,1 SUB #2 <- #108
PLEASE DO ,1 SUB #3 <- #112
PLEASE DO ,1 SUB #4 <- #0
PLEASE DO ,1 SUB #5 <- #64
PLEASE DO ,1 SUB #6 <- #194
PLEASE DO ,1 SUB #7 <- #48
PLEASE DO ,1 SUB #8 <- #22
PLEASE DO ,1 SUB #9 <- #248
PLEASE DO ,1 SUB #10 <- #168
PLEASE DO ,1 SUB #11 <- #24
PLEASE DO ,1 SUB #12 <- #16
PLEASE DO ,1 SUB #13 <- #162
PLEASE READ OUT ,1
PLEASE GIVE UP
INTERCAL(インターカル)は、1972年にアメリカの大学生、Don Woods(ドン・ウッズ)とJames Lyon(ジェームズ・ライアン)によって開発された、「プログラミング言語の皮肉」としての元祖的存在とも言える難解言語です。
その名は “Compiler Language With No Pronounceable Acronym(発音可能な略称を持たないコンパイラ言語)” の略で、名前からしてすでに冗談めいています。
INTERCALの本質は当時のメジャーなプログラミング言語──たとえばFORTRANやCOBOL、ALGOLなど──の設計思想を徹底的に茶化すことにあります。
現実のプログラミング言語が持つ「読みやすさ」「論理性」「実用性」などの価値を、すべて真っ向から否定し、いかに“意味不明で非効率で使いづらい言語を作れるか”を極限まで追求した実験的言語なのです。
INTERCALの文法は驚くほど不自然で、読み手を混乱させることを目的としているかのようです。
たとえば、プログラムの中に「PLEASE」という単語を入れないとぶっきらぼうすぎるとしてコンパイルエラーになることがあり、逆に入れすぎても「丁寧すぎる」として拒否されるなど、人間の感情をコードに持ち込ませるような意味不明なルールが存在します。
また単純な代入やループ処理でさえ、他の言語での何倍もの行数と記号の混在を要求されます。
たとえば、INTERCALで”Hello, World!”を出力するプログラムは、上記のように十数行にわたって展開されるうえ、読みやすさのかけらもありません。
しかもそれぞれの行にはDO
, COME FROM
, IGNORE
, FORGET
, RESUME
など、どこかで聞いたことがあるようで機能としてはとても意味が取りづらい命令が並んでいます。
特に「COME FROM」は、GOTO
を皮肉るために逆方向のジャンプを作ったという、意図的に読みにくくするための逆設計です。
INTERCALはその性質上、実用性はまったくありません。
ですがそれを補って余りあるほどのユーモアと哲学があります。
設計者たちは当時の「過剰に厳格で神格化されたプログラミング言語設計」に対する痛烈な風刺としてこの言語を世に送り出しました。
以後INTERCALは単なるネタ言語にとどまらず、「プログラミング言語とは何か」を逆照射する鏡のような存在として語り継がれています。
その難読性や理不尽さは後に多くの「難解言語」に影響を与え、この記事で紹介しているBrainfuck、Malbolge、Whitespaceといった言語たちの精神的な始祖とも言える存在です。
INTERCALを理解しようとすること自体が、ある種のメタ言語的な思考を促し、「なぜプログラミング言語はこうあるべきなのか?」という問いを、笑いと困惑の中で私たちに投げかけてくるのです。
6. Befunge・・・プログラムが迷路になった言語
"!dlroW ,olleH">:#,_@
Befunge(べファンジ)は、1993年にカナダのプログラマー、クリス・プレセイ(Chris Pressey)によって作られた、極めてユニークかつ視覚的に風変わりな難解プログラミング言語です。
この言語の最大の特徴は、プログラムが2次元空間上に書かれるという点にあります。
一般的なプログラミング言語では、コードは上から下へ、または左から右へ直線的に実行されますが、Befungeでは命令ポインタ(IP)が2次元のグリッド上を移動しながら命令を読み取るという、完全に別次元の構造を持っています。
命令ポインタは、初期状態では右方向に進みますが、<
, >
, ^
, v
などの記号によって上下左右に自在に動きます。
@
がプログラムの終了を表し、それまでのすべての命令は、どの方向からでも実行できるよう設計されています。
これは一種の迷路のようでもあり、まさに“コードを書く”というよりも“コードをデザインする”ような感覚に近いものです。
例えば、上記のコードはBefungeによる最も簡潔な”Hello,World!”プログラムですが、同様のコードを別の書き方をすると以下のようになります。
> v ← スタート:右へ進み、角で下に曲がる
v ,,,,,"Hello"< ← 左向きで "Hello" を出力(`,` が文字出力)
>48*, v ← 下へ進み次の段へ(48* → 'H' の ASCII)
v,,,,,,"World!"< ← "World!" を出力
>25*,@ ← 最後に改行と終了処理(25* = ASCII 10)
まさしく迷路のようで、おもしろいですよね。
Befungeはスタックベースの言語であり、整数のスタックに値を積んだり演算を行ったり条件分岐をしたりといった処理は、すべてスタック操作を通じて実現されます。
数字はそのままスタックにプッシュされ、+
, -
, *
, /
, %
などの記号で四則演算が可能です。
出力は .
(数値出力)や ,
(文字出力)で行われますが、それらを視覚的に配置して、命令ポインタに“通らせる”ことが求められます。
”Hello, World!”のような単純な出力すら他の言語なら一行で済むところを、Befungeでは文字を逆順にスタックへ積んでから一文字ずつ出力するという複雑な構造をとるため、コードの見た目も内容もまるでパズルのようになります。
さらに?
命令によって進行方向がランダムになるなど、偶然性すら含んだ設計も可能であり、実用性よりも“芸術性”や“仕掛け”としての魅力が前面に出た言語だと言えるでしょう。
その自由度の高さゆえに、Befungeでは実行ルートを途中でループさせたり、分岐させたり、回転させたりといったことが可能で、文字通り“迷路のようなプログラム”を作ることができます。
またセル上の命令そのものを実行中に書き換えることすら可能なため、自己書き換え型プログラムも構築できます。
これは通常の言語では考えにくい設計であり、Befungeの最大の魅力でもあり混乱の元でもあります。
7. Shakespeare・・・詩人のためのプログラミング言語
The Infamous Hello World Program.
Romeo, a young man with remarkable patience.
Juliet, a likewise young woman of remarkable grace.
Act I: The Introduction.
Scene I: Gathering.
Romeo: Speak your mind.
Juliet: Listen to your heart.
Act II: The Conversation.
Scene I: Greeting.
Romeo: You are as lovely as the sum of yourself and a charming flower.
Juliet: Speak your mind.
Romeo: Speak your mind.
Shakespeare(シェイクスピア)は、2001年にヨン・オースルンド(Jon Åslund)とカール・ハッセルストローム(Karl Hasselström)によって開発された、英文学の古典「シェイクスピア劇」の形式でコードを書くという、極めて文学的な難解プログラミング言語です。
略称は”SPL(Shakespeare Programming Language)”。
この言語の発想はとてもユニークで、「プログラミングコードを劇の脚本のように書いたらどうなるか?」という遊び心に満ちています。
登場人物は変数に、セリフは代入や計算に、場面や幕の切り替えは制御フローに対応しており、プログラム全体がシェイクスピアの戯曲のように構成されます。
つまり登場人物のやり取りが、そのまま計算処理を担うという構造になっているのです。
たとえば、変数の宣言は登場人物の紹介という形で行われます。
Romeo, a young man with remarkable patience.
Juliet, a likewise young woman of remarkable grace.
このようにして登場人物を設定したのち、セリフを通じて値の操作や条件分岐、出力などを行います。たとえば、
Romeo: Speak your mind.
Juliet: You are as lovely as the sum of yourself and a charming flower.
というセリフのやり取りが、「Romeo の値を出力しなさい」や「Juliet に何らかの値を加算しなさい」といった命令に対応しています。
また、条件分岐は”Am I better than you?(私はあなたより優れているか?)”のような形で自然言語に近い比較文になっており、詩的なやりとりの裏で演算処理が進んでいるという構造です。
SPLには、データ型や構文的な自由さこそありませんが、語彙や表現の幅はかなり広く設計されています。
たとえば、数値を表現するためには”beautiful”や”ugly”などの形容詞に正負の意味が割り当てられており、演算子も”sum””difference””square of”などの英語の修辞で指定します。
しかも、文章の意味が重要というよりも、「特定の単語の分類(ポジティブ/ネガティブ)」や、文法構造が命令の意味を決定するため、見た目は流麗でも内容はまったく別の次元で動いているというズレが非常に面白いのです。
Shakespeareは当然ながら実用的ではありませんし、コードの学習効率も非常に悪いですが、文学とプログラミングという本来交わることのない2つの分野を強引に結びつけたという点で、極めて創造的な言語です。
読み手にとっては、コードを読むというよりも一幕の芝居を観ているような気分になり、プログラマーではなく“詩人”としてコードに向き合うことになります。
8. Piet・・・色で描くプログラム、命令が迷路になるアート言語
pietで書かれた”Hello,World!”
Eliran t, CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0, via Wikimedia Commons
Piet(ピート)は、2001年にイギリスのプログラマー、デイヴィッド・モーガン=マー(David Morgan-Mar)によって考案された、非常にユニークかつ視覚的な難解プログラミング言語です。
その最大の特徴は、コードがテキストではなく「画像」として書かれる点にあります。
つまりPietのプログラムとは文字列の並びではなく、色のついたドットやブロックが並んだ絵画のようなものであり、言語というよりも視覚アートに近い存在とも言えます。
この言語名”Piet”は、オランダの画家ピート・モンドリアン(Piet Mondrian)に由来しており、モンドリアンの抽象絵画のようにカラフルな長方形ブロックで構成されたプログラムコードを想起させます。
まさにその名のとおりPietではカラフルな領域の並びが意味を持ち、実際に処理されます。
見た目は芸術作品のようでありながら、れっきとしたプログラムなのです。
実際にPietのプログラムは、色の違いを使って命令を構成します。
使われるのは赤、黄、緑、シアン、青、マゼンタの6色相で、それぞれに明度が3段階(明るい、通常、暗い)あり、合計で18色が命令用として使われます。
さらに、黒(通行不能)と白(ノーオペレーション)という特殊な色が加わり、命令ポインタ(IP)はこのカラーパターンの中を進んでいきます。
命令は、「現在の色」から「次の色」への「色相の変化量」と「明度の変化量」の組み合わせによって決まります。
たとえば、色相が1段階変化して、明度が変わらなければ「スタックに値をプッシュ」、明度が1段階上がれば「加算」、色相が2段階変化して明度が1段階上がれば「文字出力(OutChar)」といった具合に、命令の種類が決まります。
この独特なルールのもとで、スタック操作や分岐、ループ処理、入出力などがすべて実現されます。
実際に「Hello, World!」を出力するためには、上記の画像のように各文字のASCIIコードをスタックに積んでいき、それをひとつずつ取り出して出力命令に渡すという流れになります。
そのためには、画面上に大量のカラーブロックを設計し、ポインタが正しいルートを通って命令を正しく解釈するように配置する必要があります。
Pietの設計は、まるでプログラムというよりも「迷路のようなパズル」に近く、構造が少しでも崩れると意図通りに動かなくなります。
だからこそ、成功したときの達成感は大きく、まるで色と図形を使って一枚のアート作品を完成させたような気分になれます。
また、Pietは命令ポインタが進む方向を「右・下・左・上」の順で変えることができるため、命令の流れは直線的ではありません。
あるブロックが障害物(黒)にぶつかれば、自動的に方向を変えたり、実行不能になったりします。
これによって、コードの流れは直感的には読みにくくなり、まるでアリが色の迷路を進んでいるかのような動きになります。
実用性の面ではほとんど意味をなさないが、Pietはそのビジュアル性と創造性、そしてルールの数学的な緻密さによって、多くの難解言語ファンに支持されています。
また、プログラミングと芸術、論理と感性の境界を曖昧にする存在として、アートとコンピュータの融合を体現する代表的な試みでもあります。
9. Chef・・・おいしそうなレシピの皮をかぶったプログラミングコード
Hello World Souffle.
Ingredients.
72 g haricot beans
101 g eggs
108 g oil
111 g sugar
32 g milk
87 g flour
114 g baking powder
100 g cocoa
33 g chocolate
Method.
Put haricot beans into mixing bowl.
Put eggs into mixing bowl.
Put oil into mixing bowl.
Put oil into mixing bowl.
Put sugar into mixing bowl.
Put milk into mixing bowl.
Put flour into mixing bowl.
Put oil into mixing bowl.
Put baking powder into mixing bowl.
Put cocoa into mixing bowl.
Put oil into mixing bowl.
Put chocolate into mixing bowl.
Pour contents of mixing bowl into the baking dish.
Serves 1.
Chef(シェフ)は、2002年にデイヴィッド・モーガン=マー(David Morgan-Mar)によって考案された、ユーモアと構文美に満ちた難解プログラミング言語です。
Chefの最大の特徴は、プログラム全体が料理のレシピの形式になっていることであり、コードというよりも“レシピ文書”として読めるように設計されている点にあります。
Chefでは変数のことを”材料(Ingredients)”と呼び、数値はそれぞれの材料の分量で表されます。
たとえば”27 g sugar”は、変数sugar
に27という整数を与える命令に相当します。
また、材料は”dry ingredients(乾いた材料)”や”liquid ingredients(液体)”などに分類されることで、処理に使う命令の文脈をより自然な文章に溶け込ませるようになっています。
命令は”Mix the ingredients”、”Fold into mixing bowl”、”Liquefy contents of bowl”など、まるで本物の料理本に書かれているような表現で記述されます。
実行の流れもユニークで、材料を混ぜたり、オーブンで焼いたり、皿に盛ったりする行為が、内部的には計算処理や出力、条件分岐といった典型的な命令に変換されていきます。
たとえば「Pour contents of the mixing bowl into the baking dish」はスタックの値を出力する命令に対応していたり、「Serve with garnish」はループの終了条件になっていたりします。
これらは形式的で抽象的なコードではなく、自然言語に近い調理手順で構成されているため、読者にとってはむしろコードであることを忘れてしまうほど滑らかに読めてしまいます。
出力は「皿に盛る」や「焼き上がりを見る」といった比喩的な表現で行われ、入力もまた食材の計量や選択という形で表現されることが多いです。
しかも、Chefでは単に命令を正しく書くだけでは不十分で、レシピとしても「美味しそう」に読めるかどうかが美徳とされています。
そのため、多くのChefプログラマーは、実際に料理レシピとしても通用するような文章を目指してコードを書くことになります。
これによって、Chefは「正しく動くコード」と「文学的な美しさ」を両立させた数少ない言語のひとつと言われています。
実際上記に描かれたコードは、Chefで書かれた”Hello, World!”のプログラムとなっています。
見た目こそ完全にレシピでありながら、内部的には「H, e, l, l, o, , W, o, r, l, d, !」という文字列を構成し、それを順に出力するよう設計されています。
読み手にとっては、まるで料理本を読んでいるかのような体験になるが、実際にはその裏で計算処理が行われているという、極めてメタ的な設計がなされています。
Chefは言語仕様の独特さだけでなく、「読者に美味しさを感じさせる」という美学を持ち込んだ点でも際立っています。
単なるジョーク言語にとどまらず、文学性・視覚性・言語構造の巧妙さを兼ね備えた、難解言語の中でもひときわ創造的な存在と言えます。
10. FALSE・・・読めないことが美徳の、ミニマル設計の極地
"Hello, World!"!
FALSE(フォルス)は1993年にヴァウター・ファン・オルトメルセン(Wouter van Oortmerssen)によって設計された、極端なまでに短く簡潔で難読なコードを生み出すことを目的としたスタックベースの難解プログラミング言語です。
言語名の”FALSE”は、単に真偽値の”偽(false)”ではなく、”Forth Like And Stupidly Encoded(Forthに似ていて馬鹿げたエンコード)”という意味を含んだ逆説的な命名であり、その設計思想自体がすでにユーモアと皮肉に満ちています。
この言語はわずか4キロバイトという驚異的な小ささのコンパイラサイズを目指して作られました。
事実FALSE のコンパイラはたったの1024バイトで実装されており、言語仕様そのものも意図的に複雑化され、人間には読みにくいが機械には処理しやすい構造となっています。
これは当時の流行であった“小さくて高速な言語こそ美徳”という価値観に対しての、一種の皮肉とも受け取れます。
FALSE はスタック指向であり、すべてのデータはスタック上に積まれて操作されます。
演算子や命令は1文字ずつで表され、変数も基本的には1文字の識別子しか使えません。
たとえば a
に値を代入するには 5a:
のように書き、文字列の出力は "Hello, World!"!
のような一文で完結する。
この極度に短い構文は、熟練者にとっては美しく見えるかもしれないが、普通のプログラマーにとっては難読極まりないものになる。
例えば、”変数aに10を代入し、それを表示する”といった極めて簡単な命令のコードでも、falseでは
10a:.a;
のように書かれます。
このコードの内容は、
10
→ スタックに10をプッシュ
a:
→ スタックの上(10)を a
に代入
.a;
→ a
を読み込み、出力する(;
はプログラム終了)
となっており、シンプルであるが所見ではまず分からないようなコードとなっています。
また、条件分岐やループ構造も存在するが、その構文は非常に抽象的かつ簡略化されています。
たとえば、[$%]
などのように、まるで意味不明な記号の集合体で制御構造が実現されます。
例を挙げると、”階乗を求める関数のコード”は
[$1=$[\%1\]?~[$1-f;!*]?]f:
のようになるなど、熟練のプログラマーでも理解不能な構造となってしまいます。
プログラムは基本的にスタック操作と関数の即時実行で構成され、括弧によって無名関数やクロージャを作ることもできます。
これは設計者が影響を受けた Forth や Scheme といった言語の構造を、さらに極端な方向へ押し進めた結果となっています。
FALSE の美学はまさに「読むことを拒絶する言語」としての美しさにあります。
コードは一見してただの記号の羅列にしか見えず、ドキュメントがなければ内容を理解するのはほぼ不可能です。
設計者のウィレム自身が「読みにくさこそがこの言語の特徴である」と明言しているように、FALSE はコードの可読性や保守性といった“普通の価値”に真っ向から逆らうことで、逆説的に言語という表現形式の本質に挑んでいるとも言えます。
もちろんこのような性質ゆえに実用性は皆無に等しく、教育や開発に使われることはまずありません。
しかし、FALSE はその奇抜な設計とあまりに突き抜けた極小主義によって、のちの多くの難解言語──たとえば Brainfuck や GolfScript──に大きな影響を与えました。
難解言語というジャンルにおいて、FALSE はまさに“原典のひとつ”と呼ぶにふさわしい存在であるといえます。
FALSE は、コードを極限まで圧縮し、可読性を捨て去ることで、逆に言語としての輪郭を浮き彫りにした、記号と論理の純粋な実験場となっています。
11. GolfScript・・・可読性を切り捨てて短さに命を懸けた、沈黙の暗号詩
"Hello, World!"
GolfScript(ゴルフスクリプト)は可能な限り短いコードで目的を達成することを最大の目的として設計された、極端にミニマルな構文を持つスタック指向のプログラミング言語です。
2007年にドミニク・ブルイアンによって開発され、その名のとおり「コードゴルフ」と呼ばれる、どれだけ少ない文字数で正しいプログラムを記述できるかを競う競技に特化しています。
通常のプログラミング言語が読みやすさや保守性、機能性を重視して設計されるのに対して、GolfScript はそのすべてを犠牲にしてでも、より短くより少ない記述で問題を解決するという一点に全てを注ぎ込んでいます。
文法は非常に柔軟かつ自由で空白や改行すら任意で使うことができ、数値や文字列、ブロック、配列といった構造をすべてそのままオブジェクトとして扱えます。
コードは基本的にスタックに値を積み、必要な操作を行っては値を出力するという流れで進行し、命令は1文字や短い記号列で構成されているため、熟練者でなければその意味を読み解くのが困難です。
しかしその分、たとえば通常の言語では数十文字を要するような処理が、GolfScript では数文字で書けてしまうという快感があります。
この言語では意味のある処理をどれだけ最小限に詰め込めるかがすべてであり、書いたプログラムが読めるかどうかは二の次です。
そのためGolfScript のコードはしばしば暗号のような外見を持ち、書いた本人ですら数日後には理解できなくなることもあります。
それでもなおコードの短さと芸術性を愛するプログラマたちは、この言語に挑戦することで自らの抽象化能力や問題解決の発想力を鍛え続けています。
たとえば、
”1から100までの数に対して3の倍数であれば Fizz、5の倍数であれば Buzz、両方の倍数なら FizzBuzz、それ以外は数値を出力する”
という典型的な『FizzBuzz 問題』も、GolfScript では次のようにたったの1行で書けます。
1..100{.3%!{'Fizz'}? .5%!{'Buzz'}? dup number?{n} if puts}%
このたった1行の中に、条件分岐、文字列出力、ループ、スタック操作のすべてが凝縮されており、初見では理解が困難ですが、慣れてくるとまるでパズルのような快感を得られる構成となっています。
同様の『FizzBuzz問題』のコードを、メジャー言語の一つであるpythonで書こうとすると、
for i in range(1, 101):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
のようになります。
GolfScriptがいかにコンパクトであるかがわかりますね。
GolfScript は、実用性を捨て去ったその極端な美学によって、コードゴルファーや難解言語愛好家たちに今も根強く支持されています。
プログラミングを単なる手段ではなく表現として突き詰めたいと考える人にとって、GolfScript は挑戦しがいのある芸術的な舞台となるでしょう。
12. ArnoldC・・・ターミネーター専用コード
IT'S SHOWTIME
TALK TO THE HAND "Hello, World!"
YOU HAVE BEEN TERMINATED
ArnoldC(アーノルドシー)はアーノルド・シュワルツェネッガーの映画の名セリフだけを使ってプログラムを書くことを目的とした、非常にユニークでジョーク的な難解言語です。
2014年にラウエル・バルセロナによって制作され、その構文はすべてシュワルツェネッガーの象徴的な台詞で構成されています。
たとえば”IT’S SHOWTIME”がプログラムの開始、”YOU HAVE BEEN TERMINATED”が終了命令という具合に、命令文がすべて映画のワンフレーズになっているという異様な特徴を持ちます。
この言語の魅力は機能そのものではなく、むしろその「バカバカしさ」と「シュールな構文の統一性」にあります。
通常のプログラミング言語が持つ if 文やループ、関数定義といった構造も、すべてシュワルツェネッガーのセリフで置き換えられているため、コードを読むとまるで B級アクション映画の脚本を読んでいるかのような錯覚に陥ります。
それでいて構文としては意外にも論理的に組まれており、真面目に書けばちゃんと実行可能なプログラムが構成されるという点が、この言語をただのネタで終わらせない奥深さにつながっています。
たとえば変数の宣言は”HEY CHRISTMAS TREE”、初期化は”YOU SET US UP”、加算は”GET UP”、出力は”TALK TO THE HAND”といった具合で、すべてシュワルツェネッガー本人の名場面をなぞるようにコードが書かれていきます。
そのため実行結果よりも、コード自体がすでに「演出」になっているという特殊な世界観が生まれています。
上記の”Hello,World!”プログラムで書かれた3行は、プログラムの開始、文字列の出力、プログラムの終了を意味しており、非常に簡潔かつネタ的な味わいに満ちています。
シュワルツェネッガーのファンであれば思わず笑ってしまうような命令ばかりであり、同時に文法的にも整っているという点が、この言語をただの冗談以上の存在に押し上げています。
ArnoldC はプログラミングを本質的に言語的・文化的な遊びとしてとらえ直すための、ある種の風刺であり、娯楽でもあります。
「コードは読まれるために書く」という常識を一旦忘れて、意味よりも音・記憶・感情を優先したコーディング体験を味わいたい人には、まさにうってつけの言語と言えるでしょう。
笑いながら書けて動作もちゃんとする。
そんな「ネタと実用の奇妙な融合」を体現した珍しい存在がArnoldC なのです。
13. Cow・・・牛にしか理解できないコード
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO MoO moO
OOO
Cow(カウ)は2003年にショーン・ハイスキーによって制作された、動物(特に牛)をテーマにしたジョーク系・難解系プログラミング言語です。
この言語の最大の特徴は、使われるキーワードがすべて”moo””MOO””moO”など、大文字と小文字のバリエーションを含む“mooっぽい音”だけで構成されているという点にあります。
人間が読むには極めて混乱しやすいですが、構文としては他の多くのプログラミング言語同様チューリング完全であり、理論的にはどんな計算でも可能です。
Cow は Brainfuck に触発されて作られた言語で、構造もそれに似たメモリセルベースの設計になっています。
ポインタの移動、データのインクリメント、出力、ループなど、基本的な命令セットがありながら、すべてが”moO”や”Moo”のような記号に置き換えられているため、コードはほとんど見分けのつかない“牛の鳴き声”の羅列になります。
この独自性と不便さ、そして遊び心が評価されネタ言語としては一定の人気を持っています。
たとえば、”Hello, World!”を出力するだけでも、上記のように数十行にわたる Moo
や moo
の羅列が並び、その正確な大文字小文字の判別が実行に直接影響を及ぼします。
つまり、可読性・保守性・実用性は一切考慮されておらず、完全に「バカバカしさ」と「混乱の美学」を楽しむための言語です。
Cow はその非合理さゆえに真面目な用途には一切向きませんが、ジョーク言語としての完成度や「言語とは何か?」という問いに対する一種の風刺的回答として、プログラミング文化の中で独自の存在感を放ち続けています。
まとめ
いかがだったでしょうか?
この記事では、実在する奇妙なプログラミング言語を13種類ご紹介しました。
決して訳には立たない言語ばかりですが、余裕があるなら学習してみるのも面白いかもしれませんね。
ここまでお読みいただきありがとうございました。
コメント