web-dev-qa-db-ja.com

エラーのないプログラムを作成する方法に関して、アランペルリスは何を意味しましたか?

Alan J. Perlis による引用があります:

エラーのないプログラムを作成するには2つの方法があります。 3つ目だけが機能します。

私は最近この引用を友人から聞いたが、その背後にあるより深い意味を理解することができなかった。

ペルリスはここで何を話しているのですか?

29
ykombinator

それは本当にnoエラーのないプログラムがあることを意味します。エラー自体でエラーを回避する方法についての深い引用はパロディです。

41
Jesse C. Slicer

番目の方法はありません。

エラーのないプログラムを作成する方法はありません

60
user2567

別の引用で答えます...

奇妙なゲーム。勝つ唯一の手はプレーしないことです。

;-)

37
Austin Salonen

他の多くの答えがすでに指摘しているように、エラーのないプログラムを書く方法はありません

しかし、私が指摘したいのは、クオートの潜在的なメタの性質です。これは本質的に範囲外のエラーです。最初のステートメントでは、2つの可能性または要素のみを持つ宇宙または「リスト」を定義しています。しかし、2番目のステートメントでは、彼は3番目を参照しています。ばかげている!違法です! 2つの要素の境界が指定された3番目の要素は、それ自体がエラーです。

引用はそれが言及しているまさにその本質を示すことができるという点で本当に深い。

14
Mark Canlas

エラーのないプログラムを作成することも、重要なプログラムを作成し、それらが正しいことを証明することもできます。たとえば、これが行われるCoq、Epigram、Agdaなどの言語を考えてみます。

停止の問題 は、一般的なプログラムに対してこれを行うことができないことを示しています。

5
Tony Morris

これは、すべての重要なプログラムにバグがあることを意味します。エラーのないプログラムを書く方法はないと言うのはおかしい方法です。

5
dsimcha

これは私が見たオタクシャツを思い出させます。世界には10種類の人がいます。バイナリーを知っている人と知らない人。

また、リストのインデックスが0になることもあるという事実の戯れかもしれません。 $ var = array( 'First'、 'Second'、 'Third');そして、次のようにこのリストにアクセスできます:$ var [0] = 'First' $ var [1] = 'Second' $ var [2] = 'Third'

したがって、リテラル配列インデックス2は「3番目」のインデックスを指します。

3
jsjoy

これは既に別の言葉で説明されていますが、私が思うほど明確ではありません。それは単に両方の方法を試すことを意味し、それらにはエラーがあり、最後にバグを修正してエラーのないプログラムを作成します。別の引用と比較してください:

プログラムでエラーが発生する唯一の方法は、作成者がそこに置くことです。他のメカニズムは知られていない。プログラムは、他のバグのあるプログラムと一緒に座ってバグを取得することはできません。 -ハーランミルズ

(あるいは、ピエールが言ったようにこれを読むことができます(これはストレッチだと思います)(ドメインに存在しない3番目の方法は機能します)。

2
Mark C

技術的に言えば、エラーのない重要なプログラムを作成できると思いますが、停止問題のため、エラーのないことを証明することは不可能です。したがって、他の方法で証明することは不可能であるため、すべてのプログラムにバグがあるという前提の下で作業する必要があります。

http://en.wikipedia.org/wiki/Halting_problem

更新:特定のアルゴリズムが正しい答えを返すことを証明できますが、それが完全に正しいことを証明することとは異なります。 http://en.wikipedia.org/wiki/Correctness_(computer_science

しかし、私の主張は、引用はプログラムには常にバグがあると仮定しなければならないという事実を参照し、なぜそうなるのかを説明しようとしているということです。 http://en.wikipedia.org/wiki/Software_bug#Bug_management

1
Booji Boy

これは私の言い訳をするときに父が私に言うために使用する同じ引用です。 「物語には3つの側面があります。彼らの側面、あなたの側面、そして正しい/真の/正しい側面」のように言い回される傾向があります。

これを開発(および教授によるソフトウェアテスター)のコンテキストに当てはめると、何かをコーディングする方法は非常に多くあるため、「コーディングには3つの側面があります。コード、コード、およびリファクタリングされたコード。」

これは、プログラマ/開発者が製品が安定するまでリファクタリングする傾向があるためだと思います。ほとんどの場合、手遅れですが、ほとんどの場合、リファクタリングはあなたやバディが最初はうまくいかなかったことを改善するために行われます。

お役に立てれば。

1
NJK