Originale tweeter 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 ampiamente diffuso, avrei impiegato più di 30 secondi a scriverlo!
Thiago Silva ha ragione a sottolineare che "statico" e "dinamico" descrivono più accuratamente il tipo controllo , piuttosto che il tipo sistemi . In effetti, non è proprio esatto dire che anche una lingua è tipizzata staticamente o dinamicamente. Piuttosto, un linguaggio ha un sistema di tipi e un'implementazione di tale linguaggio potrebbe far rispettare il sistema di tipi usando il controllo statico, o il controllo dinamico, o entrambi, o nessuno dei due (anche se non sarebbe un'implementazione linguistica molto accattivante!).
Come accade, ci sono alcuni tipi di sistemi (o caratteristiche di sistemi di tipi) che sono più suscettibili di controllo statico, e ci sono alcuni sistemi di tipi (o caratteristiche di sistemi di tipi) che sono più suscettibili di controllo dinamico. Ad esempio, se la tua lingua ti permette di specificare nel testo di un programma che un particolare 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 sottotitoli e se consente il downcasting, allora è ragionevolmente semplice verificare la validità di un downcast in fase di runtime, ma estremamente difficile farlo in fase di compilazione.
Ciò che intendevo veramente con il mio tweet è semplicemente che la stragrande maggioranza delle implementazioni linguistiche esegue alcuni quantità di controllo dinamico dei tipi. Oppure, equivalentemente, la stragrande maggioranza delle lingue ha alcune caratteristiche che sono difficili (se non impossibili) da controllare staticamente. Downcasting è un esempio. Altri esempi includono l'overflow aritmetico, il controllo dei limiti dell'array e il controllo nullo. Alcuni di questi possono essere controllati staticamente in alcune circostanze, ma in generale è difficile trovare un'implementazione linguistica che non esegua alcun controllo in fase di runtime.
Questa non è una brutta cosa. È solo un'osservazione che ci sono molte proprietà interessanti che vorremmo applicare ai nostri linguaggi e che in realtà non sappiamo come controllare staticamente. Ed è un promemoria che distinzioni come "tipi statici" e "tipi dinamici" non sono così netti come alcune persone vorrebbero far credere. :)
Un'ultima nota: i termini "strong" e "debole" non sono realmente usati nella comunità di ricerca del linguaggio di programmazione, e non hanno realmente un significato coerente. In generale, ho scoperto che quando qualcuno dice che una lingua ha una "tipizzazione strong" e che in qualche altro linguaggio c'è "una digitazione debole", stanno davvero dicendo che la loro lingua preferita (quella con "strong tipizzazione") impedisce loro di facendo un errore che l'altra lingua (quella con "digitazione debole") non - o al contrario, che la loro lingua preferita (quella con "digitazione debole") permetta loro di fare qualcosa di interessante che l'altra lingua (il uno con "strong tipizzazione") non lo fa.