Questo è venuto in una discussione con un amico, e mi sono trovato in difficoltà a pensare a un argomento valido. Quali vantaggi conferisce la digitazione debole?
Questo è venuto in una discussione con un amico, e mi sono trovato in difficoltà a pensare a un argomento valido. Quali vantaggi conferisce la digitazione debole?
Il problema con questo tipo di discussione è semplicemente che i termini "tipizzazione debole" e "tipizzazione strong" sono indefiniti, diversamente dai termini "tipizzazione statica", "tipizzazione dinamica", "tipizzazione esplicita", "digitazione implicita" "," digitazione anatra "," tipizzazione strutturale "o" digitazione nominale ". Diamine, anche i termini "manifest typing" e "latent typing", 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" 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 tu puoi vedere la confusione che genera in alcuni dei commenti. È difficile da dire, dal momento che nessuno in realtà fornisce le loro definizioni, ma penso di contarne almeno tre diversi, proprio su questa stessa pagina.
Alcune delle definizioni più comunemente usate sono (e sì, io so che praticamente nessuna di esse ha senso, ma quelle sono le definizioni che ho visto che le persone effettivamente usano):
Le tre definizioni che sembrano essere usate la maggior parte ampiamente, tuttavia, sono
A meno che tutti siano d'accordo su una definizione di ciò che "digitando in modo debole" anche è , non ha nemmeno senso pensare a quali potrebbero essere i suoi vantaggi. I vantaggi di cosa? Ancora peggio, se non c'è una definizione a tutti , allora tutti possono semplicemente spostare le loro definizioni per adattarle ai loro argomenti, e ogni discussione è praticamente garantita per trasformarsi in un flamewar.
Personalmente ho cambiato personalmente la mia definizione più volte nel corso degli anni e ora ho raggiunto il punto in cui non considero nemmeno più i termini utili. Pensavo anche che la digitazione debole (nelle sue varie definizioni) abbia un posto nello scripting di shell, ma ogni volta che devo risolvere lo stesso problema in Bash e PowerShell, mi viene dolorosamente ricordato quanto stavo male.
Ricorda che ci sono due concetti principali che sono comunemente confusi:
A programming language is said to be dynamically typed when the majority of its type checking is performed at run-time as opposed to at compile-time. In dynamic typing, values have types but variables do not; that is, a variable can refer to a value of any type.
I vantaggi qui vengono spesso ignorati solo per i "nuovi" programmatori, ma possono anche essere utili per qualsiasi programmatore:
if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever
Meno codice in ogni caso in cui altrimenti dovresti trasmettere o assegnare un nuovo valore:
if (data is Array)) {
i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}
Weak typing means that a language implicitly converts (or casts) types when used.
I vantaggi:
Valutazione booleana implicita . Qualsiasi tipo può essere valutato come booleano. Questo ha anche vantaggi secondari come una parte di un ||
può essere utilizzato nel compito senza conversione in booleano:
var a = param || defaultValue;
Ancora, meno codice:
var num = 5;
var str = "Hello";
input.innerHTML = input.value = num;
for (var i=0; i < input.value; i++) { ... }
Anche Java doveva andare a metà, con la chiamata implicita a .toString()
quando si combinano gli oggetti con String
; altrimenti i programmatori Java lo maledicerebbero tutto il giorno (le dichiarazioni dei log sarebbero fuori controllo).
Entrambe le definizioni provengono dal link . Lo ha detto meglio di me.
L'argomento principale per la digitazione debole è una delle prestazioni. (questo è per rispondere alla domanda OPs come indicato). C'è molta buona discussione su dinamico contro statico, implicito contro esplicito. ecc.
C è il più famoso linguaggio debolmente dattiloscritto, e non esegue alcun controllo o verifica del tempo di esecuzione del tipo di variabili. In sostanza puoi lanciare un char *
a un int *
e la lingua non interessa. Quindi, perché dovresti farlo?
La programmazione in C è molto simile a quella che faresti con il montaggio, quindi ci sono momenti in cui ti interessa solo un indirizzo. Non è infrequente eseguire il cast o passare un riferimento a void *
proprio per questo motivo. Se sai come è organizzata la memoria (di nuovo un problema di C e di assemblaggio), puoi fare dei calcoli piuttosto interessanti basati sull'indirizzo in void *
per ottenere le informazioni di cui hai bisogno. Questo può farti cortocircuitare il processo che dovresti passare in Java, per esempio.
Sebbene il controllo del tipo di runtime non abbia un sovraccarico straordinario, ci sono momenti in cui è sufficiente per causare una sezione critica troppo lenta. In questo caso, penso principalmente alla programmazione embedded e ai sistemi in tempo reale.
Detto questo, nella maggior parte dei casi un sistema di tipo strong che è in fase di compilazione o in fase di esecuzione controlla più spesso di quanto faccia male.
La tipizzazione debole è in genere più facile da comprendere per i neofiti, ad esempio in Excel, javascript e vbscript. Puoi anche scambiare alcune velocità di sviluppo per potenziali errori.
Buon articolo sull'argomento: Strong typing vs Strong testing
Leggi altre domande sui tag type-systems type-safety weak-typing