Corso di Linguaggi di Programmazione

Documenti analoghi
Macchine astratte, linguaggi, interpretazione, compilazione

Concetti base programmazione. Antonio Gallo

Costanti e Variabili

Tipi di dato semplici

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.

Programmazione II. Lezione 16. Daniele Sgandurra 14/12/2010.

Lezione 6 Introduzione al C++ Mauro Piccolo

cap.6 del testo a cosa servono i tipi nei linguaggi di programmazione cos è un linguaggio type safe

Tipi di dato. Il concetto di tipo di dato viene introdotto per raggiungere due obiettivi:

Algoritmi e Strutture Dati

Il linguaggio C. Notate che...

Informatica 3. LEZIONE 2: Sintassi e semantica

Il potere espressivo di un linguaggio è caratterizzato da: PROGRAMMA = DATI + CONTROLLO

Linguaggi di Programmazione

LINGUAGGI DI PROGRAMMAZIONE!

Informatica 3. Informatica 3. LEZIONE 2: Sintassi e semantica. Lezione 2- Modulo 1. Le componenti di un linguaggio di programmazione

Il linguaggio di programmazione Python

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Le basi del linguaggio Java

I Linguaggi di Programmazione

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Utilizza i tipi di dati comuni a tutto il framework.net Accesso nativo ai tipi.net (C# è nato con.net) Concetti fondamentali:

Strutture dati nel supporto a run time

4 - Tipi di dato primitivi

Il linguaggio C. Puntatori e dintorni

Caratteristiche di un linguaggio ad alto livello

Linguaggi e Ambienti di Programmazione

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Strutture Dati Dinamiche

Strutture dati e loro organizzazione. Gabriella Trucco

LINGUAGGI DI ALTO LIVELLO. Si basano su una macchina virtuale le cui mosse non sono quelle della macchina hardware

LINGUAGGI DI ALTO LIVELLO

Funzioni, Stack e Visibilità delle Variabili in C

Lez. 8 La Programmazione. Prof. Pasquale De Michele (Gruppo 2) e Raffaele Farina (Gruppo 1) 1

LINGUAGGI DI ALTO LIVELLO

Tipi di dato personalizzati Array di struct. Tipi di dato utente. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Gestione dinamica della memoria

Algoritmi, Strutture Dati e Programmi. UD 1.d: Dati e Tipi di Dato

Linguaggio C - sezione dichiarativa: costanti e variabili

Linguaggi di programmazione e astrazione

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Programmazione Procedurale in Linguaggio C++

Traduzione ed Interpretazione. Queste sconosciute

Linguaggi, Traduttori e le Basi della Programmazione

Espressioni ed operatori in C

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Esonero di Informatica I. Ingegneria Medica

Espressioni. Espressione = meccanismo fondamentale per esprimere computazioni in un LP importante comprenderne la semantica!

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Informatica Generale Andrea Corradini Ancora sui linguaggi di programmazione

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Puntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Allocazione dinamica della memoria

Programmazione. Andrea Passerini Informatica. Programmazione

Primi passi col linguaggio C

Traduzione ed Interpretazione

Il Linguaggio C. Caratteristiche. Caratteristiche. Esempio di programma in C. Tipi di dato primitivi in C. Dati

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Programmazione in Java (I modulo)

Tipi di dato primitivi

Fasi di un Compilatore

Informatica Generale Andrea Corradini I linguaggi di programmazione

Linguaggio C: introduzione

Informatica 3. LEZIONE 5: Tipi di dati

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Lez. 5 La Programmazione. Prof. Salvatore CUOMO

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

Programmazione con Java

Fondamenti di Informatica T. Linguaggio C: i puntatori

Tipi di dato, Alessandra Giordani Lunedì 7 maggio 2011

C++ Barriera di astrazione. Barriera di astrazione. Basic. Basic. Lisp. Lisp. Pascal. Prolog. Pascal. Prolog. Cobol. Fortran IMPERATIVI FUNZIONALI

Laboratorio di Informatica Ingegneria Clinica Lezione 9/11/2011. Prof. Raffaele Nicolussi

Programmazione ad oggetti

Programmazione Procedurale in Linguaggio C++

Corso di Fondamenti di Informatica Linguaggi di Programmazione

Il puntatore. Il puntatore

Linguaggio C: puntatori

Linguaggi ad oggetti. Linguaggi di Programmazione: Paradigmi di Programmazione. I principali linguaggi ad oggetti. Programmazione ad oggetti.

Il C nel C++: Funzioni

AXO - Architettura dei Calcolatori e Sistema Operativo. organizzazione strutturata dei calcolatori

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Operazioni numeriche - Input

Espressioni e Comandi

Macchine Astratte. Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari. Linguaggi di Programmazione feb, 2016

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Elementi di programmazione

Introduzione a Matlab

Strutture. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

Algoritmi, Strutture Dati e Programmi. UD 2.b: Programmazione in Pascal

Esempio. Le istruzioni corrispondono a quelle di sopra, ma sono scritte in modo simbolico. E indipendente dalla machina

Introduzione al Linguaggio C

Verso i puntatori: Cosa è una variabile?

3) Descrivere l architettura di un elaboratore tramite astrazione a livelli

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Astrazioni sui dati : Specifica di Tipi di Dato Astratti in Java

