La tipizzazione strong / debole e la digitazione statica / dinamica sono ortogonali.
strong / debole indica se il tipo di un valore è importante, dal punto di vista funzionale. In un linguaggio tipizzato debolmente, puoi prendere due stringhe che si riempiono di cifre ed eseguire l'aggiunta di interi su di esse; in un linguaggio strongmente tipizzato, si tratta di un errore (a meno che non si esegua il cast o si convertano prima i valori nei tipi corretti). La digitazione strong / debole non è una cosa in bianco e nero; la maggior parte delle lingue non sono né al 100% rigorose né al 100% deboli.
La tipizzazione
statico / dinamico riguarda il tipo di associazione ai valori o agli identificatori. In un linguaggio tipizzato dinamicamente, puoi assegnare qualsiasi valore a qualsiasi variabile, indipendentemente dal tipo; la tipizzazione statica definisce un tipo per ogni identificatore e l'assegnazione da un tipo diverso è un errore o genera un cast implicito. Alcune lingue adottano un approccio ibrido, consentendo tipi dichiarati staticamente e identificatori non tipizzati ('variant'). C'è anche inferenza di tipo, un meccanismo in cui la tipizzazione statica è possibile senza dichiarare esplicitamente il tipo di tutto, facendo capire al compilatore i tipi (Haskell lo usa estesamente, C # lo espone attraverso la parola chiave var
).
Una programmazione dinamica debole consente un approccio pragmatico; la lingua non si intromette per la maggior parte del tempo, ma non entrerà in azione quando ti sparerai ai piedi. La strong tipizzazione statica, al contrario, spinge il programmatore ad esprimere determinate aspettative sui valori esplicitamente nel codice, in un modo che consente al compilatore o all'interprete di rilevare una classe di errori. Con un buon sistema di tipi, un programmatore può definire esattamente ciò che può e non può essere fatto a un valore, e se, per caso, qualcuno prova qualcosa di indesiderato, il sistema tipo può spesso prevenirlo e mostrare esattamente dove e perché le cose vanno male. / p>