チューリング完全ではない「有用な」プログラミング言語を持つことは実際に可能ですか?


37

言語がチューリング完全でなくてはならないことが受け入れられている場合、チューリング完全ではない「有用な」プログラミング言語を持つことは実際に可能ですか?

これは、マークアップ言語やクエリ言語ではなく、伝統的な意味での「プログラミング」言語に関するものであることを明確にする必要があります。


3
@PhonicUK SQLは最初は完全ではありませんでした
Ryathal

4
@Ryathal SQLはプログラミング言語ではなく、クエリ言語です。
ヤニス

2
@PhonicUKあなたのコメントの質問は実際に価値があります、投稿された質問をそれに変更するか、建設的ではないとして閉じられます。実際に有用な非チューリング完全言語があり、それらの詳細を聞いてみたいと思います。
ジミー・ホッファ

5
正規表現は完全なチューリングではありませんが、広く使用されています
ラチェットフリーク

3
@DavidHammen実際の実装は限られています。はい、私たちの物理的宇宙の制限のためです(有限のメモリしか構築できず、誤動作するまで限られた時間しかマシンを実行できません)。しかし、それは言語が制限されているという意味ではありません。IOWのチューリング完全言語の仕様で、プログラムにこのような制限を課す実装は必要ありませんが、非TC言語では、たとえば終了の証明が必要です。

回答:


48

CoqAgdaHOLおよびACL2は、チューリング完全ではありませんが、非常に便利で非常に強力な言語です。

それらをチューリング完全でないものにする一般的な機能は、終了を常に証明できるという事実です。非常に単純な制限で十分です:再帰呼び出しは、構造的に証明可能なより小さな用語でのみ許可されます。したがって、チューリング完全言語または言語自体のためのインタプリタを実装することはできませんが、認定されたCコンパイラのような他の多くの有用なことがまだ可能です。


2
これらの言語に精通していない人のために、チューリングを完全ではないものにするために不足しているもの、およびそれらの言語で構築されたもののいくつかの例についてさらに詳しく説明してもらえますか?
PhonicUK

8
@PhonicUK:CコンパイラはC実装ではありません。これは、ある言語(C)のコードを別の言語(通常はマシンコード)に変換するツールです。これは、Cコンパイラ自体がランダムなCプログラムと同等であることを意味するものではありませ
ヨアヒムザウアー

9
@PhonicUK、チューリング完全言語のインタープリターを非チューリング完全言語に実装することはできません。もちろん、コンパイラを実装することもできます(チューリング完全なCPUが実際の評価を行うため)。
SKロジック

11
@ SK-logic:「もちろん?」それはかなり単純な言語だからです。コンパイラーはテンプレートコードを解釈する必要があるため、C ++では不可能です(コンパイル時にチューリング完全です)。
–MSalters

11
@MSaltersはい、言語のコンパイルが完了している場合は、そのためのコンパイラを完全な言語で作成する必要があります。これもまた明らかです(トートロジーとは言いません)。ただし、C ++標準では、テンプレートのインスタンス化の最大評価深度など、入力プログラムの制限が許可されていることに注意してください(既存の実装ではこの自由度が必要です)。私が間違っていない場合、これはチューリングではない完全なC ++コンパイラが可能である可能性があることを意味します(もちろん、無関係な問題がなければ)。

12

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の一般化された形式ではおそらく集計を指定しない集計を使用して大量の計算を実行できるためです。


8

SQLはビジネスタイプの間で非常に人気があることを理解しています


3
SQLはクエリ言語であり、プログラミング言語ではありません。
PhonicUK

4
@PhonicUK:クエリ言語とプログラミング言語の違いは何ですか?
ヨアヒムザウアー

8
@PhonicUK -テックスは、テキストマークアップ言語であり、それはチューリング完全だ
マーティン・ベケット

3
私の知る限り、最新のSQL実装は完全に調整されています。
-shabunc

6
@shabunc IIRCは、ストアドプロシージャでのみ使用できます。したがって、すべての「プログラミング」言語はTCある- arguementはそれはチューリング完全ではない場合、それはプログラミング言語ではありません、円形ビットを取得している
マーティンベケット

5

言語を汎用言語として使用するには、チューリングの完全性が必要です。しかし、それは十分ではありません。つまり、チューリング完全であるという理由だけで、すべての問題領域に適しているわけではありません。

  • ホワイトスペースはチューリング完全であることが証明されていますが、プログラマの娯楽以外の問題領域には明らかに不適切です。
  • C ++テンプレートは、Turingが完全であることが証明されていますが、それでもプログラムでプログラム全体を記述することはありません。

