質問

ったのについて教 正式なシステム 大学ですが、がっかりしたどのようにされているようには思えないのに使用することが不ます。

として参考にしていたのを知ることができるコード(オブジェクト機能は、誰の作品ではなく、試験が .

思いの全ての緯んの間に存在する物理工学とソフトウェア工学(鉄鋼の動作ト,音楽,博物館/娯楽施設-ソフトウェアに何でもできる-知り尽くした!), や思いがある場合の言語で利用可能な、リアル(あるいは、ウェブフレームワークも求?)

いというのは、聞いたことは興味深いことにtestabilityの言語のようなスカラ.

としてのソフトウェア 技術者 どのような選択肢がいますか?

役に立ちましたか?

解決

はい、証拠的に正しいソフトウェアを書くために設計された言語があります。業界でも使用されているものもあります。 Spark Ada おそらく最も顕著な例です。 Praxis Critical Systems Limitedの数人の人々と話をしました。 (ここに素晴らしいです 言語の要約 /説明。)この言語と付随する証明システムは、以下で説明する2番目の手法を使用します。動的メモリの割り当てさえサポートしていません!


私の印象と経験は、正しいソフトウェアを書くための2つのテクニックがあるということです。

  • 手法1:ソフトウェアを快適な言語で書きます(たとえば、C、C ++、またはJava)。そのような言語の正式な仕様を取り、プログラムを正しく証明してください。

    あなたの野望が100%正しい場合(これはほとんどの場合、自動車 /航空宇宙産業では要件であることが多い場合)、プログラミングのプログラミングが少しなく、より多くの時間を証明することになります。

  • テクニック2:ソフトウェアを少し厄介な言語(たとえば、ADAのサブセットまたはTweakedバージョンのOCAML)で書き込み、途中で正しさの証明を書きます。ここでは、プログラミングと証明が密接に関連しています。 CoQでのプログラミングは、それらを完全に同一視します! (を参照してください カレー - ハワード通信)

    これらのシナリオでは、常に正しいプログラムになります。 (バグは仕様に根ざしていることが保証されます。)プログラミングにより多くの時間を費やす可能性がありますが、一方で、途中でそれが正しいことを証明しています。

どちらのアプローチが正式な仕様を持っているという事実にかかっていることに注意してください(正式な仕様があるのは、正しい /正しくない動作を他にどのように伝えるか)、および言語の正式に定義されたセマンティクス(実際の動作は他にどのように伝えることができるかを知ることができます。あなたのプログラムのです)。

正式なアプローチの例をいくつか紹介します。それが「実世界」であるかどうかにかかわらず、あなたが尋ねる人に依存します:-)

私は「確かに正しい」1つだけを知っています Webアプリケーション言語: あなたは. 。 「コンパイラを通過する」というウルプログラムは、次のことを保証されます。

  • あらゆる種類のコードインジェクション攻撃に苦しんでいます
  • 無効なHTMLを返します
  • デッドアプリケーションリンクが含まれています
  • HTMLフォームとハンドラーが期待するフィールドの間に不一致を持っています
  • リモートWebサーバーが提供する「Ajax」スタイルサービスについて誤った仮定を行うクライアント側のコードを含める
  • 無効なSQLクエリを試みます
  • SQLデータベースとの通信またはブラウザとWebサーバーの間で、不適切なマーシャリングまたはマッチングを使用する

他のヒント

注このような疑問に答えるため、必要な情報である定義をどのようなことなの"証明".としてのRicky指摘の通り、言語、タイプシステムは、言語と内蔵の証明システム毎に運行時にコンパイルプログラム。これらの証明システムはほとんど常に残念無力—質問に答えよう String vs Int とを避けるなどのような問題に関し"は、リストのソート?" —その証明システムなのです。

残念ながら、より洗練された証明書の目標は、硬いので仕事のできるシステム認証.この履かなり迅速にアンドリューへのundecidabilityについて検討するとき、そのクラスの問題は存にチューリング機です。確かに、できる理論的な基礎的なことのように実証するための正しさをお選別アルゴリズムがものである、ということを踏み固めの非常に薄い。

もとも単純などの正当性ソートアルゴリズムが比較的高証明システム。(注:このような組織の設立が増えているタイプシステムの実証システム構築の言語も話してくれるとともに型理論によ振私の手もさらに積極的に入ってもかなり確実に、オリジネーター正しさの証明リストの選別が必要、との何らかの形で被扶養者の種類、お持っていませんのを参照す相対値の型です。この後のブ領域のタイプ理論をすることが示されてい存.となることができることを証明性のリストに選別アルゴリズムについて教えてください思いを利用するシステムもできる表現証明となる保証もするものではなく.個人的には、これは非常に緊.

また、使い勝手の面でも言及。洗練されたご型システムに快適で利用します。ることのないハードのルールを定はないと思いをすることができます。としての正式なシステム、しばしば見ることを表す証明が作りエラーが)の作成を実施。

すべてのことは、注目に値するスカラタイプシステム(ウ)はチューリング完全であることができ 理論的に での使用を証明する為decidable性コードで、書いたコードなので観光の拠点には最適な立地などの証明.ウ違いなくより良い言語のためにこのよJava(type-レベルのプログラミングウに似てPrologをタイプレベルのプログラミングラノ-スカラ座に近くなりましたSML).んごご使用になることをScalaのウタイプシステムのこのように正式な証明のアルゴリズムの正しさが、オプションは理論的には可能です。

