難解なプログラミング言語の楽しさ(と狂気)

難解なプログラミング言語は、言語設計の規範に挑戦するように設計されたプログラミング言語です。 それはポイントを作るために設計された言語です。 何か珍しいものを作ること、精巧な冗談を作ること、芸術的表現としての言語を作ること、プログラミングのための有望なアイデアをテストするこ

これは、すべての異なる難解なプログラミング言語を適切に分類または整理する簡単な方法がないことを明確にする必要があります。 しかし、我々は彼らの周りのコミュニティのより良い感覚を得るためにいくつかの概念と組織の原則を使用することができます。 人々がそれらを何のために使用しているのかを理解したり、この情報をインスピレーションとして使用して独自の難解な言語を作成したりできます。

いくつかの有用な概念

チューリングTarpit

チューリングtarpitはチューリング完全であるが、実際には使用できないプログラミング言語です。 チューリング完全言語は、任意のチューリングマシンをシミュレートすることができます。 実用的には、それを使って任意のプログラムを書くことができます。 したがって、理論的には、そのような言語はすべて同等に強力ですが、チューリングTarpitでもある言語は、あらゆる種類のプログラムを書くことを非常に困 どうなるかという点に集中している削減の数字を試してみてください文書であってもこんにちは世界プログラムだけで8文字以内。

Quine

quineは、そのソースコードのコピーを出力として生成するプログラムです。 空のプログラムが特定の言語で有効なプログラムであっても、プログラムを空のプログラムにすることはできません。 ディスクまたはメモリからソースコードを読み取ることも不正行為と見なされます。 “Quine”という名前は、Douglas Hofstadterによって、哲学者Willard Van Orman Quineに敬意を表して、彼の本”Gödel、Escher、Bach:An Eternal Golden Braid”の中で造語されました。 したがって、quineの概念は難解なプログラミング言語に固有のものではありませんが、それにもかかわらず、それを書くときに克服する典型的な最初のコードゴルフ

コードゴルフ

コードゴルフは、特定のアルゴリズムを実装する最短のプログラムを書くことを目的とした競争の一種です。 この文脈では、shortestは最短のソースコードを持つことを意味します。 これは、バイナリ実行可能コードのサイズが小さいことを意味するものではありません。 コードゴルフをプレイすることは”ゴルフスクリプト”と呼ばれています。 観客を考えると、創造的な不正行為を頻繁に奨励するプログラミングに関連する他のすべての種類の競技もあります。 一般的に言えば、挑戦は多くの難解なプログラミング言語にとって動機づけの要因です。

難読化

難読化の概念、つまりメッセージの本当の意味を隠すことは、明らかに難解なプログラミング言語や一般的なプログラミングに排他的ではありません。 しかし、それは多くの難解なプログラミング言語で大きな関連性を持っています。 あなたが誤解を招くか、受信者を混乱させるのより大きな一般的な意味でそれを意図している場合は特に。 メッセージ自体が重要なので、あなたはメッセージを隠していませんが、隠されたフォームは、それ自体が目的であるためです。 これを実現する典型的な方法は、言語のシンボルの数を最小限に抑えることですが、通常のテキストや画像のように見えるプログラミング言語を

非決定性

誤解を招く、または聴衆を混乱させるというこの大きな意味では、非決定性を使用して同じ目的を達成することもできます。 非決定論的言語は、プログラムの現在の状態を考えると、次の状態を常に予測することができない言語です。 この概念は、基本的に実行時の予測不可能な条件のために、通常のプログラミング言語でいくつかの使用をしています。 しかし、それは変数をランダム化したり、命令自体をランダム化することによって、特定の難解なプログラミング言語によって極端に取られます。

難解なプログラミング言語のグループ

