Classificazione dei sistemi di tipi (forte / debole, dinamico / statico)


23

In breve: come sono classificati i sistemi di tipi in contesti accademici; in particolare, dove posso trovare fonti affidabili che chiariscono le distinzioni tra i diversi tipi di sistema di tipi?

In un certo senso la difficoltà con questa domanda non è che non riesco a trovare una risposta, ma piuttosto che riesco a trovarne troppi e nessuno si distingue come corretto. Lo sfondo è che sto tentando di migliorare un articolo sulla wiki di Haskell sulla digitazione , che attualmente rivendica le seguenti distinzioni:

  • Nessuna digitazione: la lingua non ha nozioni di tipi o da una prospettiva tipizzata: esiste esattamente un tipo nella lingua. Il linguaggio assembly ha solo il tipo 'bit pattern', Rexx e Tk hanno solo il tipo 'text', il core MatLab ha solo il tipo 'matrice a valore complesso'.
  • Digitazione debole: ci sono solo pochi tipi distinti e forse digitare sinonimi per diversi tipi. Ad esempio, C utilizza numeri interi per valori booleani, interi, caratteri, set di bit ed enumerazioni.
  • Digitazione forte: set di tipi a grana fine come in Ada, lingue Wirthian (Pascal, Modula-2), Eiffel

Questo è del tutto contrario alla mia percezione personale, che era più sulla falsariga di:

  • Digitazione debole: gli oggetti hanno tipi, ma vengono implicitamente convertiti in altri tipi quando il contesto lo richiede. Ad esempio, Perl, PHP e JavaScript sono tutte le lingue in cui "1"possono essere utilizzate più o meno in qualsiasi contesto 1possibile.
  • Digitazione forte: gli oggetti hanno tipi e non ci sono conversioni implicite (sebbene il sovraccarico possa essere usato per simularli), quindi usare un oggetto nel contesto sbagliato è un errore. In Python, l'indicizzazione di un array con una stringa o float genera un'eccezione TypeError; in Haskell fallirà al momento della compilazione.

Ho chiesto opinioni al riguardo ad altre persone più esperte nel campo di me, e una ha dato questa caratterizzazione:

  • Digitazione debole: l'esecuzione di operazioni non valide sui dati non è controllata o rifiutata, ma produce semplicemente risultati non validi / arbitrari.
  • Scrittura forte: le operazioni sui dati sono consentite solo se i dati sono compatibili con l'operazione.

A quanto ho capito, la prima e l'ultima caratterizzazione chiamerebbero C tipizzato in modo debole, il secondo lo chiamerebbe fortemente tipizzato. Il primo e il secondo chiamerebbero Perl e PHP tipicamente debolmente, il terzo li chiamerebbe fortemente tipizzati. Tutti e tre descriverebbero Python come fortemente tipizzato.

Penso che la maggior parte delle persone mi direbbe "beh, non c'è consenso, non c'è un significato accettato dei termini". Se quelle persone hanno torto, sarei felice di saperlo, ma se hanno ragione, come possono i ricercatori CS descrivere e confrontare i sistemi di tipi? Quale terminologia posso usare che è meno problematica?

Come domanda correlata, ritengo che la distinzione dinamica / statica sia spesso data in termini di "tempo di compilazione" e "tempo di esecuzione", che trovo insoddisfacente dato che la compilazione di una lingua non è tanto una proprietà di quella lingua come sue implementazioni. Sento che dovrebbe esserci una descrizione puramente semantica della tipizzazione dinamica contro statica; qualcosa sulla falsariga di "un linguaggio statico è uno in cui ogni sottoespressione può essere digitata". Gradirei qualsiasi pensiero, in particolare i riferimenti, che chiarisca questa nozione.


6
Penso che tu abbia già la tua risposta: non esiste una definizione accettata di digitazione debole e forte.
svick,

Non lo troverei difficile da credere, ma faccio la domanda nella speranza che ce ne sia uno di cui non ho sentito parlare :) o almeno una definizione più autorevole di quella che un tizio che ha modificato un wiki ritiene sia il caso .
Ben Millwood,

3
Per ulteriori discussioni su questo, vedere questa domanda correlata su SO .
svick

