Quali argomenti ci sono in favore di una digitazione debole?

39

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?

    
posta Fishtoaster 19.01.2011 - 05:55
fonte

4 risposte

47

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):

  • digitazione debole = digitazione non sicura / tipizzazione strong = digitazione sicura
  • digitazione debole = digitazione dinamica / tipizzazione strong = tipizzazione statica
  • digitazione debole = digitazione anatra / tipizzazione strong = battitura nominale
  • digitazione debole = tipizzazione strutturale / tipizzazione strong = tipizzazione nominale
  • digitazione debole = digitazione implicita / tipizzazione strong = tipizzazione esplicita
  • typing debole = tipizzazione latente / tipizzazione strong = digitazione manifest
  • digitazione debole = no digitazione / tipizzazione strong = digitazione
  • typing debole = cast implicito / tipizzazione strong = solo cast espliciti
  • typing debole = cast implicito o esplicito / tipizzazione strong = nessun cast in assoluto
  • digitazione debole = conversioni implicite / tipizzazione strong = solo conversioni esplicite
  • scrittura debole = conversioni implicite o esplicite / tipizzazione strong = nessuna conversione
  • weak typing = interpretazione / strong typing = compilation
  • digitazione debole = digitazione lenta / strong = veloce
  • weak typing = garbage collection / strong typing = gestione della memoria manuale
  • weak typing = gestione della memoria manuale / tipizzazione strong = garbage collection
  • ... e molti altri

Le tre definizioni che sembrano essere usate la maggior parte ampiamente, tuttavia, sono

  • weak typing = il tuo stupido linguaggio di programmazione schifoso / tipizzazione strong = il mio linguaggio di programmazione super-fantastico
  • typing debole = ogni altro linguaggio di programmazione / tipizzazione strong = l'unico linguaggio di programmazione che abbia mai preso in esame (di solito Java, C # o C ++, stranamente, le persone che imparano ad esempio Haskell o Scheme come prima e unica lingua non sembra condividere questa visione del mondo)
  • scrittura debole = ogni lingua che non capisco / strong typing = Java (sostituto con C # o C ++ a volontà)

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.

    
risposta data 19.01.2011 - 21:49
fonte
25

Ricorda che ci sono due concetti principali che sono comunemente confusi:

Dattilografia dinamica

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;
}

Dattilità allentata o debole

Weak typing means that a language implicitly converts (or casts) types when used.

I vantaggi:

  • Passa qualsiasi valore di tipo come parametro a una funzione . Utile per callback, API flessibili e rende più semplice l'implementazione di chiusure.
  • 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.

    
risposta data 19.01.2011 - 06:45
fonte
6

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.

    
risposta data 19.01.2011 - 22:07
fonte
2

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

    
risposta data 19.01.2011 - 06:00
fonte

Leggi altre domande sui tag