Quali sono gli argomenti a favore della digitazione debole?


40

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?


17
Engineering and Compiler di Cooper e Torczon definisce la tipizzazione debole come impiegando un sistema di tipo mal progettato. Che sicuramente non suona come sarebbe vantaggioso per nessuno.
Corbin, marzo

@Corbin March: Bello. Devo aggiungerlo alla mia lista.
Jörg W Mittag,

5
Il miglior argomento può essere dato dai dirigenti aziendali: mi permette di assumere persone a basso costo per costruire i miei sistemi
Vector

Risposte:


46

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

  • 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
  • tipizzazione 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 più ampiamente, 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 io abbia mai avuto 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 a piacere con C # o C ++)

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.


5
Risposta abbastanza cinica! Capisco da dove vieni ma ritengo sia "abbastanza buono" da indovinare che chiunque non fornisca una definizione si riferisca a "digitazione debole e / o dinamica", motivo per cui ho inserito entrambi nella mia risposta. So che non è perfetto, ma molte persone sembrano sintonizzarsi quando si tratta di definire i sistemi di tipo.
Nicole,

7
@Renesis: lo definirei "realismo" :-) Ho visto abbastanza discussioni sui sistemi di tipi per rendermi conto che metà delle persone non capisce che stanno parlando di cose completamente diverse e l'altra non sa di cosa stanno parlando su affatto . Un paio di mesi fa, c'è stata una discussione sull'elenco di sviluppo principale di una lingua che non nominerò, sull'aggiunta di un sistema di tipi opzionale per migliorare le prestazioni. Quella discussione è andata avanti per una settimana, coinvolgendo dozzine di persone e centinaia di mail. Non si rese conto che un sistema di tipo facoltativo , per definizione, non può migliorare le prestazioni. ...
Jörg W Mittag,

8
+1 per il cinismo! Potresti aggiungere "tipizzazione forte = quando l'IDE conosce i tipi delle mie variabili (Intellisense ecc.),
Digitazione

1
I nomi meglio definiti per i sistemi di battitura mancano del giudizio di valore implicito debole e forte .
Eva,

1
Splendido, divertente e preciso. Più ho imparato a conoscere i sistemi di tipi, più mi sono reso conto di quanto tempo ho sofferto sotto l'illusione che una lingua fosse diversa da un'altra in un modo in cui non lo era affatto. È incredibile quanta confusione provochi questo concetto, e penso davvero che non sia necessario se solo accettiamo che il debole / forte non è una cosa reale, quindi parliamo di qualcosa che in realtà è e forse impareremo qualcosa.
BrianH,

25

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 per un'implementazione più semplice delle chiusure.
  • 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.


1
La digitazione dinamica è utile anche laddove sarebbe richiesta molta generazione di codice in un linguaggio di tipo statico. Confronta la quantità di generazione di codice richiesta, ad esempio, Entity Framework in C # con le librerie ORM in linguaggi tipizzati dinamicamente (PHP, Python, ecc.). Anche se alcuni potrebbero sostenere che i vantaggi in termini di IDE IntelliSense supera il costo di tutta quella generazione di codice ...
Dean Harding,

3
Il tuo commento "// no i = ((Array) data) .length o Array myArr = (Array) data;" non ha nulla a che fare con la tipizzazione dinamica, poiché l'array di dati è dimostrabile in fase di compilazione. Un linguaggio tipicamente statico potrebbe propagare le conoscenze ottenute da instanceof.
Peter Taylor,

@Peter Taylor, suppongo sia vero in casi semplici, ne conosci qualcuno che lo fa? Ha a che fare con la digitazione dinamica in quanto se ifsi utilizza un blocco o qualche altra logica più complessa (anche runtime o dinamica), la riga successiva sarà legale e protetta da errori.
Nicole,

@Renesis, no, no. Ma la famiglia di lingue ML è tipizzata staticamente e usa l'inferenza del tipo, quindi molto raramente devi dichiarare esplicitamente il tipo di una variabile.
Peter Taylor,

1
@Peter Taylor è corretto. Molti dei vantaggi della tipizzazione dinamica sono disponibili in lingue con migliori sistemi di tipizzazione statica, come Haskell, Scala o persino C # in alcuni casi. Direi che il vantaggio principale della digitazione dinamica è gestire cose intrinsecamente non tipabili, come il DOM HTML. Perché scrivere node ["attr"] invece di node.attr? Sono comunque sempre risolti in fase di esecuzione.
Matt Olenik,

7

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.


2
Non vedo perché un linguaggio fortemente tipizzato non possa essere compilato in modo efficiente come C. Ma il compilatore dovrebbe essere molto più complesso.
9000

2
C ++ è un esempio di uno di questi linguaggi. In C ++ tutto il controllo del tipo viene eseguito in fase di compilazione e nessuno viene eseguito in fase di esecuzione ... A MENO CHE non sia abilitato RTTI.
Berin Loritsch,

2
Non sono sicuro di essere d'accordo con questo argomento di prestazione, ma è una visione interessante.
Martin Ba

2

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


1
Non penso che ci sia una forte corrispondenza tra le lingue debolmente tipizzate e le lingue amiche dei neofiti. Ruby e Python sono fortemente tipizzati e generalmente considerati newbie friendly. C è tipizzato debolmente e generalmente considerato newbie ostile.
sepp2k,

No, non la lingua in generale, stavo solo parlando della digitazione
Homde

2
Dinamica e fortemente tipizzata sono la combinazione adatta ai principianti. Anche se ho visto che quando le persone passano da una lingua tipizzata staticamente a una lingua tipizzata in modo dinamico, diventano anche molto confuse. Non ho mai visto qualcuno che ha iniziato a scrivere in modo dinamico, dato che le scuole finiscono per insegnare C o Java per la maggior parte del tempo.
jsternberg,

3
@Mchl: questo non ha nulla a che fare con la digitazione statica / dinamica o forte / debole. Dover dichiarare i tipi riguarda la tipizzazione esplicita / implicita.
Jörg W Mittag,

1
Potrebbe anche essere;) Quindi sono passato anche dal linguaggio esplicitamente al linguaggio tipizzato implicitamente. Correggimi se sbaglio Pascal è tipizzato in modo statico, forte ed esplicito, mentre PHP è digitato in modo dinamico, debole e implicito, vero?
Mchl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.