チューリング完全性以外のパワーの測定


18

私はもともとStackOverflowでこれを尋ねようとしましたが、あまりにも主観的でした:-(。プログラミング言語の能力を定義する方法に興味があります。チューリング完全性は1つですが、ほぼ普遍的に満足しています。たとえば、アセンブリとJavaを区別する非主観的な方法を提案できる人はいますか?

チューリングの完全性とは、言語が最大限に強力に出力できることを意味します(これは、実世界で非時間ベースのすべてを実行できることを意味します)。したがって、より強力なパワーの尺度を定義する場合は、別のアプローチをとる必要があります。元の質問では短さが示唆されましたが、これを定義するのは簡単ではありません。誰か他の提案がありますか?

回答:


24

あなたが探している概念は表現力と呼ばれ、マティアス・フェライゼンは数学的に厳密な定義を持っています:

プログラミング言語の表現力について

www.ccs.neu.edu/scheme/pubs/scp91-felleisen.ps.gz(Postscriptバージョン)

アイデアの背後にある直観は、2つの異なる言語(たとえば、言語XのプログラムAと言語YのプログラムB)の2つの同等のプログラムがあり、Bにグローバルな変更を必要とするAにローカルな変更を加える場合、XはYよりも表現力があります。

Felleisenが提供する1つの例は割り当てです。Schemeプログラミング言語では、割り当て演算子を削除してもチューリング完全言語を使用できます。ただし、このような制限された言語では、割り当てが許可された場合にローカライズされる機能を追加するには、割り当てなしでプログラムをグローバルに変更する必要があります。

私の議論はいくつかの詳細を単純化したので、完全な説明については論文自体を読むべきです。

他の質問に答えるには、Javaクラスに新しいクラスを追加できるため、Javaはアセンブリよりも表現力が高いと言うことができます。そして、プログラムの他の部分にグローバルな変更を加えずにメソッドを呼び出すことで、ポリモーフィズムの利点を得ることができます。例外処理は、Javaがアセンブリよりも表現力が高いもう1つの例throwです。スタックを上に制御を移すには、1つのステートメントを記述するだけです。より基本的なレベルでcaseは、aの先頭近くに新しいステートメントを追加することもできswitchます。手動でジャンプオフセットを再計算することを心配する必要はありません。


どうもありがとうございました!これはまさに私が探していたものです!
Casebash

6

私があなたの質問を正しく理解していれば、それでもあなたは主観的な判断の呼び出しではなく、比較的測定可能なものを探しています。もしそうなら、特定の問題を解決するのにかかる時間の長さを個人的に支持します(すべての問題とすべてのプログラマーの平均)。この方法では、言語自体だけでなく、言語で使用されるフレームワーク/ APIも考慮する必要があります。簡潔な構文は非常に小さな要素です。最も重要なことは、最も一般的に必要な機能に簡単にアクセスできることです。

もっと主観的なものを探しているなら、それがどれだけ楽しいかと言います。プログラマーは問題を解決したい人が多いため、プログラマーが楽しく使用できるプログラミング言語が、ほとんどの問題を解決するものになることは避けられません。この方法は、人によって物事の使い方が異なることを考慮しているため、「最良の」プログラミング言語は、最も幅広いプログラマーにとって最も魅力的なものになります。ただし、ここではプログラミング言語とAPIだけでなく、環境(IDE)も考慮する必要があるかもしれません。これはもちろんプログラマーが実際にやり取りするものです。


所要時間の測定も主観的だと思います。どのプログラマーが時間がかかりましたか?同じプログラマーで両方の言語の時間をテストした場合、彼はどの言語をよりよく知っていましたか?これに対処する統計的な方法がありますが、一人でそれを行うことはできません。
ジョンフィッシャー

1
@John:何かが統計的にしか分析できないからといって、それが主観的であることを意味するわけではありません。
デビッドソーンリー

@デビッド:それは本当に私のポイントではありませんでした。重要なのは、既存の研究がなければ、質問者は自分が関心を持っている言語の「力」を比較することができず、大規模なグループで統計的に分析しないと主観的だということです。
ジョンフィッシャー

1

私はあなたがどれだけ生産的になるかによって、その言語がどれほど強力かを定義します。多くの人は、コードをすばやく書くという点で生産性について話す傾向がありますが、プログラムのライフサイクルの大部分は開発ではなくメンテナンスであるため、特に誰かが書いた場合、コードをどれだけ簡単にデバッグできるかがより良い尺度ですそうしないと。最も強力な言語は、読みやすく保守しやすい言語です。


2
これの難しさは、言語を知っていると、その言語を知っている人が簡単になることです。したがって、この尺度は主観的になります。
ジョンフィッシャー

1

用語をより適切に定義する必要があります。

チューリングの完全性は、おそらくあなたが意味する意味での「力」に関するものではありません。むしろ、それは計算可能性に関するものです。つまり、特定の言語がチューリングマシンを使用して実装できるプログラムを表現できるかどうか。ほぼすべてのプログラミング言語がチューリング完全であることがわかりました。

あなたがおそらく望んでいるのは、プログラミング言語の「表現力」と呼ばれるものの尺度です。そのような対策が存在するかどうか、または存在するかどうか、それが有用かどうかはわかりません。基本的に、さまざまなプログラミング言語は、さまざまなタイプの問題の解決策を表現するのに適しています。

編集

簡単に言うと、プログラミング言語には「パワー」と呼ばれる特性がありません。プログラミング言語の「表現力」または「表現力」として一般に知られている概念があります。表現力は、特定の問題に対処するための簡潔なプログラムを書くのがいかに簡単かということの一部です。しかし、プログラムの読み取りと書き込みがどれだけ簡単かについてもかなりの尺度があります。それは一種の「美」のようなものです。見たときにわかりますが、定義を求めないでください。

文字数を単に比較するだけでは、表現力の適切な尺度が得られません。そうでなければ、ソースコードを圧縮することで言語をより表現力豊かにすることができます...そしてそれはナンセンスです。実際、私は表現力の客観的な尺度を知りませんし、何も存在しないと強く疑います。これにより、特性が事実上役に立たなくなり、かなり面白くなくなります。


1
チューリングの完全性は計算可能性に関することを知っています。有限状態マシンなど、計算可能性の尺度に関するより低い尺度が存在することがわかっています。チューリング完全に計算可能性の面で最大限に強力であるようしかし、我々は、この上のパワーのレベルを定義するために計算可能性を使用することはできません
Casebash

@Casebash-あなたはまだ「パワー」とは何も言っていません。
スティーブンC

2
それは私が知らないからであり、それがこの質問の要点です!
ケースバッシュ

それでは、答えのポイントは何ですか?コメントだったはずです。
reinierpost

@reinerpost- 私の答えのポイントは質問が無意味であることとその理由を詳細に説明することです。基本的に、質問は「「表現力」と呼ばれるものがあります。それが何であるかわかりませんが、それを測定する方法を教えてください。」 そして、私の答えの核心は、「表現力」が不明確な概念/特性であり、明確に測定/定量可能なものではないということです。(そして、それは明らかに回答であり、コメントではありません。おそらく、あなたは単に私が言おうとしていることを理解できなかったのでしょうか?)
スティーブンC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.