すでに述べたように、すべての難解なプログラミング言語を網羅的に整理する方法を提供することはできません。 たとえ誰かがそれを見つけることができたとしても、すぐに他の誰かがそれを無効にするために新しい難解なプログラミング言語を発明 だから私たちがやろうとしているのは、難解なプログラミング言語の世界をよりよく理解し、探求するために、いくつかのグループ、またはカテゴリを提

  • 客観的な値を持つ言語ですが、この値は必ずしも外因性または典型的な値ではありません。 基本的な例は、コードゴルフの競争に勝つために設計された言語です:その値は測定することができますが、それは難解なプログラミング言語のコミュ しかし、より有用な種類は、セキュリティ対策を回避する(JSFuckを参照)、またはChomsky階層のタイプ0言語を定義する(Thueを参照)など、珍しい目的を達成するように
  • これらは使用するのが非常に難しい言語です。 これは、設計者の明示的な目的であるか、単に設計自体の事故である可能性があります。 ユーザーも、いくつかの時間のためにそれらを使用する楽しさを発見したことがあります。 デザインと偶然の両方で使用できない言語を達成するための典型的な方法は、ミニマリズムです(Brainfuckを参照)。 しかし、使用することがほとんど不可能なものが必要な場合は、三項システムを使用し、意図的に自己変更する言語のようなものが必要です(Malbolgeを参照)。
  • アイデアをテストしたり、何かを証明するための言語。 これらは直接的には有用ではないかもしれない言語ですが、新しい概念や何かを証明するための良いテストの場です。 たとえば、プログラムが二次元グリッドに配置されている言語(Befungeを参照)またはほぼ純粋な関数型言語(Unlambdaを参照)
  • 芸術的言語。 これらは、いくつかの芸術的価値を持つという考えで設計された言語です。 それらは事実上、テスト言語のグループまたは客観的な価値を持つ言語のいずれかの一部であると主張することができます。 彼らはプログラミングのように見えないので、私たちは、別のカテゴリにそれらを置きますが、彼らはあなたがそれらを使用したくない場合でも、面白 例えば、彼らは抽象的な芸術のように見える(ピエトを参照)またはShakesperean演劇のように見える(シェイクスピアを参照)。
  • これらは、ユーモアの奇妙な感覚を持つ人々と発明された言語です。 言う人のように:”あなたは冗談を聞きたいですか? -それは締結する前に、戦争と平和を読みます-私たちの人生は冗談です!”. 例は風刺的な言語であり、リファレンスマニュアルでさえ冗談です(INTERCALを参照してください)

いくつかの注目すべき難解な言語

もちろん、これは注目すべき難解なプログラミング言語の網羅的なリストではなく、彼らの成功や特異性のために注目すべきいくつかのリストです。

Befunge

Befungeの主な難解な特徴は、プログラムが二次元のグリッドに配置されていることです。 また、スタックベースで反射的な言語であるため、プログラムが自分自身を変更することができます。 主な目的は、コンパイラを作成することができるだけ困難な言語を設計することでした。

元のバージョン、現在はBefunge-93と呼ばれていますが、グリッドサイズに80×25の制限があるため、チューリング完全ではありません。 しかし、Befunge-98と呼ばれる新しいバージョンでは、この制限が削除され、チューリングが完了する必要があります。 BefungeはFungeoidと呼ばれる多次元言語のクラス全体を生み出しました。

Befungeには、上、下、左、右の方向を制御するコマンドがあり、出力、バイナリ演算などの従来のコマンドと一緒にサイクルを作成することもできます。

> vv ,,,,,"Hello"<>48*, vv,,,,,,"World!"<>25*,@

Brainfuck

おそらくすべての難解なプログラミング言語の中で最も有名な、それは彼の極端なミニマリズムのために注目すべきです。 利用可能なコマンドの数と非常に小さなコンパイラを持つことの両方で。 著者は可能な限り最小のコンパイラで言語を作成したかったので、実際には第二の条件は、最初の理由です。 著者は、240バイトのみを使用するコンパイラを作成しました。 後で他の誰かが100バイトだけで作成したこともあります。 この目的の自然な結果は、言語がチューリング完全であるにもかかわらず、使用するのが難しいということです。 要するに、それはチューリングtarpitです。

これは、Brainf*ckや他の多くのバリエーションのように、検閲されたスペルで呼ばれることがあります。

言語は、データポインタと入力と出力のためのバイトの二つのストリームを操作する八つの異なるコマンドで構成されています。 ループにも対応しています。 コマンドを表す文字以外の他の文字はコメントと見なされ、コンパイラによって無視されます。

これは言語がどのように機能するかの例です(Esolangs wikiから取得)。

Code: Pseudo code:>> Move the pointer to cell2 Set cell2 to 0 << Move the pointer back to cell0 End while
++++++++>+>+>->>+<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

もっと知りたい場合は、対応するWikipediaページまたはEsolangsページで見ることができます。

INTERCAL

INTERCALは最初の難解なプログラミング言語ではなかったかもしれませんが、確かに最初の有名な言語です。 それは何歳ですか? それは1972年に作成され、最初の実装はパンチカードで行われました。 この言語はパロディとして意図されていましたが、プログラミングの世界には全く新しいものを作ることも意図されていました。 著者によると、名前は頭字語ではありません:

