難解なプログラミング言語(略してesolangとも呼ばれる)または奇妙な言語[ 1 ]: 5は、概念実証、ソフトウェアアート、他の言語(特に関数型プログラミング言語または手続き型プログラミング言語)へのハッキングインターフェース、またはジョークとして、コンピュータプログラミング言語設計の限界を試すために設計されたプログラミング言語です。esotericという言葉の使用は、ソフトウェアを書くために働く開発者が使用する言語と区別しています。ほとんどのesolangの作成者は、主流のプログラミングに使用されることを意図していませんが、コードのライブビジュアライゼーションなどの難解な機能は、芸術における実用的なアプリケーションに影響を与えています。[ 2 ]このような言語は、ハッカー、趣味家、コンピュータサイエンスの学者の間で人気があります。 [ 3 ]
難解なプログラミング言語の設計者にとって、使いやすさは目標となることは稀であり、むしろその設計は正反対の結果をもたらすことが多い。彼らの通常の目的は、チューリング完全な言語、あるいは計算クラスが未知である言語を維持しながら、従来の言語機能を削除または置き換えることである。

難解なプログラミング言語の最も初期の、そして今なお典型的な例はINTERCALである[ 4 ]。これは1972年にドン・ウッズとジェームズ・M・ライオンによって設計された。彼らは、自分たちが慣れ親しんだどのプログラミング言語とも異なる言語、すなわちFORTRAN、BASIC、COBOL、ALGOL、SNOBOL、SPITBOL、FOCAL、SOLVE、TEACH、APL、LISP、PL/I [ 6 ]とは全く異なる言語を作ることを意図していたと述べている[ 5 ]。INTERCALは当時の確立されたプログラミング言語の要素をパロディ化したものであった[ 1 ] : 5
長年にわたり、INTERCALはINTERCALマニュアルの紙媒体のみで提供されていました。1990年にUnix上でC言語[ 1 ] : 6として実装されて復活したことで、難解なコンピュータ言語の意図的な設計に対する関心が高まりました。
1993年、Wouter van Oortmerssenは、コードを本質的に難読化、混乱させ、読みにくくするように設計された構文を持つ、小さなスタック指向プログラミング言語FALSEを作成しました。そのコンパイラはわずか1024バイトのサイズです。 [ 7 ]これがUrban Müllerに、認識される文字が8文字しかない、さらに小さな言語である、今では悪名高いBrainfuckを作成するきっかけを与えました。Chris PresseyのBefunge (FALSEに似ていますが、2次元の命令ポインタがあります)とともに、Brainfuckは現在、最小限のチューリングタールピットと不必要に難読化された言語機能の典型的な例を持つ、最もサポートされている難解なプログラミング言語の1つです。Brainfuckは、チューリングマシンのP′′ファミリーに関連しています。
難解なプログラミング言語は多くの点で異なりますが、パロディ、ミニマリズム、プログラミングを難しくするという目標など、多くの言語に共通する特徴がいくつかあります。[ 4 ] Brainfuckや類似の言語など、多くの難解なプログラミング言語はコマンドとして単一の文字を使用しますが、従来のプログラミング言語のように行ごとに読み込む言語も珍しくありません。
従来の命令型プログラミング言語では、通常、データを変数に格納できますが、特殊な言語では、データの格納とアクセスに異なる方法を使用する場合があります。 Brainfuck やMalbolgeのような言語では、単一のポインタを介してのみデータを読み取ることができ、データを読み取る前にポインタを目的の場所に移動する必要があります。BefungeやShakespeareのような他の言語では、1 つ以上のスタックを使用してデータを保持し、逆ポーランド記法に似た実行方法になります。 最後に、数値表現の代替形式を探求する言語もあります。 Brainfuck の派生言語である Boolfuck では、単一ビットに対する操作のみが許可され、Malbolge と INTERCAL の派生言語である TriINTERCAL では、ビット全体を 3 進数システムに置き換えます。[ 8 ]
難解な言語は、プログラム命令を表現する独自の方法も示しています。BefungeやPietなどの言語では、プログラムを 2 次元以上で表現し、プログラム制御はプログラム内を複数の可能な方向に移動します。[ 9 ]これは、プログラムが通常順序付けられて出現する命令の集合である従来の言語とは異なります。他の言語では、命令を通常とは異なる形式で表示するように変更し、多くの場合、基となる命令とは異なる意味を人間が読み取れるようにします。Shakespeareは、すべてのプログラムをシェイクスピア劇に似せることでこれを実現しています。Chefは、すべてのプログラムをレシピにすることで同じことを実現しています。[ 8 ] Chef は、プログラムとしてもレシピとしても正常に機能するプログラムを作成する人がいる点で特に注目に値し、言語が二重の意味を生み出す能力を示しています。これはマルチコーディングと呼ばれます。[ 10 ]コードの 2 つの解釈が美的に相互に影響し合うマルチコーディングされた難解な言語は、ウリポ運動の制約ベースのライティングと比較されています。[ 8 ] [ 11 ]
多くの難解なプログラミング言語は、読み書きが困難なほど難解なコードを生成するように設計されています。 [ 1 ]この目的は、プログラム作成者に興味深いパズルや課題を提供することかもしれません。たとえば、Malbolge は意図的に難解になるように設計されており、自己修正コードや非常に直感に反する操作などの機能を備えています。[ 1 ]一方、難解な言語の中には、他の設計上の選択によって記述が困難になるものもあります。Brainfuckは最小限の命令セットという考え方に基づいているため、命令は原理的には単純明快ですが、生成されるコードは人間が読みにくいものになります。INTERCALの難しさは、他のプログラミング言語で使用される操作を避けるという選択の結果であり、これは他の言語のパロディとして生まれたことに由来します。[ 1 ]
難解なプログラミング言語の目的の 1 つは、プログラミング分野の既存の言語やトレンドをパロディ化または風刺することです。[ 1 ]例えば、最初の難解な言語 INTERCAL は、1960 年代に使用されていたAPL、Fortran、COBOLなどの言語の風刺として始まりました。INTERCAL のルールは、これらの他の言語のルールの逆になっているようです。[ 12 ]しかし、パロディの対象は、必ずしも他の確立されたプログラミング言語とは限りません。たとえば、シェイクスピアは、シェイクスピア劇の構造を風刺していると考えることができます。言語 Ook! はBrainfuckのパロディで、Brainfuck の 8 つのコマンドが「Ook. Ook?」のようなさまざまなオランウータンの音に置き換えられています。[ 8 ]
Befunge では、命令ポインタがコード内を複数の次元で移動できます。たとえば、次のプログラムは、文字を逆順にスタックにプッシュし、次に命令、、、、、 を時計回りにループして文字を出力することで、「Hello World」を表示します。>:v_,^
"dlroW olleH" > : v ^ , _@Befungeには多くのバージョンがあり、最も一般的なのはリリース年にちなんで名付けられたBefunge-93です。[ 13 ]
バイナリラムダ計算は、アルゴリズム情報理論の観点から、最小限の手段で可能な限り高密度のコードを可能にするように設計されており、29バイトの自己インタプリタ、21バイトの素数篩、および112バイトのBrainfuckインタプリタを備えています。[ 14 ]
Brainfuckは極度のミニマリズムを目指して設計されており、難読化されたコードが生成され、プログラムには8種類の文字しか含まれません。次のプログラムは「Hello, world!」を出力します。[ 15 ]
++++++++++ [ > +++++++ > ++++++++++ > +++ <<< - ] > ++ . > + . +++++++ .. +++ . > ++ . << +++++++++++++++ . > . +++ . ------ . -------- . > + .以外の文字はすべて無視されます。+-<>,.[]
Chef は、 David Morgan-Marによって作成されたスタック指向プログラミング言語で、プログラムを料理のレシピのように見せるように設計されています。[ 16 ]プログラムは、タイトル、変数とそのデータ値のリスト、およびスタック操作命令のリストで構成されます。[ 17 ]冗談めかした設計原則には、「プログラムのレシピは、有効な出力を生成するだけでなく、準備が簡単でおいしいものでなければならない」とあり、Morgan-Mar は、101 個の卵と111 カップ (約 26,640 mL)の油を使った「Hello, World!」プログラムの例は、「一人分の食べ物としてはかなりの量」になると述べています。[ 17 ] [ 18 ]
FRACTRANプログラムは、正の分数の順序付きリストと、最初の正の整数入力から構成されます。プログラムは整数を乗算することによって実行されます。最初の分数でリストの中では整数です。はその後、そしてルールが繰り返されます。リスト内のどの分数も、乗算しても整数にならない場合プログラムは停止します。FRACTRANは数学者のジョン・コンウェイによって発明されました。[ 19 ]
INTERCALは「発音可能な頭字語のないコンパイラ言語」の略で、1972年に当時の様々なプログラミング言語の側面を風刺するパロディとして作成されました。[ 6 ]
JSFuckはJavaScriptの難解なプログラミングスタイルで、コードは[、、、、、、の6 文字のみ]を使用して記述されます。独自のコンパイラまたはインタプリタを必要とする Brainfuck とは異なり、JSFuck は有効な JavaScript コードであるため、JSFuck プログラムは JavaScript を解釈する任意のWeb ブラウザまたはエンジンで実行できます。[ 20 ] [ 21 ]クロスサイトスクリプティング検出フィルタを回避できるため、eBayなどの Web サイトに対する多数のクロスサイトスクリプティング(XSS) 攻撃で使用されています。 [ 22 ]()!+
LOLCODEは、 lolcatsの話し方を模倣するように設計されています。以下は「Hello World」の例です。
はい STDIO を使用できるか? 目に見える「ハイワールド!」 ではまた
LOLCODEの意味論は特に珍しいものではないが、その構文は言語現象として説明されており、プログラミングにおける非公式な話し方やインターネットスラングの珍しい例となっている。[ 23 ]
マルボルジュ(地獄の第 8 圏にちなんで名付けられた)は、最も難解で難解なプログラミング言語となるように設計された。他の特徴の中でも、コードは設計上自己修正可能であり、命令の効果はメモリ内のアドレスに依存する。[ 24 ]


