it-swarm.it

Quali sono gli argomenti a favore della 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?

41
Fishtoaster

Il problema con questo tipo di discussione è semplicemente che i termini "tipizzazione debole" e "tipizzazione forte" sono indefiniti, a differenza ad esempio 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, fino a quando 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 propria 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 pagina.

Alcune delle definizioni più comunemente usate sono (e sì, io so che praticamente nessuna di esse ha alcun senso, ma quelle sono le definizioni che ho le persone viste usano effettivamente):

  • digitazione debole = digitazione non sicura/digitazione forte = digitazione sicura
  • tipizzazione debole = tipizzazione dinamica/tipizzazione forte = tipizzazione statica
  • tipizzazione debole = tipizzazione anatra/tipizzazione forte = tipizzazione nominale
  • tipizzazione debole = tipizzazione strutturale/tipizzazione forte = tipizzazione nominale
  • tipizzazione debole = tipizzazione implicita/tipizzazione forte = digitazione esplicita
  • digitazione debole = digitazione latente/digitazione forte = digitazione manifest
  • digitazione debole = nessuna digitazione/digitazione forte = digitazione
  • tipizzazione debole = cast impliciti/tipizzazione forte = solo cast espliciti
  • digitazione debole = cast impliciti o espliciti/tipizzazione forte = nessun cast
  • digitazione debole = conversioni implicite/digitazione forte = solo conversioni esplicite
  • digitazione debole = conversioni implicite o esplicite/digitazione forte = nessuna conversione
  • tipizzazione debole = interpretazione/tipizzazione forte = compilazione
  • digitazione debole = digitazione lenta/forte = veloce
  • digitazione debole = garbage collection/digitazione avanzata = gestione manuale della memoria
  • digitazione debole = gestione manuale della memoria/digitazione forte = garbage collection
  • … e molti altri

Le tre definizioni che sembrano essere utilizzate la maggior parte , tuttavia, lo sono

  • digitazione debole = il tuo stupido linguaggio di programmazione schifoso/tipizzazione forte = il mio linguaggio di programmazione super fantastico
  • digitazione debole = ogni altro linguaggio di programmazione/digitazione forte = l'unico linguaggio di programmazione che mi sia mai preso la briga di imparare (di solito Java, C # o C++; stranamente, le persone che imparano ad esempio Haskell o Scheme come il loro primo e unico linguaggio non sembrano condividere questa visione del mondo)
  • digitazione debole = ogni lingua che non capisco/tipizzazione forte = Java (sostituire con C # o C++ a piacere)

A meno che tutti non siano d'accordo su una definizione di che tipo di "digitazione debole" sia sia , non ha nemmeno senso pensare a quali potrebbero essere i suoi vantaggi. I vantaggi di cosa? Ancora peggio, se non esiste alcuna definizione , allora tutti possono semplicemente spostare le proprie definizioni per adattarle ai propri argomenti, e ogni discussione è praticamente garantita per deviare in una fiamma di fiamma.

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 negli script di Shell, ma ogni volta che devo risolvere lo stesso problema in Bash e PowerShell, mi viene dolorosamente ricordato quanto mi sbagliavo.

46
Jörg W Mittag

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

Digitazione dinamica

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 libera o debole

Digitazione debole significa che una lingua converte (o lancia) in modo implicito tipi quando viene utilizzata.

Benefici:

  • Passa qualsiasi valore di tipo come parametro a una funzione . Utile per richiamate, API flessibili e semplifica l'implementazione delle chiusure.
  • Valutazione booleana implicita . Qualsiasi tipo può essere valutato come un valore booleano. Ciò ha anche vantaggi collaterali come una parte di un || Che può essere utilizzato 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 doveva andare parzialmente, con la chiamata implicita a .toString() quando si combinavano oggetti con un String; altrimenti Java = i programmatori 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.

25
Nicole

L'argomento principale for typing debole è di performance. (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 * ad int * e alla lingua non importerebbe. Allora perché dovresti farlo?

La programmazione C è molto simile al modo in cui faresti le cose con Assembly, quindi ci sono momenti in cui ti interessa solo un indirizzo. Non è insolito lanciare o passare 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 basati sull'indirizzo nel void * per ottenere le informazioni di cui hai bisogno. Questo può farti 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.

7
Berin Loritsch

Una 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 forte

2
Homde