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 contesto1
possibile. - 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.