Informatica 3. LEZIONE 1: Introduzione. Modulo 1: Introduzione al corso Modulo 2: Introduzione ai linguaggi di programmazione

Transcript:

Corso di Linguaggi di Programmazione Lezione 13 Alberto Ceselli (thanks C. Braghin) alberto.ceselli@unimi.it Dipartimento di Tecnologie dell Informazione Università degli Studi di Milano 21 Aprile 2009

Motivation Importante Alcune proprietà ( siamo ancora nell ambito della semantica di un linguaggio) degli elementi di un programma sono determinate dall implementazione del linguaggio. Nelle prossime lezioni, analizziamo diversi aspetti dei linguaggi di programmazione, cercando di capire cosa si può valutare in modo automatico, come e perchè. In particolare, parleremo di costrutti o feature safe se il loro corretto utilizzo (semantica) può essere determinato automaticamente dal compilatore costrutti o feature unsafe se il loro corretto utilizzo è a carico del programmatore

Linguaggi e compilatori Struttura di un compilatore Struttura di un interprete Sistemi ibridi Per capire cosa si può valutare automaticamente utilizzando un particolare linguaggio e come dobbiamo avere una sensibilità a basso livello del funzionamento del relativo compilatore / interprete...

Struttura di un compilatore Struttura di un compilatore Struttura di un interprete Sistemi ibridi Vantaggi: massima efficienza! Es. C, C++

Struttura di un interprete Struttura di un compilatore Struttura di un interprete Sistemi ibridi Vantaggi: massima flessibilità! Es. Scheme, Prolog

Sistema ibrido Compilatori ed interpreti Struttura di un compilatore Struttura di un interprete Sistemi ibridi

Generazione di codice intermedio Struttura di un compilatore Struttura di un interprete Sistemi ibridi Es. Java un compilatore genera solo codice intermedio una macchina virtuale interpreta ed esegue il codice intermedio

Compilatori just-in-time Struttura di un compilatore Struttura di un interprete Sistemi ibridi Es. C# una macchina virtuale riceve il codice quando una porzione di codice deve essere eseguita, la macchina virtuale ne richiede la compilazione viene eseguito il codice compilato il controllo torna alla macchina virtuale N.B. ogni porzione di codice è compilata una sola volta (indipendentemente dal numero di attivazioni)

Linguaggi interpretati e compilati Struttura di un compilatore Struttura di un interprete Sistemi ibridi N.B. in linea di principio, ogni linguaggio può essere sia compilato che interpretato nulla vieta di scrivere interpreti per C. nulla vieta di compilare ed ottimizzare codice SCHEME, ottenendo degli eseguibili.... oppure operare scelte intermedie

Cosa servono i tipi durante l analisi semantica?

Obiettivi dell analisi semantica Controllo di tipo Controllare che gli identificatori siano stati dichiarati prima di essere usati come supporto a questa fase viene creata una tabella dei simboli (symbol table) che contiene informazioni su tutti gli elementi simbolici incontrati quali nome, scope, tipo (se presente) etc. il risultato di questa fase è l albero di sintassi astratta (AST).

