La definizione di "Sistemi di tipo strong" [chiusa]

2

Ho visto il presunto "The Trouble with Types" di Martin Odersky. Ha diviso i linguaggi di programmazione in due dimensioni nella tabella "Paesaggio dei sistemi di tipi"; Una dimensione "Statico / Dinamica" e una "strong / Debole".

Ho cercato di trovare una definizione per "sistemi di tipo strong / debole" e la sua differenza dai sistemi di tipo "statico / dinamico" che possono spiegare perché Python / Ruby hanno un "sistema di tipo strong"? Ho trovato qualcosa su Wikipedia, ma non mi ha soddisfatto.

Ora voglio sapere qual è il "strong / debole"? e How Python ha un sistema di tipo strong (come come scala)? Si tratta di ereditarietà / tipi componibili / primitivi in una lingua o no? Se "no", qual è il concetto e unità di misura per queste caratteristiche (ereditarietà / composizione / primitivo / contenitore / ...) nei sistemi di tipi?

    
posta Reza Same'ei 02.09.2014 - 19:44
fonte

2 risposte

30

Un sistema di tipo strong è un sistema di tipi che ha una funzione di restrizione in fase di compilazione o di runtime che trovi interessante.

Un sistema di tipo debole è un sistema di tipi che non ha questa restrizione o caratteristica.

Seriamente, è così. Leggi la pagina di Wikipedia, quindi sai che ci sono almeno undici diversi significati reciprocamente incompatibili di "strongmente tipizzato". Il termine è inutile se non chiarito; non è necessario che due persone che discutono di un sistema di tipi abbiano la stessa definizione nella loro testa di "strongmente tipizzato".

La cosa sensata da fare è quindi evitare di usare interamente "forti" e "deboli"; quando parli di una funzionalità di un sistema di tipi, descrivi semplicemente la funzione anziché definirla come "strong" o "debole". Se intendi "Mi piacciono le lingue in cui il compilatore assegna i tipi statici alle espressioni e cerca gli errori di tipo", allora dillo. Se intendi "Mi piacciono le lingue in cui ogni oggetto ha uno o più tipi di dati associati e può descrivere questi tipi in modo riflessivo in fase di esecuzione", quindi dire . Non dire "strong" perché qualcuno penserà che tu intenda "staticamente dattiloscritto" e qualcuno penserà che tu intenda "ha una riflessione temporale" e queste due cose non hanno praticamente nulla a che fare l'una con l'altra.

Ricorda anche che molte persone usano "strong" per significare che una particolare restrizione del sistema di tipi è impossibile da ignorare, e alcuni usano "strong" per indicare il contrario: che una restrizione è incoraggiata ma può essere evitato. Ad esempio, qualcuno che crede che un sistema di tipi sia "strong" se gli errori di tipo sono impossibile in fase di esecuzione, caratterizzerebbe C # come "debolmente" digitato, perché C # consente allo sviluppatore di inserire conversioni di tipo che falliranno a runtime. (esempio: short x = (short)(object)(123.ToString()); ) Qualcuno che crede che un sistema di tipi sia "strong" se incoraggia scrivendo programmi in cui il compilatore trova molti ma non tutti digitare errori in fase di compilazione caratterizzerebbe C # come strongmente scritto per lo stesso motivo . Se la stessa caratteristica del sistema tipo può essere ragionevolmente caratterizzata sia come "strong" che come "debole", allora sappiamo che i termini sono inutili e dovrebbero essere evitati.

    
risposta data 02.09.2014 - 19:55
fonte
1

In poche parole, la forza di un sistema di tipi è la probabilità di ottenere un errore di mancata corrispondenza del tipo quando si tenta di fare cose nella lingua. Le lingue strongmente tipizzate hanno molti modi per ottenere un errore di disallineamento di tipo: tipo errato passato dentro o fuori da una funzione, tipo sbagliato assegnato a una variabile, tipo errato su un lato o l'altro di un operatore. Le lingue strongmente tipizzate ti consentono di creare i tuoi tipi con restrizioni simili. Linguaggi deboli tipizzati cercano di evitare errori di disallineamento di tipo. Ciò non significa che le variabili nei linguaggi debolmente tipizzati non hanno hanno tipi, solo che la lingua non aiuta il programmatore a controllare e applicare automaticamente quei tipi.

La tipizzazione strong è un continuum, non un assoluto. Anche le lingue strongmente tipizzate ritagliano eccezioni. Java scrive tipo la coercizione tra tipi numerici e dalla maggior parte dei tipi a String , ad esempio. Alcune caratteristiche del linguaggio come inferenza di tipo o impliciti danno un aspetto superficiale di digitazione più debole, ma sono ancora molto forti dietro le quinte. Non esiste una linea di divisione chiara, ma di solito è relativamente facile confrontare due lingue l'una con l'altra. Si potrebbe chiamare C ++ strongmente digitato rispetto a JavaScript, ma non paragonato a Haskell, per esempio.

Il termine viene spesso erroneamente utilizzato per indicare quanto sia espressivo un sistema di tipi, ma questa è una metrica separata. Viene anche spesso scambiato per la tipizzazione statica, che è una misura di quanto i tipi vengono controllati in fase di compilazione rispetto al tempo di esecuzione.

    
risposta data 02.09.2014 - 20:04
fonte

Leggi altre domande sui tag