1
Per rafforzare il punto di svick, non è possibile trovare un riferimento di autorità su qualcosa che non è accettato. Qualunque cosa che affermi di essere autorevole sarebbe semplicemente sbagliata (poiché potrebbe essere fornito un numero qualsiasi di contro-esempi).
edA-qa mort-ora-y

Bene, c'è una differenza tra qualcuno che scrive un documento che dice "ecco la vera definizione su cui tutti sono d'accordo" e qualcuno che scrive un documento che dice "ecco le definizioni che userò per questo documento, anche se so che ci sono altri". Anche quest'ultimo sarebbe meglio di quello che so finora. Penso che tu abbia ragione, però, in questo caso, quello che fanno le persone hanno da dire sui diversi tipi di sistema di tipo? La distinzione dinamica / statica, almeno, è concreta?
Ben Millwood,

Risposte:


18

Storicamente, il termine "linguaggio di programmazione fortemente tipizzato" è entrato in uso negli anni '70 in risposta agli attuali linguaggi di programmazione ampiamente utilizzati, molti dei quali presentavano buchi di tipo. Qualche esempio:

  • In Fortran, c'erano cose chiamate aree di memoria "COMMON", che potevano essere condivise tra i moduli, ma non c'erano controlli per vedere se ciascun modulo stava dichiarando il contenuto della memoria COMMON con gli stessi tipi. Pertanto, un modulo potrebbe dichiarare che un determinato blocco di memoria COMMON aveva un numero intero e un altro un numero in virgola mobile e, di conseguenza, i dati venivano danneggiati. Fortran aveva anche dichiarazioni "EQUIVALENCE", in base alle quali si poteva dichiarare che la stessa memoria conteneva due diversi oggetti di diverso tipo.

  • In Algol 60, il tipo di parametri della procedura è stato dichiarato solo come "procedura", senza specificare i tipi di parametri della procedura. Quindi, si potrebbe presumere che un parametro di procedura fosse una procedura che accetta numeri interi, ma passare come argomento una procedura di accettazione reale. Ciò comporterebbe lo stesso tipo di corruzione delle dichiarazioni COMUNE ed EQUIVALENZA. (Tuttavia, Algol 60 ha eliminato i problemi più vecchi.)

  • In Pascal sono stati aggiunti "record delle varianti" che erano quasi esattamente come le vecchie dichiarazioni di EQUIVALENCE.

  • In C, sono stati aggiunti "tipi di cast" per cui qualsiasi tipo di dati può essere reinterpretato come dati di tipo diverso. Questo era un buco di tipo piuttosto deliberato pensato per i programmatori che presumibilmente sanno cosa stanno facendo.

I linguaggi fortemente tipizzati progettati negli anni '70 avevano lo scopo di eliminare tutti questi tipi di buchi. Se si analizza il significato di ciò, significa essenzialmente che le rappresentazioni dei dati sono protette. Non è possibile visualizzare un oggetto dati di un tipo come un oggetto di un altro tipo che ha lo stesso modello di bit della sua rappresentazione interna. I teorici iniziarono a usare il termine "indipendenza rappresentativa" per caratterizzare questa proprietà invece della vaga idea di "tipizzazione forte".

Si noti che i linguaggi tipizzati dinamicamente come Lisp che eseguono il controllo completo del tipo di runtime sono "fortemente tipizzati" nel senso di proteggere le rappresentazioni. Allo stesso tempo, le lingue tipizzate staticamente perderebbero l'indipendenza della rappresentazione a meno che non eseguissero il controllo dei limiti dell'array. Quindi, non sono "fortemente tipizzati" nel senso stretto del termine. A causa di queste conseguenze anomale, il termine "fortemente tipizzato" cadde in disuso dopo gli anni '70. Quando il Dipartimento della Difesa degli Stati Uniti ha sviluppato requisiti rigorosi per la progettazione di Ada, ha incluso il requisito secondo cui la lingua dovrebbe essere "fortemente tipizzata". (Sembra che a quel tempo si credesse che l'idea di "fortemente tipizzato" fosse evidente. Nessuna definizione fu offerta. ) Tutte le proposte linguistiche presentate in risposta hanno affermato di essere "fortemente tipizzate". Quando Dijkstra ha analizzato tutte le proposte linguistiche, ha scoperto che nessuna di esse era fortemente tipizzata e, in effetti, non era nemmeno chiaro cosa significasse il termine. Vedi il rapportoEWD663 . Tuttavia, vedo che il termine sta tornando in uso ora, attraverso una generazione più giovane di ricercatori che non conoscono la storia a scacchi del termine.