PietはDavid Morgan-Marによって設計された言語で、そのプログラムは抽象芸術のように見えるビットマップです。[ 25 ]実行は、連続した色の領域から次の領域へと画像内を移動する「ポインタ」によってガイドされます。ポインタが領域から出ると、手続きが実行されます。
動作が指定されている色は 20 色です。18 色の「カラフルな」色は、6 段階の色相サイクルと 3 段階の明度サイクルで順序付けられています。残りの 黒と白は順序付けられていません。「カラフルな」色から別の色に入ると、実行される手順は色相と明度の変化の段階数によって決まります。黒には入ることができません。ポインタが黒の領域に入ろうとすると、代わりに次のブロックを選択するルールが変更されます。すべての可能なルールが試された場合、プログラムは終了します。画像の境界外の領域も黒として扱われます。白は操作を実行せず、ポインタが「通過」できるようにします。指定された 20 色以外の色の動作は、コンパイラまたはインタプリタに委ねられています。[ 25 ]
変数は単一のスタックに符号付き整数としてメモリに格納されます。ほとんどの規定された手続きはそのスタックに対する操作を扱いますが、その他の手続きは入出力とコンパイルポインタの移動規則を扱います。[ 26 ]
ピートはオランダの画家ピエト・モンドリアンにちなんで名付けられました。[ 27 ]当初予定されていた名前「モンドリアン」は、すでにオープンソースの統計データ可視化システムで使用されていました。[ 25 ]
シェイクスピア・プログラミング言語(SPL)は、プログラムをシェイクスピア劇のように見せるように設計されています。例えば、次の文は、GOTO文で到達できるプログラム内のポイントを宣言しています。
第一幕:ハムレットの侮辱とお世辞。
Unlambdaは、 SKI計算に基づいたミニマルな関数型プログラミング言語ですが、第一級継続と命令型I/O(入力には通常、継続の使用が必要)が組み合わされています。[ 28 ]
Velatoは2009年にDaniel Temkinによって作成され、ソースコードとしてMIDIファイルを使用します。プログラムは音符で構成され、各命令は選択されたルート音に対する連続する音符間の間隔によって決定されます。[ 29 ] この設計により、有効なVelatoコードは音楽作品としても使用できます。[ 30 ]

