Ciò è emerso in una discussione con un amico, e mi sono trovato in difficoltà a pensare a qualsiasi buon argomento. Quali vantaggi conferiscono una digitazione debole?
Ciò è emerso in una discussione con un amico, e mi sono trovato in difficoltà a pensare a qualsiasi buon argomento. Quali vantaggi conferiscono una digitazione debole?
Risposte:
Il problema con questo tipo di discussione è semplicemente che i termini "tipizzazione debole" e "tipizzazione forte" non sono definiti, a differenza dei termini "tipizzazione statica", "tipizzazione dinamica", "tipizzazione esplicita", "tipizzazione implicita", " dattilografia "," tipizzazione strutturale "o" tipizzazione nominale ". Diamine, anche i termini "tip manifest" e "tipizzazione latente", che sono ancora aree aperte di ricerca e discussione sono probabilmente meglio definiti.
Quindi, finché il tuo amico non fornisce una definizione del termine "digitazione debole" che sia abbastanza stabile da servire da base per una discussione, non ha nemmeno senso rispondere a questa domanda.
Sfortunatamente, a parte la risposta di Nick , nessuno dei rispondenti si è preso la briga di fornire la loro definizione, e puoi vedere la confusione che genera in alcuni dei commenti. È difficile da dire, dal momento che nessuno fornisce in realtà le loro definizioni, ma penso di contarne almeno tre diverse, proprio in questa stessa pagina.
Alcune delle definizioni più comunemente usate sono (e sì, so che praticamente nessuna di esse ha alcun senso, ma quelle sono le definizioni che ho visto che le persone usano effettivamente):
Le tre definizioni che sembrano essere utilizzate più ampiamente, tuttavia, lo sono
A meno che non tutti sono d'accordo su una definizione di ciò che "tipizzazione debole" anche è , non ha nemmeno senso pensare a quali potrebbero essere i suoi vantaggi. I vantaggi di cosa? Ancora peggio, se non esiste una definizione a tutti , allora tutti possono solo spostare le loro definizioni per soddisfare le loro argomentazioni, e ogni discussione è praticamente garantito per devolvere in un flamewar.
Io stesso ho modificato personalmente la mia definizione più volte nel corso degli anni e ora ho raggiunto il punto in cui non considero più utili i termini. Pensavo anche che la digitazione debole (nelle sue varie definizioni) abbia un posto nello scripting della shell, ma ogni volta che devo risolvere lo stesso problema in Bash e PowerShell, mi viene dolorosamente ricordato quanto mi sbagliavo.
Ricorda che ci sono due concetti principali che sono comunemente confusi:
Si dice che un linguaggio di programmazione sia tipizzato in modo dinamico quando la maggior parte del suo controllo del tipo viene eseguito in fase di esecuzione anziché in fase di compilazione. Nella tipizzazione dinamica, i valori hanno tipi ma le variabili no; vale a dire, una variabile può fare riferimento a un valore di qualsiasi tipo.
I vantaggi qui vengono spesso ignorati come solo per "nuovi" programmatori, ma possono anche essere convenienti per qualsiasi programmatore:
if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever
Meno codice in ogni caso in cui dovresti altrimenti trasmettere o assegnare un nuovo valore:
if (data is Array)) {
i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}
Digitazione debole significa che una lingua converte (o lancia) in modo implicito tipi quando viene utilizzata.
Benefici:
Valutazione booleana implicita . Qualsiasi tipo può essere valutato come un valore booleano. Ciò ha anche vantaggi collaterali come una parte di un ||
può essere utilizzata nell'assegnazione senza conversione in booleano:
var a = param || defaultValue;
Ancora una volta, meno codice:
var num = 5;
var str = "Hello";
input.innerHTML = input.value = num;
for (var i=0; i < input.value; i++) { ... }
Anche Java ha dovuto andare a metà strada, con la chiamata implicita a .toString()
quando si combinano oggetti con un String
; altrimenti i programmatori Java lo maledirebbero tutto il giorno (le istruzioni del registro sarebbero fuori controllo).
Entrambe le definizioni sono tratte da http://en.wikipedia.org/wiki/Type_system . Lo ha detto meglio di me.
if
si utilizza un blocco o qualche altra logica più complessa (anche runtime o dinamica), la riga successiva sarà legale e protetta da errori.
L'argomento principale per la digitazione debole è di prestazioni. (questo serve a rispondere alla domanda dei PO come indicato). Ci sono molte buone discussioni su dinamico vs. statico, implicito vs. esplicito. eccetera.
C è il più famoso linguaggio tipizzato debolmente e non esegue alcun controllo del tempo di esecuzione o controllo del tempo di compilazione del tipo di variabili. In sostanza puoi lanciare un char *
a int *
e alla lingua non importerebbe. Allora perché dovresti farlo?
La programmazione in C è abbastanza vicina al modo in cui faresti le cose con assembly, quindi ci sono momenti in cui ti interessa solo un indirizzo. Non è raro lanciare o trasmettere un void *
riferimento proprio per questo motivo. Se sai come è organizzata la memoria (di nuovo un problema di C e assembly), puoi fare dei calcoli piuttosto interessanti in base all'indirizzo nel void *
per ottenere le informazioni di cui hai bisogno. Questo può consentire di cortocircuitare il processo che dovresti seguire in Java per esempio.
Mentre il controllo del tipo di runtime non ha un sovraccarico straordinario, ci sono momenti in cui è sufficiente per rendere una sezione critica troppo lenta. In questo caso sto pensando principalmente alla programmazione integrata e ai sistemi in tempo reale.
Detto questo, nella maggior parte dei casi avere un sistema di tipo forte che è controllato in fase di compilazione o in fase di runtime aiuta più spesso di quanto faccia male.
La digitazione debole è in genere più facile da comprendere per i neofiti, ad esempio in Excel, JavaScript e vbscript. Scambia anche una certa velocità di sviluppo per potenziali errori.
Buon articolo sull'argomento: tipizzazione forte vs test forti