Il termine "tipizzato staticamente" significa che tutto il controllo del tipo viene eseguito staticamente e non si verificheranno errori di tipo in fase di esecuzione. Se anche la lingua è fortemente tipizzata, ciò significa che non ci sono davvero errori di tipo durante l'esecuzione. Se, d'altra parte, ci sono buchi di tipo nel sistema di tipi, l'assenza di errori di tipo runtime non significa nulla. I risultati potrebbero essere completamente corrotti.

Il nuovo dibattito sulla "tipizzazione forte vs debole" sembra riguardare la possibilità di consentire determinate conversioni di tipi. Consentire una stringa in cui è richiesto un numero intero è "tipizzazione debole" secondo queste persone. C'è un senso in questo perché il tentativo di convertire una stringa in un numero intero potrebbe non riuscire, se la stringa non rappresenta un numero intero. Tuttavia, la conversione di un numero intero in una stringa non presenta questo problema. Sarebbe un esempio di "tipizzazione debole" secondo queste persone? Non ne ho idea. Noto che le discussioni di Wikipedia sulla "tipizzazione debole" non citano alcuna pubblicazione arbitrale. Non credo che sia un'idea coerente.

Nota aggiunta : il punto fondamentale è che il termine "tipizzazione forte" non è entrato in uso come termine tecnico con una definizione rigorosa. È stato più simile a quello che alcuni designer linguistici hanno ritenuto: "il nostro sistema di tipi è forte; rileva tutti gli errori di tipo; non ha buchi di tipo" e, quindi, quando hanno pubblicato il loro design del linguaggio, hanno affermato che era "fortemente tipizzato" . Era una parola vivace che suonava bene e la gente ha iniziato a usarla. Il documento Cardelli-Wegner è stato il primo che ho visto dove sono state fornite alcune analisi su cosa significhi. Il mio post qui dovrebbe essere considerato come un'elaborazione della loro posizione.


Puoi darci dei riferimenti per lo sviluppo storico? "l'assenza di errori di tipo runtime non significa nulla" - intendi il tempo di compilazione qui?
Raffaello

Ecco un articolo su Euclide che è apparso su Google Scholar. Ricordo di aver visto diversi articoli negli anni '70, in cui le lingue venivano dichiarate fortemente tipizzate. È stato generalmente pensato come un passo di vendita.
Uday Reddy,

1
@Raphael. Intendevo "errori di tipo runtime". Per arrivare al runtime, il programma dovrebbe in primo luogo superare la verifica statica del tipo. Il punto è che un linguaggio fortemente tipizzato, ad esempio Java, fornirà errori di tipo in fase di esecuzione quando non è in grado di verificarli in fase di compilazione. Un linguaggio di tipo buco, ad esempio C, consentirà al runtime di produrre immondizia invece di dare errori.
Uday Reddy,

1
@benmachine. Vedi la sezione sul "controllo del tipo" nel documento di Euclide che ho citato. Penso che il punto principale sia che "fortemente tipizzato" sia una parola d'ordine. Non è una nozione tecnica. Nella migliore delle ipotesi, il suo contenuto tecnico significa che non ci sono buchi di tipo.
Uday Reddy,

1
In un'implementazione moderna tipica in cui due diversi tipi interi hanno la stessa rappresentazione (ad esempio entrambi inte longessendo 32 bit, oppure entrambi longe long longessendo 64, un programma che utilizza un puntatore a uno di questi tipi per scrivere un po 'di memoria e usa un puntatore dell'altro tipo leggerlo, in genere non causerà un errore di runtime rilevabile, ma potrebbe funzionare in modo arbitrario in altri modi arbitrari. Il moderno C perde così la sicurezza del tipo presente in altre lingue, senza acquisire alcuna semantica che le implementazioni di qualità del linguaggio di Ritchie avevano precedentemente offerto in cambio
Supercat

