ソフトウェアエンジニアとして、私は工業製品用のコードをたくさん書いています。クラス、スレッド、いくつかの設計作業だけでなく、パフォーマンスの妥協点もある比較的複雑なもの。私は多くのテストを行っていますが、テストにうんざりしているので、Coq、Isabelleなどの正式な証明ツールに興味を持ちました…これらのいずれかを使用して、コードにバグがなく、実行できることを正式に証明できますか?それと? -しかし、これらのツールの1つをチェックするたびに、日常のソフトウェアエンジニアリングに使用できると確信せずに立ち去ります。さて、それは私だけかもしれません、そして私はそれについてのポインタ/意見/アイデアを探しています:-)

具体的には、これらのツールの1つを私のために機能させるには巨大なものが必要だという印象を受けます検討中のプログラムのオブジェクト、メソッド…を証明者に適切に定義するための投資。次に、処理する必要のあるすべてのサイズを考えると、証明者が単に蒸気を使い果たしてしまうのではないかと思います。あるいは、副作用を取り除く必要があるかもしれません(これらの証明者ツールは宣言型言語で本当にうまくいくようです) )、そしてそれはそれが十分に速くないか小さいので使用できない「証明されたコード」になるのではないかと思います。また、私は使用する言語を変更する余裕がありません。 JavaまたはC ++:コードの正しさを証明できる唯一の言語であるため、これからOXXXmlでコーディングすることを上司に伝えることはできません…

正式な証明ツールの経験が豊富な人はコメントできますか?繰り返しになりますが、正式な証明ツールを使用するのは LOVE です。すばらしいと思いますが、象牙の塔にいるような印象を持っています。 「Java / C ++の低い溝から到達しない…(PS:私も LOVE Haskell、OCaml …誤解しないでください:私は宣言型言語と正式な言語のファンです証明、私はただ試していますこれをソフトウェアエンジニアリングに実際に役立てる方法を確認するために)

更新:これはかなり広いので、次のより具体的な質問を試してみましょう:1)証明者を使用して正確さを証明する例はありますか産業用Java / C ++プログラムの2)Coqはそのタスクに適していますか? 3)Coqが適切な場合、最初にCoqでプログラムを記述してから、CoqからC ++ / Javaを生成する必要がありますか? 4)このアプローチは、スレッド化とパフォーマンスの最適化を処理できますか?

コメント

  • 問題が発生したことを理解しましたが、’この質問の内容がわかりません後です(SE投稿として)。討論?経験?どちらもSEには適していません。 “何ができますか?”のトーンは、これも広すぎる質問だと感じさせます。
  • なるほど…この質問が明確に定式化されていないことに同意します。したがって、’に次のように言わせてください。1)産業用Java / C ++プログラムの正当性を証明するために証明者を使用する例はありますか? 2)Coqはそのタスクに適していますか? 3)Coqが適切な場合、最初にCoqでプログラムを作成してから、CoqにC ++ / Javaを生成させる必要がありますか? 4)このアプローチは、スレッド化とパフォーマンスの最適化に対応できますか?
  • つまり、’の4つの質問です。 1)ここで(多くの)業界の専門家に出くわす可能性は低いため、ソフトウェアエンジニアリングの方がおそらく良いでしょう。 2)やや主観的な味ですが、客観的な視点を提供できる人がここにいる可能性があります。 3)私が知る限り、完全に主観的です。 4)このサイトにとっていい質問です。要約:質問を分けて、最初にソフトウェアエンジニアリングにアクセスし、前にここ(!)で客観的な(!)答えを期待できるかどうかをよく考えてください。投稿2)。
  • あなたは’フォーマル検証の夢について説明していますが、’は遠く離れています。そこにいます。 AFAIK、プログラム検証は非定型タスクであり、非常に単純なプログラムにのみ適用されます。とは言うものの、この質問はサイトにぴったりだと思います。その地域の誰かが自分の分野の限界を認め、最先端と限界を説明してくれれば幸いです(おそらくいくつかの調査にリンクすることによって) 。
  • C ++プログラムの検証に関する問題は、C ++が明確に定義された言語ではないことです。ソフトウェアシステムの多くの部分(OS、ライブラリ、プログラミング言語)が実際に再設計されて検証がサポートされるまで、大規模な検証は不可能だと思います。よく知られているように、誰かに200000行のコードをダンプして、” verify!”と言うことはできません。一緒にコードを検証して記述する必要があります。また、プログラミングの習慣を、’も検証しているという事実に適合させる必要があります。

