実用的な実世界のプログラムを書くために使用される難解な言語の例を知っていますか? 難解な言語が特定の問題を解決するのに役立つことが実際に証明されているコンピューター科学の分野はありますか?
17 に答える
定義上、難解プログラミング言語の実用的な使用法はほとんどありません。ただし、使用できないからといって、役に立たないというわけではありません。
tl; dr:
- 非決定論的esolangは、すべてのスレッドベースのプログラミングの非決定性を強調します
- チューリング陥穷は、他のどのプログラミング言語よりも強力なプログラミング言語がないことを強調し(両方がチューリング完全である場合)、それによって「計算力」と「表現力」を区別します。
- 彼らは水平思考を強制し、頭の体操です
たとえば、難解プログラミング言語を見ると、大まかにカテゴリに分類できます。ジョークとして作成されたもの、楽しみのために作成されたもの、チューリング陥穷として作成されたものもありますが、証明するために作成されたものもあります。またはポイントを説明します。そして、これらは実際にはまさにそのために役立ちます。おそらくプログラミング言語のクラスで、おそらくコミュニティや業界にポイントを説明することです。それらは実用的な目的には役に立たないが、教育的な目的には役立つ。
非決定論的な難解プログラミング言語を取ります。これらは、特定の式の評価セマンティクスが決定論的に定義されていないプログラミング言語ですが、たとえば、確率論的に、または月の満ち欠けなどに基づいて定義されています。そのような言語の定義を見ると、すぐに「まあ、それはばかげている」と思うでしょう。そしてそうです!(たとえば、Java2kのHello Worldプログラムは、ほぼ1ページのコードであり、「Hello World」を毎回印刷することすら保証されていません。ほとんどの場合のみです。)それでも、今日の主流のプログラミング言語のほとんどは、非決定論的並行性モデル。IOW:Java、C#、Python、Ruby、Perl、さらにはErlangやClojureでスレッドを開始するとすぐに、プログラムは難解言語Java2kと同じようにランダムになります。それで、本質的に同じものであるにもかかわらず、なぜ一方が愚かで、もう一方を通常どおり受け入れるのでしょうか。非決定論を極限まで追求し、それを楽しい方法でパッケージ化することにより、esolangsは私たちがその質問をすることを可能にします。
別の例はチューリング陥穷です。チューリング陥穷は、ほとんど機能がないが、チューリング完全であるエソランです。このようなチューリング陥穷は、2つの異なることを示すために使用できます。それを使用して、一部の言語を他の言語よりも「強力」(表現力の意味で)にすることが正確に何であるかを示すことができます。Webで検索すると、「LispがJavaよりもはるかに優れている場合は、Lispで記述できるが、Javaでは記述できないプログラムを見せてくれませんか」という質問があります。そしてもちろん、それはばかげています。どちらの言語もチューリング完全であるため、そのようなプログラムはありません。ただし、JavaをBrainfuckなどと対比することで、これが意味のある質問ではないことを示すことができます。
そして、チューリング陥穷で実証できるもう1つのことは、機能を削除することによって、言語をより強力にすることはできないということです(つまり、計算能力と表現力の両方の意味で)。当たり前のように聞こえますが、MicrosoftがC#から変更可能な状態を削除するだけで、魔法のように強力になると実際に信じている人もいます。
一般に、チューリング陥穷は、プログラミング言語の計算能力と表現力の違いを示すのに適しています。
エソランが役立つ他の方法は、プログラミング言語研究のインスピレーションとして役立つことです。Unlambdaについて考えてみてください。これは、その名前が示すように、ラムダ計算に基づかない関数型言語です。言い換えれば、それは関数を持たない関数型言語です。
そして最後に大事なことを言い忘れましたが、esolangsはあなたに完全に異なる角度から問題を見るように強制することができます(はい、私は認めます、それはほとんど厄介な角度です、しかしねえ、一部の映画監督(例えばヒッチコック)は彼らのキャリア全体を見ることに負っています厄介な角度から物事で)そして彼らは良いパズルのようにあなたの脳をからかいます。それは、例えば、Brainfuckの存在と名前の全体的な理由です。
雇用保障!!!
実世界のアプリですよね?
ゲームLost Kingdomは、2004 年に開催された第 1 回クラシック 2k テキスト アドベンチャー コンペティションで優勝し、元の作者によってbrainfuck で(再) 作成および強化されました。
Befungeやこのテキスト エディタの IRC ボットはどうですか? そして、難解な言語で書くのが好きなら、 CコンパイラのbefungeやCコンパイラのbrainfuckが非常に便利だと考えるかもしれません...
言語に実用的な用途がある場合、それは難解とは呼ばれません。この 2 つの用語は相互に排他的です。
チューリング マシン、計算可能性を理解し、計算理論によって暗示される内容について実践的な感覚を持つこと。脳****のような難解な言語を使用すると、すべての実用的な利点を収集できます。
他にもあると思います。
難解なプログラミング言語の一部のクラスは、理論的なコンピューター サイエンスに応用されています。
チューリング ターピットには、計算可能性理論と停止問題の特定の結果を示す用途があります。たとえば、Ianovの作業を参照してください (この記事の途中に、もう少しアクセスしやすい要約があります)。
チューリング マシンのクラスの基本的な結果は、別の実用的なアプリケーションです。たとえば、ウィキペディアは、P''は「チューリング完全であることが証明された最初の『GOTO レス』命令型構造化プログラミング言語」であると述べています。
バイナリ組み合わせ論理は、コルモゴロフの複雑さを分析するための便利なツールです。
この質問とその答えに触発されて、私もそのような言語の実用的な用途を見つけました: GolfScript、コードゴルフ専用に設計された言語:
GolfScript は、できるだけ少ないキーストロークで問題 (穴) を解決することを目的とした、スタック指向の難解なプログラミング言語です。また、シンプルで書きやすいことを目指しています。
それを書いた人々から直接、あなたはそれを持っています。コードゴルフが実際的な問題であるかどうかは議論の余地があるかもしれませんが、私の個人的な信念は、あなたや私が実際に書いて遭遇する可能性のあるものに限りなく近づくということです。たくさんのファンと。だから...ゲーム、サッカー、その他のあらゆる種類の娯楽活動が何らかの形で...実用的である場合...コードゴルフも自由に含めることができます:)
私が見る唯一の実際的な利点は、難解言語でコードを書いた場合、問題について新しく興味深い方法で考えるようになることです。あなたが主流の言語でプログラミングをしているときでさえ、問題に取り組む新しい方法を学ぶことは利益を得るでしょう。
昨年、チャールズ・ペッツォルドの「注釈付きチューリング」を読みました。少なくとも彼が説明しているように、私は確かにチューリングマシンをプログラムするつもりはありません。しかし、彼の「言語」で問題を解決することを考えると、私の心は伸びました。私はそのための優れたC#プログラマーです。
もちろん; Fungot、IRC ボット: http://zem.fi/~fis/fungot.b98.txt
パイロットと呼ばれる言語が存在します。ダートマスBASIC(インターペティティブ言語)で書かれた解釈言語です。最初の使用は、プログラミングをしていない教師がテストをプログラムできるようにすることでした。言語のすべてのコマンドは1文字であり、使用される文字は使用可能なオプションを定義します。それは古く(1976年に学んだ)、私が知る限り、もはや役に立たない。
ウィキペディアのリンクだけで判断する場合:
難解なプログラミング言語 (esolang に短縮されることもあります) は、コンピューター プログラミング言語設計の境界のテスト、概念の証明、または冗談として設計されたプログラミング言語です。通常、言語を実際のプログラミングに採用する意図はありません。
その場合、いいえ、そのような言語を実際の問題に実際に適用することはできません。
その理由は言語への侮辱ではなく、「実用的」に焦点を当てています。
- 実際には、問題を解決している場合は、それを解決したことを自分自身に納得させることができる必要があります。読みにくいように特別に設計された言語を使用している場合、ソリューションを視覚的に調べて「はい、これは正しい」と言うのは難しいでしょう。
- 実際には、孤立して作業しているわけではありません。実生活では、あなたは常にゼロ以外の他の人々のセットと一緒に働いています (それが未来のあなただけであっても)。他の誰かがあなたのソリューションを維持しなければならず、ここに機能を追加したり、そこで問題を修正したり、さらに悪いことに、あなたが何をしたのか、そしてその理由を文書化しようとしたりします.
- 1 も 2 も当てはまらない場合は、(a) 検査が簡単で、(b) 実際には使用されないためメンテナンスが不要な、問題の解決策を作成したことになります。したがって、これは些細な/非実用的な問題です。
カラーフォースは非常に強力で実用的です。
290KのOKADとGA4
難解な言語の開発は曼荼羅を作成するようなものです。仕事が終わったら、それを忘れたり、破壊したりすることさえできます。
コードの難読化は、非常に一般的な実用的な用途です:-p
また、APL/J/K ファミリが難解と言えるかどうかはわかりませんが、本番システムでは長い間使用されてきました。
他の用途の中でも、制約ベースのプログラミングや進化するソリューションなどの検索用途で、アルゴリズム検索の (ブラック ボックス)/(サンドボックス化されたアルゴリズム言語) として、より最小限のものを使用できます。
Eiffel、Erlang、Ocaml、Haskell。これらはすべて、ほとんどのプログラマーにとって「ニッチな」言語ですが、自分のドメイン内では実用的です。あなたの質問は単に意味がありません。「一般的な問題領域で使用されていない優れた言語はありますか?」と尋ねるのが適切かもしれません。