Risposta breve: no, perché l'equivalenza di Turing.
Risposta lunga: questo ragazzo è un troll. Mentre è vero che i sistemi di tipo "ti restringono a un sottoinsieme", le cose al di fuori di quel sottoinsieme sono, per definizione, cose che non funzionano.
Tutto ciò che sei in grado di fare in qualsiasi linguaggio di programmazione completo di Turing (che è linguaggio progettato per la programmazione generica, oltre a molto altro, è una barra piuttosto bassa da cancellare e ci sono diversi esempi di un sistema diventando Turing-completo involontariamente) si è in grado di fare in qualsiasi altro linguaggio di programmazione completo di Turing. Questo è chiamato "equivalenza di Turing" e significa solo esattamente ciò che dice. È importante sottolineare che non significa che si possa fare l'altra cosa altrettanto facilmente nell'altra lingua - alcuni sostengono che questo è l'intero punto di creare un nuovo linguaggio di programmazione in primo luogo: per darti un modo migliore di fare certe cose cose che le lingue esistenti fanno schifo.
Un sistema di tipo dinamico, ad esempio, può essere emulato sopra un sistema di tipo OO statico dichiarando tutte le variabili, i parametri ei valori restituiti come il tipo Object
di base e quindi utilizzando la reflection per accedere ai dati specifici all'interno , quindi quando ti rendi conto di ciò, vedi che non c'è letteralmente niente che puoi fare in un linguaggio dinamico che non puoi fare in un linguaggio statico. Ma farlo in questo modo sarebbe un gran casino, naturalmente.
Il tizio della citazione è corretto che i tipi statici limitano ciò che puoi fare, ma questa è una caratteristica importante, non un problema. Le linee sulla strada limitano ciò che puoi fare nella tua auto, ma le trovi restrittive o utili? (So che non vorrei guidare su una strada trafficata e complessa dove non c'è nulla che dirà le macchine che vanno nella direzione opposta a stare dalla loro parte e non venire dove sto guidando!) Stabilendo regole che delineano chiaramente cosa è considerato un comportamento non valido e assicurandoti che non accada, diminuisci notevolmente le possibilità che si verifichi un brutto incidente.
Inoltre, ha sbagliato l'altra parte. Non è che "tutti i programmi interessanti che vuoi scrivere funzionino come tipi", ma piuttosto "tutti i programmi interessanti che vuoi scrivere richiedono tipi." Una volta superato un certo livello di complessità, diventa molto difficile mantenere il codebase senza un sistema di tipi per tenerti in riga, per due motivi.
Primo, perché il codice senza annotazioni di tipo è difficile da leggere. Considera il seguente Python:
def sendData(self, value):
self.connection.send(serialize(value.someProperty))
Che cosa ti aspetti che i dati sembrino che il sistema all'altro capo della connessione riceva? E se riceve qualcosa che sembra completamente sbagliato, come fai a capire cosa sta succedendo?
Tutto dipende dalla struttura di value.someProperty
. Ma come si presenta? Buona domanda! Che cosa sta chiamando sendData()
? Che cosa sta passando? Che aspetto ha questa variabile? Da dove proviene? Se non è locale, devi tracciare l'intera cronologia di value
per rintracciare cosa sta succedendo. Forse stai passando qualcos'altro che ha anche una proprietà someProperty
, ma non fa quello che pensi che faccia?
Ora diamo un'occhiata a questo tipo di annotazioni, come puoi vedere nel linguaggio Boo, che usa una sintassi molto simile ma è tipizzato staticamente:
def SendData(value as MyDataType):
self.Connection.Send(Serialize(value.SomeProperty))
Se c'è qualcosa che non va, all'improvviso il tuo lavoro di debug ha ottenuto un ordine di grandezza più semplice: cerca la definizione di MyDataType
! Inoltre, la possibilità di ottenere comportamenti errati perché hai passato un tipo incompatibile che ha anche una proprietà con lo stesso nome improvvisamente si azzera, perché il sistema di tipi non ti consente di fare quell'errore.
Il secondo motivo si basa sul primo: in un progetto ampio e complesso, è probabile che tu abbia più contributori. (E se no, lo stai costruendo da tempo, che è essenzialmente la stessa cosa. Prova a leggere il codice che hai scritto 3 anni fa se non mi credi!) Ciò significa che non sai cosa fosse passando per la testa della persona che ha scritto quasi tutte le parti del codice nel momento in cui l'hanno scritta, perché non eri lì, o non ricordi se era il tuo codice molto tempo fa. Avere le dichiarazioni di tipo ti aiuta davvero a capire qual era l'intenzione del codice!
Le persone come il tizio nella citazione spesso errano i vantaggi della tipizzazione statica come "aiutare il compilatore" o "tutto sull'efficienza" in un mondo in cui risorse hardware quasi illimitate rendono questo aspetto sempre meno rilevante in ogni anno. Ma come ho mostrato, mentre questi benefici certamente esistono, il vantaggio principale è nei fattori umani, in particolare la leggibilità del codice e la manutenibilità. (L'efficienza aggiunta è certamente un bel bonus, però!)