言語がチューリング完全でなくてはならないことが受け入れられている場合、チューリング完全ではない「有用な」プログラミング言語を持つことは実際に可能ですか?
これは、マークアップ言語やクエリ言語ではなく、伝統的な意味での「プログラミング」言語に関するものであることを明確にする必要があります。
言語がチューリング完全でなくてはならないことが受け入れられている場合、チューリング完全ではない「有用な」プログラミング言語を持つことは実際に可能ですか?
これは、マークアップ言語やクエリ言語ではなく、伝統的な意味での「プログラミング」言語に関するものであることを明確にする必要があります。
回答:
Coq、Agda、HOLおよびACL2は、チューリング完全ではありませんが、非常に便利で非常に強力な言語です。
それらをチューリング完全でないものにする一般的な機能は、終了を常に証明できるという事実です。非常に単純な制限で十分です:再帰呼び出しは、構造的に証明可能なより小さな用語でのみ許可されます。したがって、チューリング完全言語または言語自体のためのインタプリタを実装することはできませんが、認定されたCコンパイラのような他の多くの有用なことがまだ可能です。
Yeggeの「ミニ言語」という用語は、特定の問題に対して言語を使用することがしばしば役立つという事実を指していると思います。言語はタスクを達成するためにチューリング完全性を必要とせず、 -完全な言語を用意することは有用です。https://sites.google.com/site/steveyegge2/language-grubbing
ウィキペディアは、私の腸が言ったことに沿って、これに非常によく答えています。最初は純粋な数学を考えていましたが、正規表現を思い出しました。ウィキペディアには、「純粋な数学」の流れと思われるエピグラムがリストされています。
http://en.wikipedia.org/wiki/Turing_completeness#Non-Turing-complete_languages
非チューリング完全言語
チューリング完全ではない多くの計算言語が存在します。そのような例の1つは、有限オートマトンによって生成される最も一般的な正規表現である正規言語のセットです。有限オートマトンのより強力だがまだチューリング完全ではない拡張機能は、プログラムコンパイルの初期段階で解析ツリーを生成するために一般的に使用されるプッシュダウンオートマトンとコンテキストフリーグラマーのカテゴリです。その他の例には、Direct3DおよびOpenGL拡張機能に埋め込まれたピクセルシェーダー言語の初期バージョン、またはサイクルのないスプレッドシート内の一連の数式が含まれます。[引用が必要]チャリティやエピグラムなどの終了。慈善団体では、カテゴリ理論に基づいて型システムと制御構造を使用しています。
データ言語
チューリング完全性の概念は、XML、JSON、YAML、S式などの言語には適用されません。これらは通常、計算ではなく構造化データを表すために使用されるためです。これらは、マークアップ言語、またはより適切には「データ記述言語」と呼ばれることもあります。
また、データ構造の表現は言語ではないことにも言及していますが、XSLTは計算の表現としてカウントすべきだと思います。XPathはおそらく、SQLが計算言語ではなくクエリ言語であることについてYannisが言ったことに基づいていません。おそらく、T-SQLまたはPL / SQLは計算言語としてカウントされますが、SQLの一般化された形式ではおそらく集計を指定しない集計を使用して大量の計算を実行できるためです。
SQLはビジネスタイプの間で非常に人気があることを理解しています
言語を汎用言語として使用するには、チューリングの完全性が必要です。しかし、それは十分ではありません。つまり、チューリング完全であるという理由だけで、すべての問題領域に適しているわけではありません。
逆に、DSLは、チューリングの完全性がなくても、実際に適切に設計されていると想定して、設計対象の問題領域に適しています。
* IIRCは、CSSアニメーションを使用したHTMLを使用して、ConwayのGame of Lifeを一連のチェックボックスに実装することで、チューリング完全であることを証明しました。ただし、HTMLの有用性は、CSSアニメーションをサポートしていないブラウザーでも保持されます。
実際には、「効率的な」プログラムのみを記述できるプログラミング言語が存在します。この意味で効率的とは、そのような言語で書かれたすべてのプログラムがの言語を表すことを意味しP
ます。Bellantoni、Niggl、Schwichtenbergがこのような言語をここで説明しています。
Cプリプロセッサは、(設計によって)完全-チューリングされていない、まだそれはまだインタプリタを実装することができます言語のさドキュメントで説明したように、完全な(オーダー言語をチューリングが、基本的には、実行の・ザです純粋に機能的なML / Schemeタイプのものを製粉し、比較的目立たない-おそらく非常に使いやすい-それが異常な実装ではない場合)
その背後にあるトリックは、有限の物理的宇宙にチューリングマシンを実装することに関する上記の引数に似ています。Cプリプロセッサは、言語に無限の数のステップまたはデータセルを提供できませんが、次のことができます。
指数関数的拡張プロセス(宇宙のmumble mumble寿命)を使用して最も現実的な問題を解決するのに十分な大きさの、不当に大きい動的数(デフォルトでは2 ^ 64程度)を提供します。
上記の数には任意の静的上限を使用します。つまり、ステップ数は有限数でなければなりませんが、インタープリターエンジンの静的設定を変更することにより、「コンパイル」時に特定の上限を変更できます。この上限の実際の値には(理論的に)制限がないため、終了プログラムのスペース要件に合わせて(理論的に)拡張できます。
Orderはそれ自体が必ずしも「有用」であるとか、CPPで実装されたエンジンはそうだとは言い切れませんが、それは興味深い概念の証明です。また、おそらく動的に型指定されていますが、これはこの分野では珍しいことです。
はい、確かにチューリング完全ではない有用な言語を持つことは可能です。こちらをご覧ください:http : //tkatchev.bitbucket.org/tab/examples.html
有用なチューリング不完全言語の別の例はSQLです。(さらに、GnumericやExcelなどのスプレッドシートもありますが、実際にはプログラミング言語ではありません。)
チューリング完全ではない言語が必要な理由については、それによりランタイムの動作についていくつかの強力な保証を行うことができるためです。
簡単に言うと、チューリングの完全性とは、再帰の能力を持っていることを意味します。再帰を持つとは、メモリ内に潜在的に無制限の構造を持つことを意味します。現実の世界ではメモリは無限ではないため、チューリングの完全性にはメモリ管理やガベージコレクションが必要です。
再帰の禁止は、リソース管理の非常に難しい問題を回避するための優れた方法です。
Nota bene!チューリングが不完全であることは、プログラムが必ず終了することを必ずしも意味しません。チューリングの不完全な言語では、無限の遅延リストを評価できます。
興味深い「サブチューリングプログラミング言語」についてはこれまで言及されていなかったため、追加します。
「クレマ」と呼ばれます。次のように自身を説明します。
Cremaは、サブチューリングコンプリートスペースでの実行を特に目的としたLLVMフロントエンドです。学習が簡単で、必要なプログラミングタスクの大部分に対して実用的であるように設計されたCremaは、プログラムの計算の複雑さをセキュリティの向上に必要な最小限に制限できます。
かなりミニマルで、かなり低レベルです。
C開発者にはなじみがあるはずです。
当初は国防高等研究計画局(DARPA)から資金提供を受けていましたが、執筆時点ではまったくメンテナンスされていないようです。しかし、おそらく誰かが興味を持っています。