回答

いくつかの質問に簡潔に回答しようと思います。これは厳密には私の研究分野ではないため、一部の情報が古くなっている/正しくない可能性があることに注意してください。

  1. プロパティを正式に証明するために特別に設計されたツールが多数あります。 JavaとC ++の。

    ただし、ここで少し余談をする必要があります。プログラムの正当性を証明するとはどういう意味ですか? Java型チェッカーは、Javaプログラムの正式なプロパティを証明します。つまり、floatintの追加などの特定のエラーは決して発生しません。発生する!プログラムが望ましくない状態になることは決してない、または特定の関数の出力が特定の数学的仕様に準拠しているという、はるかに強力なプロパティに関心があると思います。つまり、単純なセキュリティプロパティから、プログラムが詳細な仕様を満たしていることの完全な証明まで、「プログラムが正しいことを証明する」とは、さまざまな意味があります。

    ここで、次のことを想定します。プログラムに関する強力なプロパティを証明することに関心があります。セキュリティプロパティに関心がある場合(プログラムが特定の状態に到達できない )、一般的にはモデル検査。ただし、Javaプログラムの動作を完全に指定する場合は、その言語の仕様言語( JML 。たとえば、 ACSL など、Cプログラムの動作を指定するための言語がありますが、私にはわかりません。 C ++。

  2. 仕様を取得したら、プログラムがその仕様に準拠していることを証明する必要があります。

    このためには、両方の正式な理解妥当性定理を表現するための、仕様と言語(JavaまたはC ++)の操作的意味論、つまり実行プログラムのは仕様を尊重します。

    このツールを使用すると、その定理の証明を定式化または生成することもできます。現在、これらのタスク(指定と証明)はどちらも非常に難しいため、多くの場合、2つに分けられます。

    • コード、仕様を解析し、妥当性定理を生成する1つのツール。フランクが述べたように、クラカトアはそのようなツールの例です。

    • 定理を証明する1つのツール( s)、自動的またはインタラクティブに。 Coqはこの方法でKrakatoaと対話し、 Z3 のような強力な自動化ツールもいくつか使用できます。

    1つの(マイナーな)ポイント:自動化された方法で証明するには難しすぎる定理がいくつかあり、自動定理証明者には、信頼性を低下させる健全性のバグがあることが知られています。これは、Coqが比較して優れている領域です(ただし、自動ではありません)。

  3. Ocamlコードを生成する場合は、必ず最初にCoq(Gallina)で記述してください。次に、コードを抽出します。ただし、Coqは、可能であれば、C ++またはJavaの生成にひどいです。

  4. 上記のツールはスレッド化とパフォーマンスの問題を処理できますか?おそらくそうではないでしょう。パフォーマンスとスレッドの問題は、特に難しい問題であるため、特別に設計されたツールによって最も適切に処理されます。 MartinHofmannの PolyNI プロジェクトは興味深いようですが、ここで推奨するツールがあるかどうかはわかりません。

結論:「実世界」のJavaおよびC ++プログラムのフォーマル検証は、大規模で十分に開発された分野であり、Coqはそのタスクの一部に適しています。たとえば、概要はここにあります。

コメント

  • この投稿と追加した参照に感謝します。 IMHO、ソフトウェアエンジニアの目標は、1)常に正しい結果を提供し、2)失敗しないシステムを迅速にリリースできるようにすることです。ここでリグレッションの問題が発生する可能性があります。ここでは、仕様自体が”バグフリー” :-)のようなものであることを証明する必要があります。 “言語の真の提案”をメタ言語で定義しようとし、そのために別のメタ言語が必要になり、次に別の言語が必要になるようなものです。 1つ…
  • 問題は、ユーザー”が望んでいること”が通常正式に表現されていないことです。言語!通常、この質問に対する正式な回答はありません:”この正式な仕様は私の非公式の考えに準拠していますか?”。 ‘形式仕様をテストして、特定の数学的特性があることを証明することは可能ですが、最終的には数学を実世界に関連付ける必要があります。これは非公式のプロセスです。
  • もちろんです。正式な方法は、明確に定義されたポイントからしか開始できないことに常に気づきました。その仕様が実際のユーザーの意識的/無意識的/未発見のニーズに準拠しているかどうかは別の問題であり、形式手法では対処できません(ただし、エンジニアにとっては確かに問題です)。
  • 定理は定義上提案を証明した。したがって、おそらく”定理を証明するつもりはありません”。
  • @nbroWikipediaは同意しているようですあなたと。ただし、Mathworldは、定理を、受け入れられている数学演算によって” 真であると証明できる命題であると定義しています”。この場合、定理の証明を与えることは可能であるだけでなく、それらをそれと呼ぶことを正当化するために必要です! :)(もちろん、これは反論です)

