エラーのないプログラムを書く方法に関して、アラン・ペルリスは何を意味しましたか?[閉まっている]


29

アランJ.ペルリスによる次のような引用があります。

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

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

ここでPerlisは何について話しているのですか?


1
このパロディの誤fallも認識します。エラーのない自明ではないプログラムを作成することは可能であるため、規律が必要です。


回答:



60

第三の方法はありません。

エラーのないプログラムを書く方法はありません



14

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

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

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


プログラムが指定どおりに動作することを証明する方法があります。それは、例えば原子力施設に使用されます

1
@ThorbjørnRavn Andersenは、指定されているように、エラーがないことを意味しません。
CaffGeek

5

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


5

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

停止問題は、それがためにこれを行うことは可能ではないと述べている一般的なプログラム


UTオースティンのドングッドのチームに戻り、1970年代および1980年代初頭のジプシー検証環境での彼らの仕事に戻ります。彼らは、実績のあるエラーのないメッセージフローモジュレーターを海軍に提供することにより、エラーのないコードが可能であることを実証しました。受け入れテストスイートは、まったく異なるグループによって開発されました。MFMは、受け入れテストで受け入れテストスイートを初めて見たとき、偏差、免除、または「はい」で合格しました。
ジョンR.ストローム

3

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

また、リストにインデックスが付けられていない場合があるという事実も考えられます。$ var = array( 'First'、 'Second'、 'Third'); このリストには次のようにアクセスできます:$ var [0] = 'First' $ var [1] = 'Second' $ var [2] = 'Third'

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


...およびゼロからインデックス作成を開始する

2

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

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

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


1

これは、父が言い訳をするときに私に伝えるのに使う同じ引用です。「物語には3つの側面があります。彼らの側、あなたの側、そして正しい/本当の/正しい側」ということわざがあります。

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

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

お役に立てれば。


1

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

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
トニー・モリスが言ったように、特定のプログラムが正しいことを証明することは可能です。できるプログラム書き込むことはできませんで、一般的なことを証明する任意の正しいプログラムは、正しいことを。
マックスストリーニ

-1

追加の洞察として、「2つの方法」はトニー・ホアによるこの引用への参照かもしれません:

ソフトウェア設計を構築するには、2つの方法があります。1つは、単純に欠陥をなくすことであり、もう1つは、明白に欠陥がないように複雑にすることです。最初の方法ははるかに困難です。自然の複雑な現象の根底にある単純な物理法則の発見と同じスキル、献身、洞察、さらにはインスピレーションさえ必要です。

そのことについて少し考えてみてください。彼が同じことを言っているのがわかるでしょう。もしあなたのソフトウェアが自明でないなら、バグがあります(しかし、それを十分に複雑にし、明らかなバグではありません)。


質問に答えていない、これは尋ねた
ブヨ

@gnat私はそれがどのように見えないのかわかりません-2番目のパラグラフにあります。言葉遣いは明確ではなかったかもしれませんが、「同じことを言う」と言ったとき、「アラン・ペルリスと同じことを言う」ことを意味していました。つまり、Perlisの引用はおそらくHoareのユーモラスなパロディです。
ドーバル14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.