コンパイラの完全な名前は、「発音可能な頭字語のないコンパイラ言語」であり、明白な理由から「INTERCAL」と省略されています。”

インターカルリファレンスマニュアル(PS形式)の残りの部分も無意味またはユーモラスな文でいっぱいです。 これは、彼らが記述する言語と、彼らがそれをどのように行うかの両方です。 たとえば、これは変数に関するセクションです

INTERCALでは、16ビット整数と32ビット整数の2つの異なるタイプの変数のみが許可されています。 これらの
はスポット(. )またはtwo-spot(:)、それぞれ1から65535までの任意の数が続きます。
を含みます。 これらの変数は、負でない数値のみを含むことができるため、それぞれの範囲は
の値を持ちます: 0~65535および0~4294967295。 注:。123と:123は2つの異なる変数です。 一方、
。1と.0001は同一である。 さらに、後者は1E-3と書かれていない場合があります。

この言語では修飾子PLEASEの使用も許可されています。 しかし、それはまた、このキーワードの適切な量の使用を必要とします。 それはあなたが礼儀正しさの適切な量を表示する必要があると言うことです、あまりにも少ないか、あまりにも多くを使用することはできません。 本当にunfunny部分は、それが元のマニュアルで文書化されていない機能だったということです。 冗談のマニュアル冗談のマニュアルは大丈夫かもしれませんが、それが不完全であることは受け入れられません。

ここんにちは世界のバージョINTERCALを実施C:C-INTERCAL.

DO ,1 <- #13PLEASE DO ,1 SUB #1 <- #238DO ,1 SUB #2 <- #108DO ,1 SUB #3 <- #112DO ,1 SUB #4 <- #0DO ,1 SUB #5 <- #64DO ,1 SUB #6 <- #194DO ,1 SUB #7 <- #48PLEASE DO ,1 SUB #8 <- #22DO ,1 SUB #9 <- #248DO ,1 SUB #10 <- #168DO ,1 SUB #11 <- #24DO ,1 SUB #12 <- #16DO ,1 SUB #13 <- #162PLEASE READ OUT ,1PLEASE GIVE UP

要するに、INTERCALは非常に精巧な冗談です。 あなたがその忍耐のためにその創造者を賞賛したり、その正気を疑うように導くかもしれない冗談のようなもの、あるいはその両方。

JSFuck

Brainfuckの成功は、それらすべてを言及するにはあまりにも多くの派生言語の作成に拍車をかけています。 しかし、最も注目すべきものはJSFuckです。

JSFuckは適切な言語ではありませんが、6文字のみを使用する必要があるjavascriptの難解なプログラミングスタイルです。 結果のプログラムは有効なJavaScriptプログラムであり、実際にはマルウェア検出のようなセキュリティ技術をバイパスするために発明されました。 その特性により、コードの難読化にも役立ちました。Javascriptの任意の式を任意の型として評価できるため、機能します。 したがって、は空の配列を表しますが、+の前に+を付けることで、数値0として評価するように強制することができます。 aのような文字を取得するには、値falseなどを操作できます。 最終的な結果は非常に冗長な言語であり、alert("Hello World!")と同等の長さは22948文字です。

Malbolge

Malbolgeは、特に使用することはほとんど不可能であるように設計された言語です:

直感的ではない「狂気の操作」、基本3の算術、自己改変コード

を介して、それ自身の作成者の言葉で。

実際には、著者でさえ、それを使って作業プログラムを書いたことはありません。 最初のプログラムは、ヒューリスティック検索アルゴリズムを実装した別のプログラムによって生成されました。 この言語はチューリング完全ではなく、ダンテ-アリギエーリの地獄の地獄の八つの円であるMalebolgeのスペルミスにも基づいています。 だから、それは本当に償還品質を持っていません。

全部が明示的に欲求不満の練習であるため、私はそれを記述しようとしません。 しかし、言及する価値のある注目すべき「狂気の操作」があります:暗号化。 この言語は三元仮想マシンで動作することになっており、三つのレジスタを持ち、そのうちの一つは現在の命令へのポインタを含み、と呼ばれています。 命令が実行された後、の値のモジュロ94がにあるものを置き換え、結果は暗号化テーブルに従って暗号化されます。 地獄へようこそ、確かに。

も勇気あ魂作こんにちは世界プログラム。

