回答:
動的に型付けされたシステムでは、値には実行時に型がありますが、変数と関数にはありません。静的に型付けされたシステムでは、変数と関数には既知の型があり、コンパイル時にチェックされます。たとえば、Pythonのx場合は何でもかまいません。実行時に、それが1数値である場合、それが"foo"である場合、文字列です。x実行時にどのタイプかがわかるだけで、プログラムを実行するたびに異なる可能性があります。Javaのような言語では、数字であるint xかどうかを記述xし、コンパイル時にx常にそれが必要であることがわかりますint。
「明示的な」および「暗黙的な」型は両方とも静的型システムを指します。静的システムの特徴は、コンパイル時に型がわかっていることですが、必ずしも書き出す必要はありません。Javaでは、型は明示的です-型を記述する必要があります。したがって、Javaでは、メソッドは次のようになります。
public int foo(String bar, Object baz) { ... }
タイプは、コンパイル時(静的)と書き出された(明示的)両方で知られています。ただし、型の記述を強制しない言語もあります。関数の種類とその使用方法から、関数のタイプを推測できます。例はOCamlで、次のように書くことができます。
let foo x = x + 1
あなたが使用しているので+、OCamlのは、その把握することができxなければならないintすべては自分自身で。だから、の種類foo(foo : int -> int)がされただけでJavaの例のように、コンパイル時に知られています。完全に静的です。ただし、コンパイラーは型が独自に必要なものを把握できるため、自分で型を記述する必要はありません。それらは暗黙的です。
つまり、型システムが明示的であるか暗黙的であるかは、静的システムの特性です。型システムが動的か静的かはまったく別の質問です。
多くの場合、明示的である場合と暗黙的である場合がある型システムがあります。
たとえば、C#ではvarキーワードを使用して型を推測できると考えています。だからではなく、書き込みのint x = 10、あなたが書くことができvar x = 10、そのうちのコンパイラ数字はxなければなりませんint。C ++はと同様のことを行いautoます。これらのシステムは通常明示的ですが、ある程度の推論があります。
反対に、通常は暗黙的ですが、場合によってはタイプシグネチャの記述を強制するシステムがあります。Haskellは素晴らしい例です。ほとんどの場合、Haskellはタイプを推測できます。ただし、show . readHaskellが独自に型を判別できない場合のように、あいまいなコードを作成できる場合があります。この場合、showまたはのいずれかのタイプを明示的に指定する必要がありますread。さらに、型システムのいくつかのより高度な機能(ランクnポリモーフィズムなど)により、推論が決定不能になります。つまり、停止が保証されません。つまり、この機能を使用するコードには、明示的な型シグネチャが必要になることがよくあります。
静的と動的は、型がいつチェックされるかを説明します(コンパイル時または実行時に多少なりとも)
2つのタイプが同じであると見なされる場合、名義対構造を記述します。
(バリエーションもありますが、最もよく知られているのは、アヒルタイピングとして知られるタイプ全体の代わりに使用されるもののみを考慮する構造タイピングのバリアントです)。
4つの組み合わせ(静的名義、静的構造、動的名義、動的構造)が可能であり、言語は純粋に1つのクラスではなく、他のクラスにある側面を持っています。
たとえば、C ++の型システムは静的であり、ほとんどが名目ですが、テンプレートを検討する場合は構造的です(また、C ++の概念に関する問題の一部は、アヒルの型付けから完全な構造型付けまで、名目上のタイピングに行きたい人)。また、クラスと継承を使用すると、場合によっては動的な名義型を使用できます。
動的型システムが構造タイピングを使用していることが多い言語ですが、CLOSは名目上の側面です。
動的型システムと静的型システム(の実際の包含)の違いについて私が見た最も良い説明は、Bob Harperによるこのブログ投稿にあります。
その主なポイントは次のように要約できます。