Concetti Fondamentali sui Sistemi di Tipi nei Linguaggi di Programmazione

Classificato in Informatica

Scritto il in italiano con una dimensione di 5,91 KB

Introduzione: Cos'è un Tipo?

Il Tipo potrebbe essere definito come un insieme di termini di una lingua che hanno alcune caratteristiche in comune, il che permette loro di interagire o essere soggetti a modifiche applicate a loro in virtù di queste caratteristiche.

Il Sistema di Tipi

Definizione e Ruolo

Il Sistema di Tipi si compone della teoria di base di associare un tipo a ogni costrutto di un linguaggio dichiarativo.

Costruttori di Tipo

  • Costruttori di tipo: strutture, unioni, oggetti
  • Puntatori: i riferimenti di tipo
  • Tipi somma (es. () in alcune lingue)

Verifica dei Tipi (Type Checking)

Ruolo dell'Analizzatore Semantico

Ogni analizzatore semantico implementa un sistema di tipi.

Verifica Statica vs Dinamica

  • Compilazione: Verifica Statica
  • Esecuzione: Verifica Dinamica

Verifica nelle Espressioni

La verifica dei tipi di dati nelle espressioni viene effettuata assegnando un tipo a ciascun componente lessicale (token) o espressione.

Questi tipi vengono confrontati per verificare che corrispondano e siano coerenti; altrimenti, non è possibile eseguire i calcoli o l'operazione.

Conversione di Tipo (Type Casting)

Necessità

Ci sono situazioni in cui si ha un valore di un certo tipo e si desidera memorizzare tale valore in una variabile di tipo diverso.

Conversione Automatica (Implicita)

Alcuni tipi permettono di memorizzare il valore senza un cast esplicito; questa è la cosiddetta conversione automatica (o implicita).

Questo è possibile in un linguaggio di programmazione se il compilatore riconosce che la variabile di destinazione ha precisione o capacità sufficiente per contenere il valore sorgente.

Ampliamento (Widening)

In Java, un valore di tipo byte può essere memorizzato in una variabile di tipo int, dato che quest'ultimo tipo di dati ha una capacità maggiore rispetto al primo.

Questo si chiama ampliamento o promozione (widening), poiché il tipo più piccolo viene 'allargato' o 'promosso' al tipo più grande.

Conversione Esplicita (Cast)

Se, invece, si vuole assegnare un valore da una variabile int a una variabile byte, è necessario eseguire una conversione di tipo esplicita.

Restringimento (Narrowing) e Perdita Dati

In alcuni casi, si può fare la conversione, ma si possono perdere dati, ad esempio convertendo un valore in virgola mobile (float/double) in un intero (int).

Questo si chiama restringimento (narrowing), dal momento che si 'restringe' esplicitamente il valore per farlo rientrare nella destinazione.

Sintassi del Cast

La conversione esplicita di un tipo si fa specificando il nome del tipo di destinazione tra parentesi prima del valore, ad esempio (TipoDestinazione) valoreSorgente.

Altri Controlli Semantici

Importanza

La verifica (o controllo) aiuta a prevenire la maggior parte dei bug.

Esempi di Controlli

  • Controlli di tipo: Per verificare se gli operatori sono applicati correttamente agli operandi.
  • Controlli del flusso di controllo: È necessario verificare che le istruzioni che modificano il flusso di un programma (es. break, goto) siano valide.
  • Controlli di unicità: Ad esempio, verificare che un identificatore sia definito una sola volta in un determinato scope.
  • Controlli sui nomi: Verificare che i nomi siano usati correttamente (es. variabili dichiarate ma non utilizzate).

Complessità del Controllo di Tipo

Il controllo del tipo è spesso più complicato; altri controlli sono più di routine.

Concetti Aggiuntivi e Implementazione

Regole del Sistema di Tipi

Le regole del sistema di tipi sono spesso progettate in modo che i valori numerici vengano convertiti automaticamente al tipo di livello superiore (es. int a float) o che un puntatore possa puntare solo al tipo di dati per cui è stato dichiarato.

Esempi Specifici

  • L'operatore % (modulo) richiede che i due operandi siano interi.
  • L'operatore + (somma) è spesso sovraccaricato per operare su diversi tipi di dati (es. interi, float, stringhe).
  • Alcuni linguaggi controllano le dimensioni degli array in modo statico (es. Java in alcuni contesti), altri in modo dinamico (a runtime).
  • Differenziare l'uso degli operatori + e * con interi rispetto al loro uso con puntatori (aritmetica dei puntatori).
  • L'insieme di regole definite per il controllo dei tipi di dati viene chiamato sistema di tipi.

Recupero Errori di Tipo

Molto spesso il recupero degli errori di tipo (type error recovery) è omesso; il programma potrebbe non terminare, ma potrebbe produrre risultati inattesi o non desiderati.

Fase di Analisi e Strumenti

Di solito, durante la fase di analisi semantica (che include l'analisi dei tipi), le informazioni sui tipi vengono aggregate nella tabella dei simboli.

  • Una revisione dell'albero sintattico astratto (AST) viene effettuata per verificare i tipi assegnati ai nodi.

Azioni tipiche aggiunte in un parser discendente (top-down) per l'analisi dei tipi.

Voci correlate: