アランJ.ペルリスによる次のような引用があります。
エラーのないプログラムを作成するには2つの方法があります。3番目のものだけが機能します。
私は最近友人からこの引用を聞いたが、その背後にあるより深い意味を理解することができなかった。
ここでPerlisは何について話しているのですか?
アランJ.ペルリスによる次のような引用があります。
エラーのないプログラムを作成するには2つの方法があります。3番目のものだけが機能します。
私は最近友人からこの引用を聞いたが、その背後にあるより深い意味を理解することができなかった。
ここでPerlisは何について話しているのですか?
回答:
第三の方法はありません。
エラーのないプログラムを書く方法はありません
他の多くの回答がすでに指摘しているように、エラーのないプログラムを作成する方法はありません。
しかし、私が指摘したいのは、引用の潜在的なメタの性質です。これは本質的に範囲外のエラーです。最初のステートメントでは、彼は2つの可能性または要素のみを持つ宇宙または「リスト」を定義しています。しかし、2番目のステートメントでは、彼は3番目のステートメントを参照しています。それはばかげている!違法でも!2要素の境界が指定されている3番目の要素自体はエラーです。
引用がそれが参照しているまさにその本質を示すことができるという点で、本当に深い。
エラーのないプログラムを作成し、重要なプログラムであっても、それが正しいことを証明することができます。たとえば、Coq、Epigram、Agdaなどの言語では、これが行われています。
停止問題は、それがためにこれを行うことは可能ではないと述べている一般的なプログラム。
これは、父が言い訳をするときに私に伝えるのに使う同じ引用です。「物語には3つの側面があります。彼らの側、あなたの側、そして正しい/本当の/正しい側」ということわざがあります。
これを開発のコンテキスト(および教授によるソフトウェアテスター)に入れると、何かをコーディングする方法が非常に多いため、「コーディングには3つの側面があります。あなたのコード、彼らのコード、リファクタリングされたコード。」
これは、プログラマ/開発者が製品が安定するとリファクタリングする傾向があるためだと思いますが、ほとんどの場合は遅すぎますが、ほとんどの場合、リファクタリングはあなたとバディが最初はそれほどうまくいかなかった何かを改善するために行われます。
お役に立てれば。
技術的に言えば、エラーのない非自明なプログラムを作成できると思いますが、停止問題のためにエラーがないことを証明することは不可能です。したがって、他の方法で証明することは不可能であるため、すべてのプログラムにバグがあるという仮定の下で作業する必要があります。
http://en.wikipedia.org/wiki/Halting_problem
更新:特定のアルゴリズムが正しい答えを返すことを証明できますが、それが完全に正しいことを証明するのと同じことではありません。 http://en.wikipedia.org/wiki/Correctness_(computer_science)
しかし、私のポイントは、引用はプログラムには常にバグがあると仮定しなければならないという事実に言及しており、なぜそうなのかを説明しようとしているということでした。 http://en.wikipedia.org/wiki/Software_bug#Bug_management
追加の洞察として、「2つの方法」はトニー・ホアによるこの引用への参照かもしれません:
ソフトウェア設計を構築するには、2つの方法があります。1つは、単純に欠陥をなくすことであり、もう1つは、明白に欠陥がないように複雑にすることです。最初の方法ははるかに困難です。自然の複雑な現象の根底にある単純な物理法則の発見と同じスキル、献身、洞察、さらにはインスピレーションさえ必要です。
そのことについて少し考えてみてください。彼が同じことを言っているのがわかるでしょう。もしあなたのソフトウェアが自明でないなら、バグがあります(しかし、それを十分に複雑にし、明らかなバグではありません)。