Whitespace はASCII の空白文字(スペース U+0020、タブ U+0009、改行 U+000A)のみを使用し、他のすべての文字を無視するため、コメントに使用できます。これは、タブとスペースを同じように扱い、異なる空白文字を区別しない多くの従来の言語とは逆です。また、Cなどの言語のプログラムのソースコードに Whitespace プログラムを隠蔽することもできます。[ 31 ]
エソランの文化的背景はジェフ・コックスによって研究されており、彼はエソランが「命令と制御から文化的表現と拒否へと注意を移す」と書いており[ 32 ] 、エソランをメズ・ブリーズのメザンジェルなどのコードアートやコード詩に似ていると見ており、この考えは他の分野の研究者にも共有されている[ 33 ] 。ダニエル・テムキンは、「エソランはオープンエンドなシステムであり、本質的に協力的で、単一の具現化された形態から距離を置いている」と主張しており、それは「プログラミング文化やコンピュータサイエンスの教え方におけるより広い概念に挑戦したり、再確認したりする」ものであり、エドスガー・ダイクストラの『謙虚なプログラマー』で提唱されている中立的で「プロフェッショナルな」スタイルも含まれる[ 34 ]。
David Morgan-Mar氏のChefプログラミング言語の実装であるAcme::Chefがあります。Chefでは、プログラムはレシピの形式で表現されます。
有効なCファイルと有効なWhitespaceファイルを入力として受け取り、CとWhitespaceの両方で有効な多言語ファイルを出力として生成します。このファイルは、
解釈/コンパイル時に入力とまったく同じように
動作します。