静的分析の型に代わるものはありますか?


18

プログラミング言語での静的型付けは、コンパイル時に特定の保証を強制するのに役立ちますが、型はこの仕事のための唯一のツールですか?不変条件を指定する他の方法はありますか?

たとえば、言語または環境は、配列の長さ、または関数への入力間の関係に関する保証を実施するのに役立ちます。型システム以外では、このようなことは聞いたことがありません。

関連することは、静的分析を行うための非宣言的な方法があるかどうかです(ほとんどの場合、型は宣言的です)。

回答:


24

静的型システムは静的分析の一種ですが、型システムでは一般的にエンコードされない静的分析が数多くあります。例えば:

  • モデル検査は、並行システム用の分析および検証手法であり、すべての可能なスレッドインターリーブでプログラムが適切に動作することを証明できます。

  • データフロー分析は、変数の可能な値に関する情報を収集します。これにより、一部の計算が冗長であるか、一部のエラーが考慮されていないかを判断できます。

  • 抽象解釈は、通常、分析が終了することが保証されるような方法で、プログラムの効果を控えめにモデルします。型チェッカーは、抽象インタープリターと同様の方法で実装できます。

  • 分離ロジックはプログラムロジック(たとえば、Inferアナライザーで使用)で、プログラムの状態について推論し、nullポインターの参照解除、無効な状態、リソースリークなどの問題を特定するために使用できます。

  • 契約ベースのプログラミングは、前提条件、事後条件、副作用、および不変条件を指定する手段です。Adaは契約をネイティブでサポートしており、契約の一部を静的に検証できます。

最適化コンパイラは、最適化中に使用する中間データ構造(SSA、インラインコストの推定、命令ペアリング情報など)を構築するために、多くの小さな分析を行います。

非宣言的な静的分析の別の例は、Hack typecheckerにあります。ここでは、通常の制御フロー構造が変数の型を改良できます。

$x = get_value();
if ($x !== null) {
    $x->method();    // Typechecks because $x is known to be non-null.
} else {
    $x->method();    // Does not typecheck.
}

そして、「リファイン」と言えば、タイプシステムの土地に戻って、リファインメントタイプLiquidHaskellで使用される)は、「リファイン」タイプのインスタンスに対して保持されることが保証される述語とタイプをペアにします。そして、依存型はこれをさらに進め、型が値に依存できるようにします。依存型付けの「ハローワールド」は通常、配列連結関数です。

(++) : (a : Type) -> (m n : Nat) -> Vec a m -> Vec a n -> Vec a (m + n)

ここで++は、型Vec a mとの2つのオペランドを取ります。それぞれ、Vec a n要素の型aと長さmを持つベクターで、nそれぞれ自然数(Nat)です。長さがである同じ要素タイプのベクトルを返しますm + n。この機能は、特定の値を知ることなく、抽象的にこの制約を証明mし、nベクトルの長さは、動的であってもよいので、。


型システムとは何ですか?私は実際に知らないことに気付きます。ウィキペディアの定義は循環的です:en.wikipedia.org/wiki/Type_system
マックスハイバー

1
@mheiber:A静的型システムは、静的解析は、単純である帰しタイプ(例えば、intint -> intforall a. a -> a)の用語(例えば、0(+ 1)\x -> x)。他の分析では、副作用(pureio)、可視性(publicprivate)、状態(openclosed)など、データタイプに関係のないさまざまなプロパティを割り当てることができます。実際には、これらのプロパティの多くは型チェック/推論と同じ実装でチェックできるため、区別は完全に明確ではありません。
ジョンパーディ

4

@JonPurdyの答えは優れていますが、さらにいくつか例を追加したいと思います。

明らか:

  • 構文チェック

  • リンティング

非自明:

  • Rustを使用すると、プログラマは「バインディング」が可変かどうかを指定でき、これらの制約を強制できます。

  • これは多少関連しています。一部の言語では、コンパイル時に一部のコードを実行できます。つまり、実行時エラーになりそうな多くのことをコンパイル時にキャッチできます。いくつかの例は、プラグマでマークされたマクロとNim言語の手順です。compileTime

  • 論理 プログラミングは、基本的にアサーションを提供することによりプログラムを構築しています。

準静的タイピング:

  • FacebookのFlowは、動的型付けと静的型付けのハイブリッドを可能にします。考え方は、動的コードでさえ暗黙的に型付けされるということです。Flowでは、関数に型注釈を付けない場合でも、実行中のコードを監視するサーバーを実行して、発生する可能性のある型エラーを検出できます。

1

型分析はあまり意味がありません。

Agdaは、チューリング完全型システムを持つことが知られており、ML言語(Ocamlなど)とは非常に異なります(そして、計算がはるかに困難です)。


Agdaは、「チューリング完全型システム」を持たず、「チューリング完全用語体系」さえも持たないように多大な努力を払っています。
user833970
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.