7

L'articolo che Uday Reddy ha trovato nella sua risposta, On Understanding Tipi, Data Abstraction, and Polymorphism (1985), fornisce le seguenti risposte:

I linguaggi di programmazione in cui il tipo di ogni espressione può essere determinato dall'analisi statica del programma si dice che siano tipizzati staticamente. La tipizzazione statica è una proprietà utile, ma il requisito che tutte le variabili e le espressioni siano associate a un tipo al momento della compilazione è talvolta troppo restrittivo. Può essere sostituito dal requisito più debole che tutte le espressioni siano garantite per essere coerenti con il tipo sebbene il tipo stesso possa essere staticamente sconosciuto; questo può essere generalmente fatto introducendo un controllo del tipo di runtime. Le lingue in cui tutte le espressioni sono coerenti con i tipi sono chiamate linguaggi fortemente tipizzati. Se una lingua è fortemente tipizzata, il suo compilatore può garantire che i programmi che accetta verranno eseguiti senza errori di tipo. In generale, dovremmo cercare di digitare forte e adottare la scrittura statica ogni volta che è possibile.


pubblicato come wiki della comunità poiché non mi merito il merito di averlo trovato.
Ben Millwood,

Il problema che ho qui è legato al primo commento di svick. Mentre può essere bello aver trovato una definizione di digitazione forte, questa non è certamente una definizione comunemente accettata.
edA-qa mort-ora-y

@ edA-qamort-ora-y: su che base lo dici? Hai qualcosa di meglio delle prove aneddotiche per ciò che è e non è comunemente accettato? Qualche citazione? (Capisco che potresti avere un punto valido anche se non lo è, ma penso ancora che quanto sopra risponda alla mia domanda; anche se non c'è consenso, è bene conoscere almeno una delle risposte accademiche serie).
Ben Millwood,

1
Non posso davvero dimostrare l'assenza di una definizione concordata, vero? Non è logicamente possibile. Tuttavia, gli articoli di Wikipedia sulla tipizzazione forte forniscono molte prove e riferimenti per disaccordo e contraddizione. en.wikipedia.org/wiki/Strong_typing
edA-qa mort-ora-y

@ edA-qamort-ora-y: le citazioni di Wikipedia non sono poi così utili: alcune non sono accademiche, altre sono citate per ragioni diverse dalla definizione dei termini. Il documento di programmazione tipografica sembra promettente, ma fa solo brevemente riferimento alle definizioni; forse vale comunque la pena modificare la mia risposta. Per quanto riguarda la prova dell'assenza, penso che le prove di controversie / disaccordi tra le persone che sanno di cosa stanno parlando mi basterebbero (cosa che, in effetti, il documento di Typeful Programming potrebbe darmi).
Ben Millwood,

6

Risposte autorevoli si trovano nell'articolo del sondaggio di Cardelli e Wegner: Informazioni sui tipi, astrazione dei dati e polimorfismo .

Intendiamoci che, mentre "tipizzazione forte" ha un significato accettato, "digitazione debole" no. Qualsiasi fallimento della digitazione forte potrebbe essere considerato debole e le persone potrebbero differire su quale tipo di fallimento è accettabile e cosa no.



Eccellente, è proprio quello che volevo. Il documento richiede un po 'di lettura, quindi penso che dovrebbe esserci una risposta che riassuma i punti salienti. Devo modificarli nella tua risposta o pubblicare la mia risposta wiki della mia community? Ad ogni modo, darò un altro paio di giorni nel caso in cui qualcun altro abbia qualche input, quindi accetterò ciò che è rimasto :)
Ben Millwood,

@benmachine. Vale la pena leggere l'intero documento, ma le questioni concettuali di alto livello sono trattate solo nelle prime due sezioni.
Uday Reddy,

4
Penso ancora che dovrebbe essere sintetizzato in questa pagina. Il link potrebbe scadere in seguito.
Ben Millwood,

@benmachine. Puoi pubblicare un riepilogo come risposta alla tua domanda.
Uday Reddy,
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.