質問

最も些細なプログラムを除くすべてのプログラムはバグでいっぱいであるため、それらを削除することを約束するものは非常に魅力的です。現時点では、正確な証明はコードであり、主にこれを学ぶのが難しいことであり、プログラムが正しいことを証明するために必要な余分な努力のためです。コード証明が離陸すると思いますか?

役に立ちましたか?

解決

実際にはその意味ではありませんが、このドメインでは純粋な機能プログラミングが優れています。 Haskellを使用する場合、コードがコンパイルされている場合、プログラムが正しい可能性があります。 IOを除き、優れたタイプシステムは良い助けです。

また、契約へのプログラミングが役立つ場合があります。見る Microsoftコード契約

他のヒント

最も些細なプログラムを除くすべて

合理的な努力で正しいことを完全に証明することはできません。正式な正確さの証明には、少なくとも正式な仕様が必要であり、その仕様は完全かつ正しいものでなければなりません。これは通常、ほとんどの実際のプログラムで簡単に作成できるものではありません。たとえば、このディスカッションサイトのユーザーインターフェイスのようなもののためにそのような仕様を作成してみてください。

ここで私はトピックに関する素敵な記事を見つけました:

http://www.encyclopedia.com/doc/1o11programcorrectnessproof.html

正式な証拠の問題は、問題を一歩後退させるだけであることです。

プログラムが正しいと言うことは、プログラムがすべきことをすることを言うことと同等です。プログラムが何をすべきかをどのように定義しますか?あなたはそれを指定します。また、スペックがカバーしていないエッジケースでプログラムが何をすべきかをどのように定義しますか?さて、あなたはスペックをより詳細にする必要があります。

したがって、あなたのスペックが最終的にプログラム全体のあらゆる側面の正しい動作を説明するのに十分な詳細になったとしましょう。今、あなたはあなたの証明ツールにそれを理解させる方法が必要です。したがって、スペックツールが理解できるある種の正式な言語に仕様を翻訳する必要があります...ちょっと、ちょっと待ってください!

正式な検証は長い道のりを歩んできましたが、通常、業界/広く使用されているツールが最新の研究に遅れをとっています。この方向に最近の努力があります。

仕様# http://research.microsoft.com/en-us/projects/specsharp/これは、コード契約(プレ/ポスト条件と不変)をサポートするC#の拡張であり、これらの契約を使用してさまざまなタイプの静的分析を行うことができます。

これと同様のプロジェクトは、JML for JavaやEiffelなどの他の言語には存在します。これにはほとんど組み込まれています。

さらに進むと、プロジェクト スラム爆発 最小限のプログラマー注釈/介入で特定の行動特性を検証するために使用できますが、現代言語の完全な一般性には対処することはできません(整数のオーバーフロー/ポインター算術のようなものはモデル化されていません)。

将来的には実際に使用されるこれらのテクニックの多くが見られると思います。主な障壁は、プログラムの侵略が手動注釈なしで推測するのが難しいことであり、プログラマーは通常、これらの注釈を提供することを嫌がっていることです。

大規模な開発者作業なしでコードを自動的に証明する方法が発生しない限りではありません。

いくつかの 正式な方法 ツール(例: Frama-C 重要な組み込みCソフトウェアの場合)は、特定のソフトウェアの(正確性)証明を提供する、または少なくともチェックする(並べ替え)と見なすことができます。 (FRAMA-Cプログラムが正式な仕様に従っていることを確認し、何らかの意味で、プログラムで明示的に注釈付きの不変性を尊重します)。

一部のセクターでは、そのような正式な方法が可能です。 DO-178C 民間航空機の重要なソフトウェア用。したがって、場合によっては、そのようなアプローチが可能かつ役立つことがあります。

もちろん、少ないバギーソフトウェアの開発は非常に費用がかかります。しかし、正式な方法アプローチは、ある種のソフトウェアにとって理にかなっています。あなたが悲観的である場合、バグはコードから正式な仕様に移動すると思われるかもしれません(ソフトウェアの意図した動作を正式化することは困難でエラーが発生しやすいため、いくつかの「バグ」があります)。

私はこの質問に出くわしました、そして、私はこのリンクが面白いかもしれないと思います:

Astreeの産業用途

2003年に13万行以上のコードを持つエアバスが使用するシステムにRTEがないことを証明することは、悪くないように思われます。

いいえ。これの共通のことわざは、「理論では、理論と実践は同じです。実際にはそうではありません。」

非常に簡単な例:タイプミス。

実際にユニットテストでコードを実行すると、そのようなことがほとんどすぐにわかります。まとまりのある一連のテストは、正式な証明の必要性を無効にします。すべてのユースケース - 良い、悪い、エラー、およびエッジケース - は、単体テストで列挙されるべきであり、これはコードとは別のそのような証明よりもコードが正しいことをより良い証拠として最終的に証明する必要があります。

特に要件が変更された場合、またはバグを修正するためにアルゴリズムが更新された場合 - 正式な証明は、コードコメントが頻繁に得られるのと同じように、時代遅れになる可能性が高くなります。

私は、正確性の証明に課された制限が 停止の問題 正確な証明が主流になる最大の障壁かもしれません。

それはすでに誰もが使用しています。プログラミング言語のタイプチェックを使用するたびに、基本的にプログラムの正確性の数学の証明を行っています。これはすでに非常にうまく機能します - 使用するすべての関数とデータ構造に対して正しいタイプを選択する必要があります。タイプがより正確であればあるほど、より良いチェックを取得します。プログラミング言語で利用可能な既存のタイプには、ほとんどすべての可能な動作を記述するのに十分な強力なツールが既にあります。これは、利用可能なすべての言語で機能します。 C ++と静的言語は、コンパイル時間のチェックを行っているだけで、Pythonのようなより動的な言語はプログラムが実行されたときにそれを行っています。チェックは、これらすべての言語にまだ存在します。 (たとえば、C ++は、Haskellと同じように副作用のチェックを既にサポートしていますが、使用することを選択する必要があります。)

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top