難解プログラミング言語:理解困難さを追求したプログラミングの世界
難解
プログラミング言語とは、その名の通り、意図的に理解しにくい設計がなされた
プログラミング言語です。
英語ではEsoteric programming language、略してesolangと呼ばれ、実用性よりもユーモアやプログラミングにおける創造性を追求した、一種の
プログラミング言語の
ジョークと言えるでしょう。特に、
ハッカー文化においては、このような言語の作成は一種のたしなみとして認識されています。
歴史:INTERCALからBrainfuck、そしてその先へ
難解
COBOL、
アセンブリ言語など'>[プログラミング言語]]の歴史は古く、INTERCALは初期から現在まで続く代表的な言語の一つです。1972年、ドン・ウッズとジェイムズ・リオンによって、既存の
プログラミング言語]とは全く異なる言語を目指して設計されました。当初は論文でのみ紹介されていましたが、1990年代に[[Unix上で
C言語で実装されると、再び注目を集め、難解
プログラミング言語ブームのきっかけとなりました。
INTERCALに続く重要な言語として、1993年にWouter van Oortmerssenが開発したFALSEがあります。コンパクトなスタック型言語で、理解を困難にするような構文が特徴です。わずか1024バイトの
コンパイラが作成されたという点も注目に値します。FALSEに触発されたUrban Müllerは、さらにコンパクトで有名な
Brainfuckを開発しました。
Brainfuckは、たった8種類の文字のみでプログラムが記述できるという極めてシンプルな言語でありながら、
チューリング完全であることから知られています。つまり、理論的にはどんな計算でも実行できるものの、実際は非常に理解しづらいという特徴を持ちます。
Brainfuckは、チューリング機械の一種であるP′′言語と深い関係があります。
Brainfuckと、同様に二次元配列で動作するBefungeは、現在でも最も広く知られ、利用されている難解
プログラミング言語です。これらの言語は、
プログラミング言語の分かりにくさという側面を極端に突き詰めた例と言えるでしょう。
難解
プログラミング言語を理解する上で重要な用語として「
チューリング完全」があります。これは、理論上、任意の計算可能な機能を記述できることを意味しますが、同時に、その記述が極めて困難であることを示唆します。多くの難解
プログラミング言語は、言語機能を最小限に抑えることで
チューリング完全性を達成しており、その結果、プログラムの理解が非常に困難になっています。
また、言語パラダイムも重要な概念です。命令型言語(
Brainfuckなど)、関数型言語(Unlambdaなど)、書換え言語(Thueなど)など、様々なパラダイムが存在し、それぞれの言語が持つ特徴を理解する上で役立ちます。
OISC (One Instruction Set Computer)のように、たった一つの命令のみで構成された計算機も存在します。
Brainfuck以外にも、多くの難解
プログラミング言語が存在します。例えば、コンパクトな
コンパイラを持つ
Brainfuck、自己変更可能な二次元配列ソースコードを用いるBefunge、たった4つの命令のみで構成されるHQ9+、画像をソースコードとするPiet、わずか3進数しか扱えないMalbolge、シェイクスピアの戯曲のような構文を持つShakespeareなど、その設計思想は実に様々です。他にも、Whitespace(スペース、タブ、改行のみ)、Ook!(
Brainfuckのシンタックスシュガー)、JSFuck(
JavaScript風で制限された文字のみ使用)、
Lazy K(純粋関数型で組み込み関数が3つのみ)など、独特の制約を持つ言語が数多く存在します。
難解
プログラミング言語は、単なる
プログラミング言語の
ジョークとしてだけでなく、文化的な文脈においても注目されています。Geoff Coxなどの研究者は、難解
プログラミング言語をコードアートやコードポエムのような芸術表現と捉え、命令や制御という視点から、文化的な表現や拒絶へと人々の関心を移行させたものと評しています。また、Daniel Temkinは、
Brainfuckのような言語が人間の思考と計算機の論理の間にある矛盾を露呈させると述べています。難解
プログラミング言語を用いたプログラミングは、一種のパフォーマンスアートとしての側面も持っていると言えるでしょう。
まとめ:遊び心と創造性、そして限界への挑戦
難解
プログラミング言語は、実用性とは異なる価値観に基づいて開発された、独特の
プログラミング言語の世界です。その遊び心と創造性、そして
プログラミング言語の限界への挑戦は、私たちに新たな視点を与えてくれます。これらの言語を理解することで、プログラミングという行為に対する理解を深めることができるでしょう。