逆に、DSLは、チューリングの完全性がなくても、実際に適切に設計されていると想定して、設計対象の問題領域に適しています。

  • HTML *は、DOMツリーを簡潔に記述する方法を提供します。JavaScriptはチューリング完全であり、同じことを行うために使用できますが、はるかにノイズが多く不明瞭です
  • XPathおよび他のクエリ言語、埋め込みコードのないPCREなどはすべて、設計された単一のジョブのための強力なツールです。

* IIRCは、CSSアニメーションを使用したHTMLを使用して、ConwayのGame of Lifeを一連のチェックボックスに実装することで、チューリング完全であることを証明しました。ただし、HTMLの有用性は、CSSアニメーションをサポートしていないブラウザーでも保持されます。


2
CSSに実装されたConwayのLifeへのリンクはありますか?
RBerteig

CSSのCGOL実装については知りませんが、Rule 110が実装されたことは知っています。見つけられないようですが、移動されたようです。
クリスチャン・マン


-1非常に興味深いが、質問に答えていません
-mattnz

2
@mattnz:間違っています。有用なチューリング完全ではない言語の具体例を挙げます。これは、「チューリング完全ではない「有用な」プログラミング言語を実際に持つことは可能ですか?」に対する適切な回答であると思います。
back2dos

3

実際には、「効率的な」プログラムのみを記述できるプログラミング言語が存在します。この意味で効率的とは、そのような言語で書かれたすべてのプログラムがの言語を表すことを意味しPます。Bellantoni、Niggl、Schwichtenbergがこのような言語をここで説明しています


1

Cプリプロセッサは、(設計によって)完全-チューリングされていない、まだそれはまだインタプリタを実装することができます言語のドキュメントで説明したように、完全な(オーダー言語をチューリングが、基本的には、実行の・ザです純粋に機能的なML / Schemeタイプのものを製粉し、比較的目立たない-おそらく非常に使いやすい-それが異常な実装ではない場合)

その背後にあるトリックは、有限の物理的宇宙にチューリングマシンを実装することに関する上記の引数に似ています。Cプリプロセッサは、言語に無限の数のステップまたはデータセルを提供できませんが、次のことができます。

  1. 指数関数的拡張プロセス(宇宙のmumble mumble寿命)を使用して最も現実的な問題を解決するのに十分な大きさの不当に大きい動的数(デフォルトでは2 ^ 64程度)を提供します。

  2. 上記の数には任意の静的上限を使用します。つまり、ステップ数は有限数でなければなりませんが、インタープリターエンジンの静的設定を変更することにより、「コンパイル」時に特定の上限を変更できます。この上限の実際の値には(理論的に)制限がないため終了プログラムのスペース要件に合わせて(理論的に)拡張できます。

Orderはそれ自体が必ずしも「有用」であるとか、CPPで実装されたエンジンはそうだとは言い切れませんが、それは興味深い概念の証明です。また、おそらく動的に型指定されてますが、これはこの分野では珍しいことです。


講義の途中でつぶやくための賛成票。
jpaugh

-1

はい、確かにチューリング完全ではない有用な言語を持つことは可能です。こちらをご覧ください:http : //tkatchev.bitbucket.org/tab/examples.html

有用なチューリング不完全言語の別の例はSQLです。(さらに、GnumericやExcelなどのスプレッドシートもありますが、実際にはプログラミング言語ではありません。)

チューリング完全ではない言語が必要な理由については、それによりランタイムの動作についていくつかの強力な保証を行うことができるためです。

簡単に言うと、チューリングの完全性とは、再帰の能力を持っていることを意味します。再帰を持つとは、メモリ内に潜在的に無制限の構造を持つことを意味します。現実の世界ではメモリは無限ではないため、チューリングの完全性にはメモリ管理やガベージコレクションが必要です。

再帰の禁止は、リソース管理の非常に難しい問題を回避するための優れた方法です。

Nota bene!チューリングが不完全であることは、プログラムが必ず終了することを必ずしも意味しません。チューリングの不完全な言語では、無限の遅延リストを評価できます。


-1

興味深い「サブチューリングプログラミング言語」についてはこれまで言及されていなかったため、追加します。

「クレマ」と呼ばれます。次のように自身を説明します。

Cremaは、サブチューリングコンプリートスペースでの実行を特に目的としたLLVMフロントエンドです。学習が簡単で、必要なプログラミングタスクの大部分に対して実用的であるように設計されたCremaは、プログラムの計算の複雑さをセキュリティの向上に必要な最小限に制限できます。

かなりミニマルで、かなり低レベルです。

C開発者にはなじみがあるはずです。

当初は国防高等研究計画局(DARPA)から資金提供を受けていましたが、執筆時点ではまったくメンテナンスされていないようです。しかし、おそらく誰かが興味を持っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.