Risposta breve: no, perché l'equivalenza di Turing.
Risposta lunga: Questo ragazzo è un troll. Sebbene sia vero che i sistemi di tipi "ti limitano a un sottoinsieme", le cose esterne a 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 è un linguaggio progettato per la programmazione generale, oltre a molti altri che non lo sono; è una barra piuttosto bassa da cancellare e ci sono diversi esempi di un sistema che sta diventando Turing- completare involontariamente) è possibile eseguire qualsiasi altro linguaggio di programmazione completo di Turing. Questo si chiama "equivalenza di Turing" e significa solo esattamente ciò che dice. È importante sottolineare che non significa che puoi fare l'altra cosa altrettanto facilmente nell'altra lingua - alcuni potrebbero sostenere che questo è l'intero punto della creazione di un nuovo linguaggio di programmazione: per darti un modo migliore di fare certe cose che fanno schifo le lingue esistenti.
Un sistema di tipo dinamico, ad esempio, può essere emulato sopra un sistema di tipo OO statico dichiarando semplicemente tutte le variabili, i parametri e i valori di ritorno come Object
tipo di base e quindi usando la riflessione per accedere ai dati specifici all'interno, quindi quando ti rendi conto di questo 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, ovviamente.
Il ragazzo della citazione ha ragione nel dire 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 in cui non c'è niente che dice alle macchine che vanno nella direzione opposta per tenersi dalla loro parte e non venire dove sto guidando!) Stabilendo regole che delineano chiaramente ciò che è considerato un comportamento non valido e assicurando che non accada, si riducono notevolmente le possibilità che si verifichi un brutto incidente.
Inoltre, sta caratterizzando male l'altra parte. Non è che "tutti i programmi interessanti che vuoi scrivere funzioneranno come tipi", ma piuttosto "tutti i programmi interessanti che vuoi scrivere richiederanno tipi". Una volta superato un certo livello di complessità, diventa molto difficile mantenere la base di codice senza un sistema di tipi per mantenerti in linea, per due motivi.
Innanzitutto, perché il codice senza annotazioni di tipo è difficile da leggere. Considera il seguente Python:
def sendData(self, value):
self.connection.send(serialize(value.someProperty))
Come prevedete che i dati assomiglino al sistema ricevuto dall'altra parte della connessione? E se sta ricevendo qualcosa che sembra completamente sbagliato, come fai a capire cosa sta succedendo?
Tutto dipende dalla struttura di value.someProperty
. Ma che aspetto ha? Buona domanda! Cosa sta chiamando sendData()
? Che cosa sta passando? Che aspetto ha quella variabile? Da dove proviene? Se non è locale, è necessario rintracciare l'intera storia value
per rintracciare ciò che sta accadendo. Forse stai passando qualcos'altro che ha anche una someProperty
proprietà, ma non fa quello che pensi che faccia?
Ora diamo un'occhiata con le annotazioni dei tipi, come potresti vedere nel linguaggio Boo, che utilizza una sintassi molto simile ma è tipicamente statico:
def SendData(value as MyDataType):
self.Connection.Send(Serialize(value.SomeProperty))
Se c'è qualcosa che non va, improvvisamente il tuo lavoro di debug ha appena ottenuto un ordine di grandezza più semplice: cerca la definizione di MyDataType
! Inoltre, la possibilità di ottenere comportamenti scorretti perché hai passato un tipo incompatibile che ha anche una proprietà con lo stesso nome improvvisamente va a zero, perché il sistema dei tipi non ti consente di commettere quell'errore.
Il secondo motivo si basa sul primo: in un progetto ampio e complesso, molto probabilmente hai più collaboratori. (E se no, lo stai costruendo da te per molto 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 passare attraverso il capo della persona che ha scritto quasi ogni parte del codice nel momento in cui l'hanno scritto, perché non eri lì, o non ricordi se era il tuo codice molto tempo fa. Avere dichiarazioni di tipo ti aiuta davvero a capire qual era l'intenzione del codice!
Le persone come il ragazzo nella citazione spesso descrivono erroneamente i vantaggi della tipizzazione statica come "aiutare il compilatore" o "tutto sull'efficienza" in un mondo in cui risorse hardware quasi illimitate lo rendono sempre meno rilevante ogni anno che passa. Ma come ho dimostrato, mentre certamente esistono questi benefici, il vantaggio principale risiede nei fattori umani, in particolare la leggibilità e la manutenibilità del codice. (L'efficienza aggiunta è certamente un bel bonus, però!)