となると思う理由から正式なシステムを"実世界"から生まれることの正式な証明システムが得られている残酷去のプラグマティズム(実利主義).申し上げたように、ウイルスがいかに関わる作お正証明できないケースがほとんどない内容であることを期待する。の産業を決定した長時間前かりをアドホック試験に比べてはるか何らかの分析の正式な推論です。

タイプされた言語は、特定のカテゴリの障害がないことを証明します。タイプシステムがより進んでいるほど、障害が増えないことがわかります。

プログラム全体が機能することの証拠については、はい、数学とプログラミングが互いに出会う普通の言語の境界の外に出て、握手をしてから、プログラマーがギリシャのシンボルを処理できない方法についてギリシャのシンボルを使用して話し続けます。とにかくそれはそれのσについてです。

あなたは私たちの多くが長年にわたって尋ねてきた質問をしています。私は良い答えがあることを知りませんが、ここにいくつかの作品があります:

  • 今日使用されていることが証明される可能性がある、よく理解されている言語があります。 ACL2経由のLISPは1つであり、もちろんスキームには正式な定義も十分に理解されています。

  • 多くのシステムが、Haskellのような純粋な機能的言語、またはほぼ純粋な言語を使用しようとしました。 Haskellにはかなりの正式な方法が機能しています。

  • 20年以上遡ると、正式な言語の手防止を使用するための短命のものがあり、その後、編集された言語に厳密に翻訳されました。いくつかの例は、IBMのソフトウェアクリーンルーム、ACL、ジプシー、およびコンピューティングロジックから立ち上がったこと、John MchughとCの信頼できるコンピレーションに関する私の作業、C Systemsプログラミングの手作業に関する私自身の作業でした。これらはすべていくつかの注目を集めましたが、どれもそれを実践することはありませんでした。

尋ねる興味深い質問は、正式なアプローチを実践するのに十分な条件が何であるかだと思います。いくつかの提案を聞いてみたいです。

あなたは調査することができます 純粋に機能的な言語 あなたの要件の1つがあるときに使用されるHaskellのように 提供性.

これ 機能的なプログラミング言語と純粋な機能プログラミング言語に興味がある場合は、楽しい読み物です。

このような証明可能な言語の現実世界の使用は、アフターウッドを書いて理解するのが非常に難しいでしょう。ビジネスの世界には、迅速に機能するソフトウェアが必要です。

「証明可能な」言語は、大規模なプロジェクトのコードベースを書く/読むために拡大しないだけでなく、小規模で孤立したユースケースでのみ機能しているようです。

私は2つの証明可能な言語に関与しています。 1つ目は、SOTFwareを指定し、それを改良し、コードを生成するためのシステムであるPerfect Developerがサポートする言語です。 PD自体を含むいくつかの大規模なシステムに使用されており、多くの大学で教えられています。私が関わっている2番目の証明された言語は、Misra-Cの証明可能なサブセットです。 C/C ++検証ブログ 多くのための。

チェックアウト オメガ.

これ 前書き AVLツリーの比較的痛みのない実装が含まれています。

Scalaは「現実の世界」であることを意図しているため、それを証明できるようにする努力はなされていません。 Scalaでできることは、機能コードを作成することです。機能コードはテストがはるかに簡単です。これは、「現実世界」と提供性の間の良い妥協点です。

編集===== MLが「証明可能」であるという私の誤ったアイデアを削除しました。

証拠的に修正されたコードの文脈における「現実世界」の私の(物議を醸す)定義は次のとおりです。

  • ある程度は関与する必要があります オートメーション, そうでなければ、あなたはあまりにも多くの時間を費やして厄介な小さな詳細に対処し、それは完全に非現実的です(宇宙船制御ソフトウェアとそのようなことを除いて、あなたは実際にメガバックを費やしたいかもしれません細心のチェック)。
  • ある程度をサポートする必要があります 機能プログラミング, 、非常にモジュール式で再利用可能で、推論が簡単なコードを作成するのに役立ちます。 Hello Worldまたはさまざまな簡単なプログラムを書いたり証明したりするためには、明らかに機能的なプログラミングは必要ありませんが、特定の時点では、機能的なプログラミングが非常に有用になります。
  • 代替として、主流のプログラミング言語でコードを作成できる必要はありませんが、少なくとも、信頼できるメインストリームプログラミング言語で記述された合理的に効率的なコードにコードを機械翻訳することができるはずです。仕方。

上記は比較的普遍的な要件です。命令コードをモデル化する能力、または高次関数を正しいことを証明する能力などのその他は、一部のタスクではなく、すべてではありませんが、重要または不可欠です。

これらのポイントを考慮して、にリストされているツールの多く 私のこのブログ投稿 有用かもしれませんが、ほとんどすべてが新しく実験的であるか、業界プログラマの大多数に慣れていないものです。ただし、そこには非常に成熟したツールがいくつかあります。

どうですか イドリスAgda?現実世界で十分ですか?

実生活の例として、lemmachineと呼ばれるAGDAで書かれた検証済みのHTTP RESTライブラリを提供することを目的とするプロジェクトがあります。 https://github.com/larrytheliquid/lemmachine

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