回答

3つの注目すべきアプリケーションについて言及したいと思います。業界または重要な実際のシステムにおける形式手法/形式検証ツールの例。私はこのトピックに関する経験がほとんどなく、論文を読むことからしか学んでいないことに注意してください。

  1. オープンソースツール Java Pathfinder (略してJPF) 2005年にNASAによってリリースされたは、実行可能なJavaバイトコードプログラムを検証するシステムです( Java Pathfinder @ wiki )。これは、NASAエイムズのK9ローバーのエグゼクティブソフトウェアの不整合を検出するために使用されています。

  2. このペーパー:モデル検査を使用した重大なファイルシステムエラーの検出@ OSDI “04 は、使用方法を示しています。ファイルシステムの重大なエラーを見つけるためのモデル検査。FiSCと呼ばれるシステムが、広く使用され、十分にテストされた3つのファイルシステム(ext3、JFS、ReiserFS)に適用され、32の重大なバグが見つかりました。BestPaperAwardを受賞しました。

  3. このペーパー:Amazon WebServicesが正式なメソッドを使用する方法@CACM “15 では、AWSが正式なメソッドをS3、DynamoDB、EBS、内部分散ロックマネージャーなどの製品。 LamportのTLA + ツールに焦点を当てています。ちなみに、Lamportは独自のTLAツールボックスを集中的に使用しています。彼はTLAで(かなり完全な)フォーマル検証を行うことがよくあります。論文の付録で彼自身(および共著者)によって提案されたアルゴリズム/定理の一覧。

回答

安全性が重要な組み込みシステム用に設計されたC ++のサブセットで記述されたプログラムでフォーマル検証が可能になりました。 http://eschertech.com/papers/CanCPlusPlusBeMadeAsSafeAsSpark.pptを参照してください。短いプレゼンテーションの場合は、フルペーパーの場合は http://eschertech.com/papers/CanCPlusPlusBeMadeAsSafeAsSpark.pdf

コメント

  • リンクをありがとう。特にリンクが企業のWebサイトへのリンクであるため、リンクの腐敗を防ぐために、少なくともコンテンツの簡単な概要が役立ちます。それらは定期的に再編成され、サイトへのすべてのリンクが削除される傾向があります。

回答

フォーマルプログラムの仕様は、(多かれ少なかれ)別のプログラミング言語で書かれたプログラムです。その結果、仕様には確かに独自のバグが含まれます。

フォーマル検証の利点は、プログラムと仕様が2つの別個の実装であるため、バグが異なることです。しかし、常にではありません。バグの一般的な原因の1つである見落とされたケースは、しばしば一致します。したがって、フォーマル検証は万能薬ではありません。それでも、重要な数のバグを見逃す可能性があります。