(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc

Piet

Pietは、プログラムがPiet Mondrianのスタイルで抽象芸術の絵画として表現される言語です。 これは、スタックベースとチューリング完全です。

色相と明るさに合わせて、黒と白の18色が注文されています。 これらの最後の2つは特別な意味を持ち、制御フローに使用されます。 プログラムの実行は、方向ポインタとカラーブロックセレクターの二つの”ポインタ”に依存しています。 DPは上、下、左、右を指すことができますが、CCは左と右のみを指すことができます。 これらの2つのポインタの組み合わせは、プログラムの実行を制御します。 色のブロックのサイズは整数を表します。 プログラムが異なる色のブロック間で遷移すると、色相と明るさの差が実行されるコマンドの種類を決定します。 コマンドは、値を出力したり、乗算したりするなど、通常のコマンドです。

のこんにちは世界プログラムのある美しさです。

こんにちは世界PietによるトーマスSchoch

シェイクスピア

シェイクスピアは、言語の設計について”美しいソースコードを彷彿とさせるシェイクスピア演劇”. この言語にはコマンドがほとんどなく、機能的にはアセンブリ言語に似ていますが、当然のことながら非常に冗長です。

変数は最初のセクションで宣言する必要があり、その名前はRomeoやJulietなどの有効なシェイクスピア文字でなければなりません。 これらの変数はスタックであり、後でpop、push、input/outputなどの操作が実行されます。 行為とシーンの名前は、gotoラベルと特定の条件文の宛先として機能します。 文字、つまり変数は、操作するためにステージ上で呼び出されなければならず、ステージ上で一度に二つだけ存在することができます。

行は、通常、数値定数を表します:いくつかの名詞と形容詞は、数値に変換されます。

Hamlet: You lying stupid fatherless big smelly half-witted coward!Juliet: You are as villainous as the square root of Romeo!

“Remember”のような特殊な単語、または”Speak your mind”のようなそれらの組み合わせは、コマンドを実行します。 これらは、スタック文字に値をプッシュしたり、現在の変数または対応するASCII文字の値を出力したりするなどの通常のコマンドです。

条件文は、ある文字からの質問と、質問の条件がtrueと評価された場合にどこに行くかを決定する他の文字からの回答によって表されます。

Juliet: Am I better than you?Hamlet: If so, let us proceed to scene III.

のこんにちは世界は長い生産性としてShakespearean。

The Infamous Hello World Program.Romeo, a young man with a remarkable patience.Juliet, a likewise young woman of remarkable grace.Ophelia, a remarkable woman much in dispute with Hamlet.Hamlet, the flatterer of Andersen Insulting A/S. Act I: Hamlet's insults and flattery. Scene I: The insulting of Romeo.Hamlet: You lying stupid fatherless big smelly half-witted coward! You are as stupid as the difference between a handsome rich brave hero and thyself! Speak your mind! You are as brave as the sum of your fat little stuffed misused dusty old rotten codpiece and a beautiful fair warm peaceful sunny summer's day. You are as healthy as the difference between the sum of the sweetest reddest rose and my father and yourself! Speak your mind! You are as cowardly as the sum of yourself and the difference between a big mighty proud kingdom and a horse. Speak your mind. Speak your mind! Scene II: The praising of Juliet.Hamlet: Thou art as sweet as the sum of the sum of Romeo and his horse and his black cat! Speak thy mind! Scene III: The praising of Ophelia.Hamlet: Thou art as lovely as the product of a large rural town and my amazing bottomless embroidered purse. Speak thy mind! Thou art as loving as the product of the bluest clearest sweetest sky and the sum of a squirrel and a white horse. Thou art as beautiful as the difference between Juliet and thyself. Speak thy mind! Act II: Behind Hamlet's back. Scene I: Romeo and Juliet's conversation.Romeo: Speak your mind. You are as worried as the sum of yourself and the difference between my small smooth hamster and my nose. Speak your mind!Juliet: Speak YOUR mind! You are as bad as Hamlet! You are as small as the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece. Speak your mind! Scene II: Juliet and Ophelia's conversation.Juliet: Thou art as good as the quotient between Romeo and the sum of a small furry animal and a leech. Speak your mind!Ophelia: Thou art as disgusting as the quotient between Romeo and twice the difference between a mistletoe and an oozing infected blister! Speak your mind!

Thue

thueはセミThueシステムと呼ばれる文字列書き換えシステムに基づくプログラミング言語です。 これは非決定論的であり、制約プログラミングのパラダイムに従います。 これは、変数が制約の観点から定義されていることを意味します(例。 何かが真または偽である)。 それはチューリングtarpitです。

Thueの場合、costraintsは次の形式の置換ルールのリストで表されます:

<string>::=<replacement>

この形式の特別な形式は、入力、出力、またはルールのリストの終わりを表します。

言語の非決定的な性質は、同じ文字列の二つの可能な置換を示すことによって示すことができます。 例えば:

  • 文字列astupid
  • に置き換えることができるというルールを書くまた、文字列astupid
  • に置き換えることができるというルールを書くyou are

プログラムが実行されると、文字列aは2つのオプションのいずれかに置き換えることができます。

ルールのリストの後には、初期状態を表す文字列が続きます。

便利なプログラムを書くのは難しいかもしれませんが、典型的なHello Worldは、少なくとも難解なプログラミング言語の標準によって、非常に簡単で理解こんここんにちはあります。

a::=~Hello World!::=a

Unlambda

Unlambdaは、純粋に関数型言語を表示するように設計された(ほぼ)純粋な関数型言語です(そしておそらくそれがどれほど実用的ではないでしょう)。 それは組合せ論的論理に基づいています。 それはチューリング完全であり、最初の機能チューリングtarpitです。 これはいくつかの関数、apply operator`(バッククォート文字)に依存しており、入出力もサポートしています。 技術的には、単一の引数を持つ関数でのみ機能しますが、複数引数の関数は一連の関数に変換できます。

`r```````````.H.e.l.l.o. .w.o.r.l.di

その他の興味深い難解な言語

フーガは、MIDIファイルをソースコードとして使用する言語です。 各ノート間の間隔は、入力/出力または加算などの特定の従来のコマンドに変換されます。

Beatnikは一連の英語の単語で構成されるスタックベースの言語です。 単語は、ゲームScrabbleでその値に応じて、伝統的なコマンドに変換されます。

Whitespaceは、タブやスペースなどの空白文字のみが有効で、他の文字は無視される冗談言語です。 これはもちろん、空白を無視するコンパイラの通常の動作の逆です。 これらの特性を考えると、それは多言語プログラム、すなわち複数の言語に対して有効なプログラムで使用することができます。 他の言語がPythonではない限り、または空白が重要な言語ではありません。

GolfScriptは、コードゴルフ競技に勝つために設計された連結プログラミング言語であり、チューリング完全でもある。

Snowflakeは、インタプリタとプログラムの両方が実行されるたびに変更される可逆的な自己修正言語です。

FRACTRANは、プログラムが分数のリストと初期数である言語です。 私はそれが何をしているのか分かりませんが、Wikipediaのページがあるので何かをします。

IotaとJotは二つの形式言語であり、それぞれが最も単純な形式システムになるように設計されています。 その性質上、彼らはまた、同様にミニマリスト、チューリングtarpit、プログラミング言語とみなすことができます。 どちらも2つのシンボルのみを使用し、2つの操作を実行します。 Zotと呼ばれる後継機は、入出力にも対応している。

エントロピーは、制御を放棄するという考えを受け入れるように設計された非常に適切な名前のプログラミング言語です。 プログラムのどの出力でも近似され、データがアクセスされるたびに任意に変更される。 言語は元のプログラムを変更しないため、実行されるたびに出力は異なりますが、初期状態は保持されます。 データのランダム化の奇妙な副作用は、セラピストが酔っているように見える古典的なElizaプログラムのwebバージョンであるDrunk Elizaです。

モニチェリは、コメディ映画”マイ-フレンズ”に基づくジョーク言語である。 典型的なプログラムは、一連の無意味なイタリア語のフレーズのように見えます。 この映画はインスピレーションとして使用されているので、驚くべきことにこれは理にかなっています。 それは狂気の輪です。

概要

難解なプログラミング言語の世界は、それが怒っているようにエキサイティングです:ルールはありませんが、面白いことがたくさんあります。 私はあなたが期待できるものに少し正気なウィンドウを与えていることを願っています。

もっと知りたい、またはこのコミュニティに参加したい場合は、Esolangsを見ることをお勧めします。 そのウェブサイトは、ウィキペディアと一緒に、この記事に示されているほとんどの例のソースです。 そこには、難解なプログラミング言語のアイデアのリストにインスピレーションを見つけることもできます。

Marc C.Chu-Carrollのブログは、何年にもわたって多くの化身で興味深いものになるかもしれません。 良い数学、悪い数学という名前が示すように、それは主に数学に専念しています。 それにもかかわらず、それはまた、病理学的プログラミング(言語)と呼ばれるシリーズの難解なプログラミング言語の多くの分析を持っています。 あなたは、例えば、最小のプログラミング言語専用のものを見ることができます。

コメントを残す

メールアドレスが公開されることはありません。

Previous post 自家製干しシトラスホイール
Next post 血とチョコレート(2007)