Tweeter originale qui. :)
Prima di tutto, sono un po 'divertito / scioccato dal fatto che il mio tweet sia preso così sul serio! Se avessi saputo che sarebbe stato così ampiamente diffuso, avrei trascorso più di 30 secondi a scriverlo!
Thiago Silva ha giustamente sottolineato che "statico" e "dinamico" descrivono più accuratamente il controllo del tipo , piuttosto che i sistemi di tipo . In effetti, non è proprio esatto affermare che una lingua sia tipizzata staticamente o dinamicamente. Piuttosto, una lingua ha un sistema di tipi e un'implementazione di quella lingua potrebbe imporre il sistema di tipi usando il controllo statico, il controllo dinamico, o entrambi, o nessuno dei due (anche se non sarebbe un'implementazione del linguaggio molto accattivante!).
In effetti, ci sono alcuni sistemi di tipo (o caratteristiche dei sistemi di tipo) che sono più suscettibili al controllo statico e ci sono alcuni sistemi di tipo (o caratteristiche dei sistemi di tipo) che sono più suscettibili al controllo dinamico. Ad esempio, se la tua lingua ti consente di specificare nel testo di un programma che un determinato valore deve sempre essere un array di numeri interi, allora è ragionevolmente semplice scrivere un controllo statico per verificare quella proprietà. Al contrario, se la tua lingua ha un sottotitolo e se consente il downcasting, è ragionevolmente semplice verificare la validità di un downcast in fase di esecuzione, ma è estremamente difficile farlo al momento della compilazione.
Quello che intendevo veramente con il mio tweet è semplicemente che la stragrande maggioranza delle implementazioni linguistiche esegue un certo controllo dinamico del tipo. O, equivalentemente, la stragrande maggioranza delle lingue ha alcune caratteristiche che sono difficili (se non impossibili) da controllare staticamente. Il downcasting è un esempio. Altri esempi includono overflow aritmetico, controllo dei limiti dell'array e controllo null. Alcuni di questi possono essere controllati staticamente in alcune circostanze, ma nel complesso, sarebbe difficile trovare un'implementazione del linguaggio che non esegua alcun controllo in fase di esecuzione.
Questa non è una brutta cosa. È solo un'osservazione che ci sono molte proprietà interessanti che vorremmo far applicare alle nostre lingue e che non sappiamo davvero come controllare staticamente. Ed è un promemoria che distinzioni come "tipi statici" rispetto a "tipi dinamici" non sono così nette come alcune persone vorrebbero farti credere. :)
Un'ultima nota: i termini "forte" e "debole" non sono realmente utilizzati nella comunità di ricerca del linguaggio di programmazione e non hanno un significato coerente. In generale, ho scoperto che quando qualcuno dice che una lingua ha "digitazione forte" e un'altra lingua ha "digitazione debole", stanno davvero dicendo che la loro lingua preferita (quella con "digitazione forte") impedisce loro di commettendo un errore che l'altra lingua (quella con "digitazione debole") non - o viceversa, che la loro lingua preferita (quella con "digitazione debole") consente loro di fare qualcosa di interessante che l'altra lingua (il uno con "digitazione forte") no.