違いは、変数の型を宣言する話ではありません。それより少し微妙です(そしてペース Eric Lippert、私はこの用語が合理的に明確に定義されていると思います)。コンパイル時には、すべての式がコンパイル時に決定できる型を持っています。この型に適した操作だけが可能です。
タイプのない(「弱く型付けされた」批評家で、ファンに「動的に型付けされた」)言語では、そうではありません。この言語は、どのようなタイプのオペレーションも実行することができますが、オペレーションが失敗する可能性がかなりあります。つまり、の言語が操作を許可している可能性がありますが、ランタイムはそうでない場合があります。
すべての型宣言を必要とせずに強く型付けされた言語を使用できることに注意してください。確かに、強く型付けされた言語はありません。ジャワのこのビットを考えてみましょう:
String s = "hellO";
int l = s.getBytes().length;
コンパイラは.length
が合法であると判断しない方法は?それはbyte[]
で使用されているので合法です。しかし、ここにはbyte[]
というものは何も宣言されていません。コンパイラはs
がString
であることを知り、String
にを呼び出すと、byte[]
が得られます。 s.getBytes()
のタイプがbyte[]
であり、そのためlength
を要求することが合法であるという事実から推測されます。
Javaよりも洗練された型システムを持つ言語の中には、これ以上推論できるものがあります。
val s = "hello"
val l = s.getBytes().length
をコンパイラは中間式のと同様、s
とl
の種類を推測します:たとえば、Scalaで、あなたが言うことができます。種類を明示的にもたらしたというのがファンシーな方法である、マニフェストなされなければならないので、強い型付けが、(Javaのような)冗長型宣言が必要な型推論の人工制限があり
言語は、を入力マニフェストを有すると記載されています生きている、それは書き留めたと言う素晴らしい方法です。
この質問は、どこかで[理論計算機等のためのより良いフィットかもしれませんかしら科学](http://cstheory.stackexchange.com/)または[プログラマー](http://programmers.stackexchange.com/)...? – summea
さて、どこに置くべきかわからなかった。私はそれを追加します。 – Josh
Cでは 'float'に' int'を追加するのは完全に合法です。 –