Java(または一般的な命令型言語)の正式な実行モデル


7

いくつかの厳しい制限の下でJavaプログラムの実行に関するいくつかのステートメントを証明しようとしています(基本的に、2つのメソッドが特定の入力の一連の制約を満たす場合、それらは同等であると推測されます(つまり、戻り値と後の状態)実行は同じです)。これを証明するために、私はこれについて話すことができるある種の形式主義を探しています。

私は関数型言語の操作上のセマンティクスに精通しており、forループ/ whileループを再帰的な関数に変換できる可能性があります...これを行うのではなく、いくつかの機械を用意して命令型の土地に留まることができるとよいでしょう。

より具体的には、実行のk番目のステップでのメソッドの状態について推論したいと思います。これには、グローバルな状態が含まれます。

  • this.field = 2クラスの状態を更新するような呼び出し
  • パラメータを変更する呼び出しは、メソッドの外部で状態を更新します。
    • myParam.setFoo(...)
    • myParam.x = y
  • 静的メソッドの呼び出し
    • Blah.static_side_effects()

これはすべて確定的であると想定しています。つまり、状態に対するこれらのグローバル更新のいずれかが2つのメソッドで発生し、その両方のグローバル実行状態とローカル実行状態が同じである場合、新しい状態も同じになるという仮定を正式化したいと思います-計算の各ステップが決定されるということです正確には、グローバル状態とローカル状態によって。これは明らかにRNGと並列処理を排除します(ただし、これは後で処理する可能性があります...)。

これにどのように取り組むことができるかについてのアイデアや情報源はありますか?私の唯一の考えは、メソッドをステートメントのリストとして扱い、ステートメントのセマンティクスを正式に記述しようとすることです。

できれば、JVMレベルではなく、Java言語レベルでこれを実行したいと思います。これは現実的ではないかもしれませんが、今の私の目標は、運用上のセマンティクスについていくつかの合理的な仮定を行い、そこからそれを取得することです。

ああ、最後のメモです。この質問をどのように改善できるかについての提案があれば、大歓迎です。私は質問をするのに適切な言語を見つけようとするのにちょっと気まぐれになっていて、用語を乱用しているかどうか(ローカル/グローバル実行状態など)は、これを修正したいです。


3
「Featherweight Java」に関する論文が関連しているかもしれません。私がそれについて何かを読んだのは久しぶりですが、彼らはまだ十分に一般的であり、まともなサイズのセマンティクスを認める適度に小さいJavaサブセットを定義しようとしました。完全なJavaのためにこれを行うのはやり過ぎです。公式言語仕様は、非公式な説明の700ishページです、IIRC。
2017年

ええ、私はスペックを一目見て、続けました。また、それは言語仕様IIRのみです。JVM仕様には別の600〜700ページがあります。ただし、Featherweight Javaを調べます。提案をありがとう
ベンクシギアン2017年

ああ、ピアースとワドラー!私の作品への適用性に関係なくこれを読みます:D
ベンクシギアン

回答:


7

Featherweight JavaはPLコミュニティで非常に高く評価されています。ただし、それがニーズに合わない場合は、モデリングの一般的な方法を次に示します。

  • 言語のASTを式とステートメントに形式化する
  • 式とステートメントのセマンティクスを記述します。セマンティクスには次のものが必要です。
    • 式と状態のペアを更新された状態で評価された式に関連付ける評価関係(e,σ)(e,σ)
    • ステートメントと状態のペアを出力状態に関連付ける実行関係。(s,σ)σ
  • これらは相互に再帰的になり、特定のニーズに応じて、大きなまたは小さなステップのセマンティクスになります。大きなステップはより単純ですが、非終了実行のモデル化ではより悪くなります。

この基本的な構造はあなたをかなり遠くへ連れて行きます。Javaをモデル化するには、特定のオブジェクトを中心に状態セットを階層的に構成する必要がありますが、基本的な原則は同じです。また、動的ディスパッチをモデル化する必要があるため、クラスメソッドを明示的な「this」引数を取る関数に変換することはおそらく意味があります。

公理的意味論、すなわちHoareトリプル。命令型プログラムをモデル化するステートメントの事前条件と事後条件のロジックを定義します。これらがOOPにどのように関連するのかはわかりませんが、50年の間に誰かが試みてきたと思います。

Software Foundationsにも興味があるかもしれません。これは、Coqの定理証明における命令型言語について推論することを目的としていますが、正式なセマンティクスの優れた概要を提供します。


オリジナルのHoareトリプル/公理セマンティクスは、ファーストクラスの関数やオブジェクトなどの高次構造を処理しませんでした。バンチされた含意のロジック、特に分離ロジックの形式などのより現代的なアプローチや、Hoare型理論は、そのような機能を処理できるアプローチを提供します。
Derek Elkinsが

8

あるJavaの1.4の(動作)セマンティクスで処方フレームワークは。このフレームワークに関連付けられているのは、Matching Logicと呼ばれる証明システムです。このページではプロトタイプの実装について説明していますが、機能はフレームワークツール自体にとして組み込まれているようです。残念ながら、フレームワークは更新中のようです。フレームワークを適切に構築して機能させるのは少し面倒で、実用的または機能的であるかどうかはわかりませんKKkproverkprover現在です。ただし、運用セマンティクスを参照するものを手動で証明することもできます(必要に応じて、マッチングロジック証明システムを使用することもできます)。Javaのセマンティクスを説明するペーパー、K-Java:A Complete Semantics of Javaは完全性は劣るが、目的には十分かもしれない他のシステムを参照しています。とはいえ、Javaプログラムに関する特性を証明することを目的としていない場合もあります。実際、この論文では、セマンティクスが正当性の証明ではなくモデルチェックに使用されています。

これは、実際のJavaコードが意図したとおりに動作するという高い信頼性が必要な場合の回答です。目標が、Javaへの特定の実現よりもアルゴリズムを検証することである場合、これは多すぎる可能性があります。とはいえ、基本的な命令型/ OO機能のみが必要な場合は、で単純な命令型言語を簡単に形式化できます。実際、これは次のように行われる運動でフレームワークチュートリアル。実際、マッチングロジックプロトタイプがサポートするCのフラグメントに問題を再編成できれば、それをそのまま使用できる可能性があります。KK

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.