フォーマル検証の欠点は、実装コストの2倍、おそらくそれ以上のコストがかかる可能性があることです(必要なフォーマル仕様のスペシャリストであり、それに付属する多かれ少なかれ実験的なツールを使用する必要があります。それは安くはありません。

テストケースとそれらを実行するための足場を設定すると思います。自動的に時間を有効に活用できます。

コメント

  • フォーマル検証の利点は… 。フォーマル検証の2番目のデメリットは…これは混乱を招きます。
  • 仕様と非公式タスクの不一致は、プログラミングの問題ではなく、ソフトウェア要件分析の問題だと思います。

回答

いくつかの異なる質問をします。私は、産業/商業アプリケーションのフォーマル検証方法がそれほど一般的ではないように見えることに同意します。ただし、プログラムの正当性を判断するために、コンパイラには多くの「フォーマル検証」の原則が組み込まれていることを理解する必要があります。したがって、ある意味で、最新のコンパイラを使用する場合は、「フォーマル検証で最先端の技術の多くを使用しています。

「テストにうんざりしている」と言いますが、フォーマル検証実際にはテストの代わりにはなりません。ある意味で、テストのバリエーションです。

Javaについて言及しています。 FindBugs と呼ばれるJava検証プログラムに組み込まれている多くの高度なフォーマル検証メソッドがあり、実際に大規模なコードベースで実行できます。 「誤検知と誤検知」の両方が発生するため、人間の開発者が結果を確認/分析する必要があることに注意してください。ただし、実際の機能上の欠陥が発生していなくても、通常はコードで回避する必要のある「アンチパターン」が発生することに注意してください。

特定のアプリケーションについては「産業用」以外は言及しません。 。実際のフォーマル検証は、特定のアプリケーションに依存する傾向があります。

フォーマル検証手法は、回路の正確さを証明するためにEEで広く使用されているようです。

これは、 Lars Philipson によるEE分野のフォーマル検証ツールの調査の例です。

コメント

  • ‘と誤解を招く” a多くの”フォーマル検証”の原則がコンパイラに組み込まれており、プログラムの正確性を判断します”。あなたが参照しているのは、一部のコンパイラが行う静的な型チェックですが、その方法で検証されたプロパティはかなり単純です。数字と文字列の追加を避けます。これは役に立ちますが、”フォーマル検証”によって通常理解されていることとはかけ離れています。
  • そうではありませんでした。静的型チェックを具体的に参照してください。ただし、これは単純で一般的な例の1つです。広く普及しているimhoコンパイラ最適化手法は、最適化されたプログラムバリアントの同等性を判断/表示する高度な手法を含むため、フォーマル検証の原則とほぼ同じです。したがって、ここで”ムービングゴールポスト”の問題を回避することが重要であるように思われ、コンパイラがそれを実行する、またはそのビルドを行うという理由だけで想定しないでくださいコンパイラに、それはフォーマル検証ではありません。
  • これは一般的な理解ではないことに同意しました。最適化手法は、おおまかに言って、ループやサブルーチンなどのプログラム動作のモデルを作成し、そのモデルを最適化してから、おそらく同等の新しいコードを生成します。したがって、これらの最適化のいくつかは、コード&を再配置する際に非常に洗練されており、フォーマル検証の原則を利用しています。コンパイラのフォーマル検証方法には他にも多くの例があるようです…元の質問は多くの人が指摘しているように多くの異なる質問をしましたが、そこに含まれるすべての質問に答えようとはしていません。
  • JRE、Javaランタイムエンジンなどでも使用されているフォーマル検証の原則があるようです…
  • つまり” 記のfilmusで言及されているフォーマル検証”のi>夢は、キメラの抽象化であり、実用的/実用的/現実的な業界はそれをそのように広く認識しています。大規模なコードベースは、コードの$ y $ K行ごとに本質的に$ x $のバグ/欠陥があることが何十年も前から知られており、理論/テクノロジーがどのように進歩しても、これは決して変更されません。 i>人間の性質。実際、人間が作成した数学的定理は同じ特性を持っていますが、これは広く認められていません!

回答

おそらく、モデルチェッカーが役立つかもしれません。

http://alloytools.org/documentation.html Alloyはモデルチェッカーです。

Alloyを使用したモデル検査の概念を説明する素晴らしいプレゼンテーション: https://www.youtube.com/watch?v=FvNRlE4E9QQ

同じファミリのツールに「プロパティベースのテスト」があり、それらはすべて、ソフトウェアの特定の仕様モデルの反例を見つけようとします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です