La differenza non è di dichiarare i tipi di variabili. È un po 'più sottile di quello (e pace Eric Lippert, penso che il termine sia ragionevolmente ben definito). La distinzione è che in un linguaggio fortemente tipizzato, ogni espressione ha un tipo che può essere determinato al momento della compilazione e solo le operazioni appropriate a quel tipo sono consentite.
In un linguaggio non tipizzato ("debolmente tipizzato" per criticare, "digitato dinamicamente" per i fan), non è così. Il linguaggio consente a qualsiasi operazione di essere eseguita su qualsiasi tipo, con la riserva piuttosto sostanziale che l'operazione potrebbe non riuscire. Cioè, mentre la lingua può consentire l'operazione, il runtime non può.
Si noti che è possibile avere una lingua fortemente tipizzata senza richiedere dichiarazioni di tipo ovunque. In effetti, non esiste un linguaggio fortemente tipizzato. Considerate questo po 'di Java:
String s = "hellO";
int l = s.getBytes().length;
Come fa il compilatore decide che .length
è legale lì? È legale perché viene utilizzato su un byte[]
. Ma non c'è nessuna dichiarazione di nulla come byte[]
qui.Piuttosto, il compilatore sa che s
è un String
e che quando si chiama getBytes()
su un String
, si ottiene un byte[]
. Da questi fatti risulta che il tipo di s.getBytes()
è un byte[]
, e quindi è legale chiedere il suo length
.
Alcune lingue i cui sistemi di tipi sono più sofisticati di Java consentono al compilatore di dedurre più di questo. Per esempio, in Scala, si può dire:
val s = "hello"
val l = s.getBytes().length
E il compilatore dedurre i tipi di s
e l
, così come delle espressioni intermedie.
Lingue che hanno una forte tipizzazione ma limiti artificiali sul tipo di inferenza che richiedono dichiarazioni di tipo ridondante (come Java) sono descritte come aventi manifesta digitando, perché i tipi devono essere resi manifesti, che è un modo elegante per dire portato esplicitamente all'esistenza, che è un modo elegante di dire scritto.
Mi chiedo se questa domanda potrebbe essere una misura migliore per un posto come [informatica teorica Science] (http://cstheory.stackexchange.com/) o [Programmers] (http://programmers.stackexchange.com/) ...? – summea
Sì, non ero sicuro di dove metterlo. Lo aggiungerò – Josh
In C è perfettamente legale aggiungere un 'int' a un' float'. –