Descrittore di Tipo Compilatori ed interpreti Un descrittore di tipo è una struttura dati che contiene tutte le informazioni necessarie a definire il tipo: se il tipo della variabile è determinato all inizio dell esecuzione del programma (statico), serve al compilatore per controlli di tipo. se il tipo della variabile è determinato o può cambiare in fase di esecuzione (dinamico), una sua parte può servire per i controlli durante l esecuzione (es. controllo sugli indici di un vettore dinamico).

Controllo sui Tipi Compilatori ed interpreti Determina e controlla la compatibilità dei tipi degli oggetti: assegnazioni, dichiarazioni, uso parametri, conversioni,... Il controllo avviene rispetto alle regole di tipo definite dal particolare linguaggio Tipo di controllo: statico: avviene in fase di compilazione - segue l albero sintattico (bottom-up) - determina e trasmette le informazioni sui tipi degli oggetti coinvolti dinamico: modulo di supporto a run-time - pesante dal punto di vista prestazionale - tipico dei linguaggi interpretati

Tipo di dato Compilatori ed interpreti Definition In un linguaggio di programmazione, un tipo di dato (o semplicemente tipo) è un nome che indica l insieme di valori omogenei che una variabile, o il risultato di un espressione, possono assumere, e le operazioni che manipolano tali valori. L insieme dei valori ha una cardinalità finita. Un tipo è caratterizzato da un nome e dalla sintassi della dichiarazione di tipo. Es.: in C, la definizione int x; indica che x può assumere come valori solo numeri interi (appartenenti ad un certo intervallo) e che su tali valori sono ammesse solo certe operazioni.

Classificazioni del processo di tipizzazione (1) Statico vs dinamico Fa riferimento al momento in cui alla variabile è associato il suo tipo (binding tipo-variabile). - la tipizzazione è statica quando a una variabile viene associato rigidamente in fase di compilazione un tipo che rimane lo stesso durante tutta l esecuzione. - la tipizzazione è dinamica quando una variabile può cambiare tipo durante l esecuzione a seconda del tipo dell espressione che le viene assegnata. Esplicito vs implicito Fa riferimento al modo in cui le annotazioni o dichiarazioni di tipo vengono generate, se specificate esplicitamente dal programmatore, o dedotte automaticamente dal compilatore.

Inferenza di Tipo Compilatori ed interpreti Il tipo di un espressione è dedotto senza richiedere al programmatore di specificare il tipo delle variabili. Quando non si può determinare subito il tipo, si utilizza una variabile di tipo. Es.: data la seguente istruzione ML fun(n) {return n+1;} si può dedurre che f è di tipo int -> int

Conversione di Tipo Compilatori ed interpreti Conversione implicita (coercion) operata in fase di compilazione del programma indebolisce il meccanismo di verifica dei tipi in quasi tutti i linguaggi capita se si esegue un operazione tra tipi numerici diversi. Es v e q reali, p intero: v = p + q Conversione esplicita (cast) indicata mediante costrutti linguistici nel sorgente del programma. Es v e q interi, p reale: v = (int) p + q

