実装なしでプログラミング言語を指定できますか?


11

実装が存在しない可能性のあるプログラミング言語を指定することは理論的に可能ですか?プログラミング言語は、関数を定義する方法です。実装とは、特定の入力でプログラムに対応する関数の出力への特定の入力で、その言語で特定のプログラムを実行するメソッドを意味します。

そのような言語の最小要件は何ですか?


3
言語の「実装」とは何ですか?
ラファエル

@Raphael:「プログラミング言語」を「言語」に変更したのはあなたです。編集する前に、言語の実装が何を意味するのかは明らかでした。
伊藤剛

@TsuyoshiIto:よくわかりません。私はタイトルをcstheory.SEで変更された質問と一致するように変更しました。元に戻しましたが、それが何を意味するのかはまだはっきりしていません。コンパイラ?通訳者?とにかく、ここでほぼ1年前の質問を移行し、ユーザーが質問に再度アクセスしたことがないようである場合でも、よくても不適切なアドバイスしかありませんでした。
ラファエル

@Raphael:「言語の実装とは何ですか?」手がかりをすべて取り除いた後は、私の理解を超えていました。しかし、質問は当初から不明確であったことに同意します。
伊藤剛

「プログラミング言語」のあなたの推定上の定義は、誤解されていると思います。「関数」を「計算可能な関数」に置き換えることで、少なくとも修正する必要があります。それ以外の場合、その言語を「プログラミング言語」と呼ぶことを選択する理由は明らかではありません。修正すると、そのような「実装が存在しないプログラミング言語」がないため、質問は意味がなくなります。
Uday Reddy

回答:


7

通常、プログラミング言語の実装は、少なくともチューリング完全な言語のインタープリター(または言語のコンパイラー)を提供します。

この「定義」を使用して、次のようなプログラミング言語を指定できます。

  • 可能なプログラムは1つだけですHALT

  • 仕様HALT停止問題を解決する機能です。

このプログラミング言語を実装するには、実装に関する停止問題を解決する必要があります。(私たちの実装はチューリングマシンよりも強力であってはならないので、これは不可能です)。

仕様はロジックを処理するため、さらに多くのことを要求できます。実装できない別の仕様は「false」です。(または仕様の矛盾する文)しかし、これは仕様のようには感じられないため、停止問題の例を使用しました。


1
一般化:決定不可能な問題を解決する関数を指定する言語は実装できません。
edA-qa mort-ora-y 2012

@ edA-qamort-ora-y技術的には実装できます。停止問題を決定することはできませんが、TMは別のマシンをシミュレートして、そのマシンが停止した場合にそれを受け入れることができます。このようTMによって受け入れられた言語がある正確に停止そのマシン(のエンコーディング)の言語。しかし実際には、プログラミング言語のプリミティブな操作が終了することが保証されているのが普通です。(少なくとも「賢明な」入力に関して)
Ben

1
O()

1/0 let loop = loop in loopΩ()

3

奇妙なことに注意してください:C ++テンプレートエンジンはチューリング完全です

定理1: インスタンス化の境界がない場合、C ++テンプレートはチューリング完全です。

結果1: インスタンス化の制限がない場合、特定のプログラムのコンパイル時にC ++コンパイラーが停止するかどうかは決定できません。

...したがって、C ++自体は、「実装」が存在しないプログラミング言語と考えることができます... :-D


それで、生成されたコードではなく単に生成された診断について気にしない場合、Cの「コンパイラ」をインタープリタとして使用できますか?
スーパーキャット2014年

はい、論文に示されているように、コンパイラは、チューリングマシン(およびその最終的なテープ構成)の計算履歴と一致するエラーのリストで停止します。明らかに、入力をインタラクティブにすることはできません(コンパイラを実行する前に、ソースコードでエンコードする必要があります)。
Vor

2

「プログラミング言語」と「言語の実装」が何を意味するのかは不明です。答えを得るためには、これら2つの厳密な定義を提供する必要があります。

Σ2Σ

MM0

しかし、これは「プログラミング言語」という言葉を使うときに人々が意味するような仕様言語ではありません。プログラミング言語は、典型的には計算機能を発現させる(プロセス、...)と、機械に命令を通信し、従って、これらのプログラム及び出力それらの結果をシミュレートすることができるTMが存在する言語であることを意味します。したがって、実装できないプログラミング言語があるという意味では意味がありません。

(おそらく、プログラミング言語仕様言語または正式言語と混同していると思います。いずれにせよ、計算できない言語を定義することができます。)


「プログラミング言語」とは、私たちが普段話しているようなプログラミング言語を意味し、「言語の実装」とは、実際のコンピューター上でその言語でプログラムを実行するための環境を意味します。質問は形式化されていませんが、確かに不明確ではありませんか?新しいプログラミング言語の仕様は、実装する手間をかけずに簡単に作成できます。問題は、その言語実装できないような方法でそれが可能かどうかを単に尋ねることです。
Ben

@ベン、cstheoryの元の質問を見ると、タイトルにのみ質問のプログラミングという単語がないことがわかります。OPによって投稿された質問は明確です。PS:プログラミング言語とは何かの厳密な(正式である必要はない)定義に興味があります。直感と例だけに基づいたプログラミング言語についての否定的な結果を証明することはできません。定義の参照がある場合は、質問の編集またはコメントとして投稿してください。
Kaveh

十分に公平ですが、SEは9時間前に回答したと主張していますが、移行および編集されてからかなり時間が経っています。とにかく、私はまだ元の質問に基づいて同じ解釈をするでしょう。プログラミング言語の定義に関して言えば、明白なように見えるのは、正式な文法に加えて、他のよく理解された計算モデル(ラムダ計算、チューリングマシンなど)への縮約、または厳密な操作セマンティクスのいずれかです。還元モデルはこの質問への答えを自明な「いいえ」にするでしょう。
ベン

1

実装なしで指定された言語はたくさんあります。たとえば、Algol 60はアルゴリズムを作成するための言語であり、実装されないはずでした。多くの「楽しみのための」言語のいくつかは、実装が実現するずっと前に指定されていた、Intercalが思い浮かびます。

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