Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Linguaggi di programmazione

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Linguaggi di programmazione

Avatar for cinzia bocchi

cinzia bocchi

October 18, 2012

More Decks by cinzia bocchi

Other Decks in Technology

Transcript

  1. Variabili Una variabile è una coppia <identificatore, valore> dove: •

    l’identificatore è un nome assegnato dal programmatore – segue regole precise, per es. non inizia mai con un numero, e convenzioni • il valore può anche non essere assegnato – si parla di variabile non inizializzata • il valore può cambiare durante l’esecuzione del programma
  2. Costanti Una costante è una coppia <identificatore, valore> dove: •

    l’identificatore è un nome assegnato dal programmatore – segue regole precise, per es. non inizia mai con un numero, e convenzioni • il valore dovrebbe essere assegnato inizialmente • il valore non può cambiare durante l’esecuzione del programma – ma può cambiare in esecuzioni diverse
  3. Lessico Ogni linguaggio ha uno specifico lessico • un insieme

    di parole chiave (keyword) che hanno un preciso significato • le parole chiave non possono essere utilizzate come identificatori di variabili/costanti Anche la nostra lingua ha un lessico: • la parola nave ha un ben preciso significato • la parola jvjnvj non ha alcun significato
  4. Sintassi (grammatica) Ogni linguaggio ha una sintassi • un insieme

    di regole che consentono di comporre frasi significative a partire dal lessico • le frasi di un programma si chiamano istruzioni (statement) • i programmi “sgrammaticati” non possono essere eseguiti Anche la nostra lingua ha una sintassi: • “io studio informatica” è una frase sintatticamente corretta • “io studiamo informatica” è una frase sintatticamente errata
  5. Semantica La semantica si occupa del significato delle frasi di

    un linguaggio • occorre conoscere la semantica delle istruzioni per comprendere che cosa fa un programma – e individuare eventuali errori Anche la nostra lingua ha una semantica ma è ambigua, perché dipende dal contesto • La frase “che bel piatto!” ha almeno due significati – apprezzamento di un piatto di porcellana – apprezzamento di una ricetta
  6. Linguaggi formali e naturali I linguaggi come l’Italiano sono detti

    naturali – sono ambigui e devono essere interpretati in base al contesto I linguaggi di programmazione sono formali – le frasi (istruzioni) non sono mai ambigue e hanno un solo significato indipendente dal contesto
  7. Analizzatore sintattico (parser) • Modulo software che analizza un programma

    e individua gli errori di sintassi • Esistono diversi parser per differenti linguaggi
  8. Assegnazione • L’assegnazione è un’istruzione che consente di attribuire un

    valore ad una variabile o costante • Nei linguaggi C like (sintassi simile al C) l’assegnazione ha la seguente sintassi identificatore = valore; • per esempio num = 8; nome = “Mario”; arrivato = false; • la semantica è: prendi il valore a destra dell’uguale e assegnalo alla variabile che si trova a sinistra dell’uguale
  9. Linguaggi C like Alcuni linguaggi C like: • C++ •

    C# • Java • Perl • PHP • JavaScript
  10. Tipizzazione dei dati Nei linguaggi tipizzati, un dato, variabile o

    costante, è associato a un tipo <identificatore, valore, tipo> • il tipo è l’insieme dei valori che il dato può assumere – intero: solo valori numerici interi – alfanumerico: solo caratteri e simboli speciali – booleano: solo i valori vero (true), falso (false) – carattere: solo caratteri singoli Esistono linguaggi non tipizzati • tipicamente i linguaggi di scripting (PHP, JavaScript,...) – cioè linguaggi le cui istruzioni possono essere inserite nel codice HTML di una pagina web
  11. Dichiarazioni • Nei linguaggi tipizzati le variabili e le costanti

    devono essere dichiarate prima dell’uso – occorre specificare nome e tipo – è possibile assegnare un valore già in fase di dichiarazione • I tipi sono identificati da apposite parole chiave • Per esempio, nei linguaggi C like – int dichiara un intero – double dichiara un razionale – char dichiara un carattere – boolean dichiara un booleano
  12. Dichiarazioni • Sintassi per dichiarare una variabile con un linguaggio

    C like tipo identificatore; • Per esempio int num; double stipendio; char lettera; boolean arrivato; • Semantica: alla variabile identificatore è possibile assegnare solo valori del tipo specificato (o di tipo compatibile)
  13. Tipi compatibili • In generale – I tipi numerici sono

    tutti compatibili fra loro – gli altri tipi non sono tra di loro compatibili e non sono compatibili con i tipi numerici • Per rendere l’idea – posso assegnare ad una variabile di tipo double un valore intero poiché un intero può essere pensato come un numero razionale con uno zero dopo la virgola – non posso assegnare a una variabile di tipo double il carattere “k” poiché numeri e caratteri sono cose diverse • Approfondiremo parlando di promozione e casting
  14. Inizializzazioni • Inizializzazione assegnazione di un valore iniziale a una

    variabile/costante • Dichiarazione e assegnazione possono essere effettuate contemporaneamente, con la sintassi tipo identificatore = valore; • Per esempio int num = 8; double stipendio = 1500.00; char lettera = ‘k’; boolean arrivato = false;
  15. Perché la tipizzazione? • Perché in fase di assegnazione viene

    effettuato un controllo di coerenza tra il tipo del valore e il tipo della variabile/costante – int num = 8; è corretto – double stipendio = 8; è corretto, anche se 8 è un valore intero – int num = 2.1589 è errato perché il valore è razionale – char lettera = ‘k’; è corretto – char lettera = ‘1’; è corretto, 1 tra apici rappresenta il carattere 1 – char lettera = “Mario”; è errato perché il valore è una stringa – boolean arrivato = false; è corretto – boolean arrivato = true; è corretto – boolean arrivato = vero è errato perché vero non appartiene al lessico
  16. Promozione e casting • double stipendio = 8; è un

    esempio di promozione (conversione di tipo automatica) – 8 viene trasformato automaticamente in 8.0 e assegnato a stipendio • int num = 10.5; è errato perché 10.5 non è intero, però..... – il programmatore può forzare l’assegnazione effettuando un cast (una conversione di tipo forzata) – basta anteporre al valore il tipo a cui si vuole convertire il valore, tra parentesi tonde int num = (int) 10.5;
  17. Casting • Il casting, cioè la conversione forzata tra tipi,

    può avvenire solo se i tipi sono compatibili • Nel caso precedente int num = (int) 10.5; – il valore 10.5 viene trasformato in intero troncando la parte decimale – il valore effettivamente assegnato a num è pertanto 10 • Con il cast rischiamo di perdere una parte di informazione – passando da 10.5 a 10 abbiamo perso precisione numerica • Questo non costituisce un problema se il programmatore ne è consapevole
  18. Rappresentazione dei dati in memoria • Ogni variabile ha a

    disposizione un certo numero di bit in memoria, in base al tipo • Generalmente: – gli interi occupano 32 bit (4 byte) – i double occupano 64 bit (8 byte) – i caratteri occupano da 8 a 16 bit (1 – 2 byte) – i booleani 8 bit (1 byte) – le stringhe occupano un numero di bit variabile in base alla lunghezza • La dichiarazione di tipo consente di riservare in memoria lo spazio necessario per i valori di una variabile/costante
  19. Il compilatore • Controlla la corrispondenza tra valore assegnato e

    tipo della variabile/costante (segnalando gli errori) • Riserva in memoria lo spazio necessario alla variabile, in base al tipo • Effettua la promozione da un tipo ad uno compatibile ... e fa altre cose...
  20. Il compilatore • Modulo software che si occupa di tradurre

    un programma in linguaggio ad alto livello in un linguaggio comprensibile per una data macchina reale o virtuale – una macchina virtuale è detta interprete • Il codice originale, scritto in linguaggio ad alto livello, si chiama codice sorgente • Il risultato della compilazione e un codice detto codice oggetto • Il codice oggetto è un codice che può essere immediatamente eseguito sulla macchina per la quale è stato generato
  21. Linguaggio macchina • Il linguaggio macchina è un linguaggio binario

    • Ogni famiglia di elaboratori ha un suo linguaggio macchina, che dipende dall’hardware • Ne consegue che – per un dato linguaggio ad alto livello esistono (o dovrebbero esistere) tanti compilatori quante sono le famiglie di elaboratori esistenti
  22. Interpreti • Un compilatore può tradurre il codice sorgente in

    un codice comprensibile da una macchina virtuale – una macchina virtuale è detta interprete • Un interprete è un programma che non genera codice intermedio ma – prende un’istruzione alla volta, la traduce nel linguaggio di un’altra macchina e la esegue • Alcuni linguaggi possono essere – solo interpretati (es. PHP) – solo compilati (es. C) – prima compilati e poi interpretati (es. Java)
  23. Assegnazioni ed espressioni La sintassi dell’assegnazione può essere ampliata identificatore

    = espressione; dove espressione è un’espressione aritmetica, di confronto o logica che restituisce un risultato compatibile con il tipo della variabile Esempi di espressioni – espressione aritmetica: 100 + x / z – espressione di confronto: x >= 100 – espressione logica: (x < 10) AND (y != 0) OR (z = x)
  24. Operatori • Ogni linguaggio è dotato di una serie di

    operatori predefiniti • Tipici operatori sono: – aritmetici: + - * / % – di confronto: < <= > >== == != – logici (o booleani): && || ! oppure rispettivamente AND OR NOT • Spesso gli operatori predefiniti sono estesi con funzioni di libreria
  25. Funzioni di libreria • Per comporre espressioni si possono usare

    funzioni di libreria – moduli software aggiunti che consentono di effettuare operazioni complesse semplicemente usando il loro nome ed eventuali parametri • Per esempio – int x = abs(-10); calcola il valore assoluto del parametro – double y = sqrt(25); calcola la radice quadrata del parametro • Le librerie devono essere esplicitamente incluse nel programma, prima di poter usare le loro funzioni, mediante apposite direttive (es. include in C, import in Java)
  26. Linker • Nei linguaggi compilati, il codice oggetto deve subire

    un ulteriore passaggio prima di poter essere eseguito – occorre collegare le librerie esterne • Il linker (collegatore) è il modulo software che effettua tale operazione, trasformando il codice oggetto in codice eseguibile
  27. Dati strutturati Dati costituiti da un insieme di valori •

    dello stesso tipo (omogenei), detto tipo base <variabile, valore1, valore 2, ..., valore N> – per esempio gli array (vettori), gli insiemi (enum, set), le stringhe • di tipo diverso (eterogenei) <(variabile1, valore1di tipo1), ..., (variabileN, valoreN di tipoN)> – per esempio i record
  28. Array o vettori indice 2 indice 1 indice 0 valore3

    valore2 valore1 • ha un solo nome (a) • ha una dimensione (numero di elementi) che non varia dopo la creazione (3) • ogni elemento occupa una posizione con indice (a partire da 0) • per accedere all’elemento di indice i si scrive a[i] • il tipo array è predefinito nei moderni linguaggi a
  29. Esempio di array indice 2 indice 1 indice 0 -4

    24 35 •array di temperature •il tipo base è int •temperature[1] è uguale a 24 temperature
  30. Stringhe indice 2 indice 1 indice 0 carattere3 carattere2 carattere1

    • ha un solo nome (s) • ogni carattere occupa una posizione con indice (a partire da 0) • l’accesso al carattere di indice i dipende dal linguaggio – solitamente avviene mediante funzione di libreria • I valori stringa sono rappresentati sempre tra virgolette e, in alcuni linguaggi si possono usare anche gli apici s
  31. Record campo3 di tipo3 campo2 di tipo2 campo1 di tipo1

    valore3 valore2 valore1 • ha un solo nome (r) • è costituito da diversi campi o attributi che possono essere di tipo diverso fra loro • usato solitamente per rappresentare le proprietà di un’entità complessa • per accedere a un campo si scrive r.nomeCampo • si dicono anche “definiti dall’utente” r
  32. Esempio di record 22 Rossi Mario eta di tipo intero

    cognome di tipo stringa nome di tipo stringa 25 Verdi Lucia • record che rappresenta l’entità studente • ogni istanza ha un suo identificatore • per accedere al nome dell’istanza stud1 si scrive stud1.nome studente schema del record istanze del record stud1 stud2
  33. Struttura di un programma nome_programma { dichiarazioni di variabili istruzioni

    } • Nei linguaggi C like, ogni coppia di parentesi graffe definisce un blocco • Ogni linguaggio ha una specifica sintassi per definire un programma
  34. Linguaggi ad alto livello I linguaggi di programmazione ad alto

    livello – si distinguono dai linguaggi a basso livello perché non dipendono dall’architettura del sistema di elaborazione – sono solitamente general purpose, cioè adatti per qualsiasi tipo di applicazione anche se... – alcuni linguaggi sono preferibili rispetto ad altri per la realizzazione di applicazioni complesse, grazie alle loro caratteristiche peculiari – per esempio: • Java è particolarmente adatto per lo sviluppo di applicazioni web, di applicazioni per dispositivi mobili e di dispositivi embedded; • C è adatto allo sviluppo di software di base (sistemi operativi)
  35. Paradigmi Ogni linguaggio è stato creato per seguire un determinato

    paradigma – ma può essere usato anche con altri paradigmi Alcuni paradigmi: – imperativo – programmazione strutturata – procedurale – modulare – a oggetti Ogni nuovo paradigma racchiude le caratteristiche positive dei paradigmi precedenti