Svantaggi della tipizzazione dinamica Permette la cattura di errori di tipo solo durante l esecuzione del programma. Es.: (in pseudo-codice, L# indica la linea) L1 var x = 5; L2 var y = "test"; L3 var z = x + y; In un linguaggio con tipizzazione dinamica, solo in fase di esecuzione viene segnalato un errore quando si cerca di eseguire l istruzione alla linea L3. L implementazione è più costosa: maggiore tempo di esecuzione perché il controllo dei tipi deve venire fatto durante l esecuzione del programma maggior utilizzo della memoria perché si deve tenere memoria del tipo delle variabili durante l esecuzione del programma.

Classificazioni del processo di tipizzazione (2) Dal punto di vista qualitativo: Forte vs Debole Fa riferimento alle regole imposte dal linguaggio sull utilizzo dei tipi: possono essere rigide (forti) ed impedire qualsiasi uso dei dati incoerente con il tipo specificato in fase di dichiarazione (ogni errore di tipo è rilevato dal compilatore) in caso contrario (qualche errore di tipo può sfuggire al compilatore) la tipizzazione è debole. Safe vs Unsafe Un linguaggio type safe garantisce che tutti gli errori di tipo siano catturati, ma non necessariamente durante la compilazione (un programma potrebbe fallire durante l esecuzione a causa di violazioni di tipo). Linguaggi che permettono aritmetica dei puntatori non possono essere type safe. Un linguaggio con tipizzazione debole non è necessariamente unsafe (es. il controllo ritardato in fase di esecuzione Perl).

Linguaggi fortemente tipati In genere, un linguaggio di programmazione si considera fortemente tipato (strongly typed) se: Utilizza tipizzazione statica i tipi delle variabili sono fissati in fase di compilazione e non sono modificabili. non ci sono tipi di dato varianti (es. union in C) Impedisce qualsiasi uso dei dati incoerente con il tipo specificato in fase di dichiarazione (i.e., impossibilità di conversione di tipi) a volte la conversione esplicita (casting) è permessa, mentre quella implicita (coercion) no. Impedisce di evadere il sistema di tipi. Questo permette di avere una garanzia piuttosto forte sul comportamento del programma in fase di esecuzione.

Forte e Debole, Safe e Unsafe Linguaggio Statico / Dinamico Strong / Weak Safety Ada statico strong safe C statico weak unsafe C++ statico Java statico Pascal statico Lisp dinamico strong ML dinamico JavaScript dinamico Perl dinamico PHP dinamico Python dinamico Ruby dinamico Esercizio: riempire la tabella.

Tipizzazione Esempi nei vari linguaggi (1) Compilatori ed interpreti Linguaggi a tipizzazione statica: Ada, C, C++, Java, Fortran: tipizzazione esplicita Perl, JavaScript, ML: tipizzazione implicita in Perl, ogni nome che inizia con $ può contenere una stringa o un valore numerico in ML, la definizione fun square(x): real = x * x; è corretta. di norma vengono compilati (i tipi sono importanti anche in fase di ottimizzazione del codice).

Tipizzazione Esempi nei vari linguaggi (1) Compilatori ed interpreti Linguaggi a tipizzazione statica: Ada, C, C++, Java, Fortran: tipizzazione esplicita Perl, JavaScript, ML: tipizzazione implicita in Perl, ogni nome che inizia con $ può contenere una stringa o un valore numerico in ML, la definizione fun square(x): real = x * x; è corretta. di norma vengono compilati (i tipi sono importanti anche in fase di ottimizzazione del codice). Linguaggi a tipizzazione dinamica: Lisp, Scheme, Python, Perl, Ruby, JavaScript, PHP la maggior parte dei linguaggi di scripting o di sviluppo rapido sono di solito a tipizzazione dinamica di norma vengono interpretati.

Tipizzazione Esempi nei vari linguaggi (2) Compilatori ed interpreti Linguaggio debolmente tipato: Perl print 2 + 4; in Perl stampa a video 6 poiché viene fatta una conversione implicita

Tipizzazione Esempi nei vari linguaggi (2) Compilatori ed interpreti Linguaggio debolmente tipato: Perl print 2 + 4; in Perl stampa a video 6 poiché viene fatta una conversione implicita Linguaggio debolmente tipato e unsafe: C vs C++ char* buf = malloc(20); viene compilata in C senza problemi, ma genera un errore in C++ perché malloc ritorna un valore di tipo void* e il C++ richiede una conversione esplicita (cast).

Tipizzazione Esempi nei vari linguaggi (2) Compilatori ed interpreti Linguaggio debolmente tipato: Perl print 2 + 4; in Perl stampa a video 6 poiché viene fatta una conversione implicita Linguaggio debolmente tipato e unsafe: C vs C++ char* buf = malloc(20); viene compilata in C senza problemi, ma genera un errore in C++ perché malloc ritorna un valore di tipo void* e il C++ richiede una conversione esplicita (cast). Linguaggio fortemente tipato ma unsafe: C++ Quando viene eseguito il seguente programma (che passa senza problemi la fase di compilazione), va in crash. int* p = 0; *p = 5;

Tipizzazione Esempi nei vari linguaggi (3) Compilatori ed interpreti Classifica di linguaggi fortemente tipati: OCaml, Haskell: non permettono alcuna conversione di tipo implicita (coercion) Ada: non permette alcuna conversione di tipo implicita, ma ha la possibilità di sospendere temporaneamente il controllo di tipo. Java, C# permettono alcuni tipi di casting, e coercion nel caso di operatori aritmetici Es.: l istruzione x = 3 1.5; è valida, in quanto l espressione intera viene convertita in floating-point.

Sistema di tipo di un linguaggio di programmazione Complesso delle informazioni e delle regole che governano i tipi di un linguaggio: Insieme dei tipi predefiniti Costrutti per definire nuovi tipi Meccanismi per il controllo dei tipi: Regole di equivalenza: due tipi formalmente diversi possono essere equivalenti a livello semantico; Regole di compatibilità: un valore di un tipo diverso da quello atteso può comunque essere utilizzato; Regole di inferenza attribuzione di un tipo ad un espressione complessa. Lista (possibilmente vuota) di vincoli da controllare staticamente o dinamicamente.

Equivalenza di Tipi Compilatori ed interpreti Stabilire quando due tipi, formalmente diversi, sono intercambiabili, ossia non distinguibili nel loro uso. Equivalenza per nome Due tipi sono equivalenti se e solo se hanno lo stesso nome (sono lo stesso tipo) Es.: T1 = int e T2 = int sono diversi Facile da implementare ma molto restrittiva Indebolita in alcuni linguaggi: la ridenominazione (T3 e T4) genera alias e non nuovi tipi Equivalenza strutturale Due tipi sono equivalenti se e solo se hanno la stessa struttura (dichiarazioni equivalenti) Più flessibile, ma più complicata da implementare (specialmente per tipi definiti ricorsivamente).

Equivalenza strutturale Problemi: nel caso di strutture, si confronta solo il tipo dei campi o anche il loro nome? E l ordine in cui compaiono? se due tipi derivano da uno stesso tipo base, ma identificano entità diverse (es. typedef celsius float; typedef fahrenheit float)?

Equivalenza di Tipi Esempi Compilatori ed interpreti C, C++ utilizzano la versione indebolita dell equivalenza per nome nel caso di un unico file, mentre l equivalenza strutturale nel caso di file compilati separatemente - struct e union creano sempre un nuovo tipo che non è equivalente con nessun altro tipo. Es.: (in pseudo-codice) type T1 = int; type T2 = char; type T3 = struct { T1 a; T2 b; } type T4 = struct { T1 a; T2 b; }

Compatibilità di Tipi Compilatori ed interpreti Definition Il tipo T è compatibile con il tipo S sse un valore del tipo T è ammesso in qualsiasi contesto in cui sarebbe richiesto un valore di tipo S. Ogni linguaggio definisce le regole di compatibilità tra oggetti di tipo differente, che vengono adottate nella disciplina dell assegnazione, delle operazioni aritmetiche e del passaggio dei parametri. Compatibilità più debole dell equivalenza: Due tipi equivalenti sono sempre compatibili, ma non viceversa. Relazione riflessiva, transitiva, ma non simmetrica.

Classificazione di Tipi A seconda della loro struttura: - semplici o primitivi: tipi che non possono essere decomposti; - strutturati: tipi ottenuti dai tipi semplici mediante operatori forniti dal linguaggio. A secondo di chi li definisce: - predefiniti: insieme di tipi predefiniti dal linguaggio; - definiti dall utente: definiti mediante l utilizzo di operatori forniti dal linguaggio.

Classificazione di Tipi A seconda della loro struttura: - semplici o primitivi: tipi che non possono essere decomposti; - strutturati: tipi ottenuti dai tipi semplici mediante operatori forniti dal linguaggio. A secondo di chi li definisce: - predefiniti: insieme di tipi predefiniti dal linguaggio; - definiti dall utente: definiti mediante l utilizzo di operatori forniti dal linguaggio. Nota bene Le due classificazioni non sono perfettamente sovrapponibili: non tutti i tipi predefiniti dal linguaggio sono primitivi. Es.: le strinche in C sono tipi derivati ma predefiniti dal linguaggio.

Tipi e Linguaggi Compilatori ed interpreti Ogni linguaggio definisce accuratamente i tipi che permette di gestire, associando agli stessi: un insieme di operazioni ammesse l insieme di operazioni ammesse dipende dal linguaggio (vedi operazioni su stringhe) un ordinamento totale (facoltativo) scalare una codifica, spesso dipendente dalla macchina decisa dall implementatore e a seconda della macchina insieme di regole che permette di tradurre ogni valore in una stringa di bit (complemento a 1, complemento a 2, floating,...) viene ignorata dal programmatore

Esempio: array Compilatori ed interpreti Elementi sintattici: Forma di accesso ai dati: parentesi (Fortran, COBOL unici elementi stampabili su schede perforate), caratteri [ ] indice di partenza: 0, 1 tipo richiesto per gli indici (Ada permette anche booleani, caratteri o enum) controllo del corretto uso degli indici (Java, ML, C#)

Esempio: array Compilatori ed interpreti Tipo di allocazione: static array: allocazione di memoria statica e dimensione fissata fixed-stack dynamic array: dimensione fissata, allocazione nello stack quando viene incontrata la dichiarazione stack-dynamic array: dimensione non fissata, allocazione nello stack quando viene incontrata la dichiarazione fixed-heap dynamic array: dimensione fissata, allocazione nello heap quando viene incontrata la dichiarazione stack-dynamic array: dimensione non fissata, allocazione nello heap quando viene incontrata la dichiarazione

Esempio: array Compilatori ed interpreti Possibilità di accedere a slices: In Fortran 95: Integer Cube(1:3,1:3,1:4), Cube(1:3,1:3,2) è una porzione dell array Cube comune in linguaggi di programmazione per calcolo scientifico (Matlab)

Tipi nei vari linguaggi (1) Tipo Booleano valori: prevede 2 soli valori, vero o falso, utilizzati soprattutto nelle espressioni condizionali operazioni: congiunzione (and), disgiunzione (or), negazione (not), uguaglianza invece che memorizzarlo in un singolo bit, per motivi di efficienza si usa un byte (unità minima di memoria) in altri linguaggio, 0 indica falso; valori maggiori di 0 vero

Tipi nei vari linguaggi (1) Tipo Booleano valori: prevede 2 soli valori, vero o falso, utilizzati soprattutto nelle espressioni condizionali operazioni: congiunzione (and), disgiunzione (or), negazione (not), uguaglianza invece che memorizzarlo in un singolo bit, per motivi di efficienza si usa un byte (unità minima di memoria) in altri linguaggio, 0 indica falso; valori maggiori di 0 vero Tipi Numerici (Interi o Reali) valori: a differenza degli insiemi matematici che rappresentano, includono un massimo e un minimo numero rappresentabile dovendo essere contenuti in una parola di memoria operazioni: operazioni aritmetiche e confronti (somma, differenza, prodotto, divisione, resto) alcuni degli operatori possono venire usati sia da tipi interi che reali (operatori overloaded)

Tipi nei vari linguaggi (2) Record (o Strutture) valori: usato per mantenere informazioni eterogenee correlate - ogni campo è caratterizzato dal suo nome e dal suo tipo (anche diverso da quello degli altri campi operazioni: ciascun campo può essere acceduto in modo indipendente mediante l operatore di selezione (.)

Tipi nei vari linguaggi (2) Record (o Strutture) valori: usato per mantenere informazioni eterogenee correlate - ogni campo è caratterizzato dal suo nome e dal suo tipo (anche diverso da quello degli altri campi operazioni: ciascun campo può essere acceduto in modo indipendente mediante l operatore di selezione (.) Array valori: collezione finita di elementi dello stesso tipo (tipo base), indicizzata su un intervallo di tipo ordinale (tipo indice) operazioni: selezione, assegnamento, uguaglianza si indica, spesso tra quadre, un espressione il cui valore indica l indice dell elemento da selezionare (Es.: array[< expr >]).

Tipi nei vari linguaggi (3) Caratteri e Stringhe il tipo carattere tradotto con la codifica ASCII o Unicode la stringa non sempre è predefinita nel linguaggio operazioni: operazioni per la concatenazione, la selezione di una sottostringa di una stringa data, ecc. nei linguaggi di scripting anche operatori per il pattern matching

Esercizi per casa Compilatori ed interpreti Riempire la tabella nelle slide precedenti Scrivere una grammatica che generi espressioni aritmentiche (con + e - come unici operatori)con parentesi. Scrivere una grammatica ad attributi che verifichi le seguenti proprietà: 1 il numero massimo di parentesi annidate è 3 2 il numero massimo di operatori utilizzati è 5