440 likes | 563 Views
5. Codifica degli algoritmi in un linguaggio di alto livello. Ing. Simona Colucci. Indice. Obiettivi della programmazione in linguaggi di alto livello La macchina astratta C Struttura di un programma C Istruzioni principali del C Esempi di programmi in quasi C.
E N D
5. Codifica degli algoritmiin un linguaggio di alto livello Ing. Simona Colucci Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Indice • Obiettivi della programmazione in linguaggi di alto livello • La macchina astratta C • Struttura di un programma C • Istruzioni principali del C • Esempi di programmi in quasi C Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Obiettivi della programmazione in linguaggi di alto livello • Colmare il gap tra i due requisiti fondamentali di un linguaggio per la descrizione di algoritmi: • Precisione ed assenza di ambiguità interpretativa per l’esecuzione di operazioni(requisito richiesto dalla macchina) • Sintesi per la facilità di comprensione del programmatore(requisito richiesto dall’uomo) Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Programmazione in linguaggi di alto livello • Vantaggi: • Possibilità di riferirsi agli elementi del programma(celle di memoria, istruzioni, valori costanti) con identificatori (nomi simbolici) • Es. a cella di memoria 1001001100 • Possibilità di esprimere le istruzioni e il controllo della sequenza della loro esecuzione in modo vicino al linguaggio naturale • Es. (a+b)*(c+d) LOAD A ADD B STORE TEMP LOAD C ADD D MULT TEMP Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
La macchina astratta del (nucleo) del C • Capace di comprendere ed eseguire programmi in C • Astrazione della macchina di Von Neumann Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
La macchina astratta del (nucleo) del C Componenti: • CPU • Memoria centrale: • divisa in celle elementari, contenenti un dato(valore numerico o carattere), di un numero di bit variabile • Bus • Astrazione delle interfacce con le periferiche: • Standard Input: • unica unità di ingresso • diviso in celle elementari, contenenti un dato (valore numerico o carattere), di un numero di bit variabile • Standard Output: • unica unità di uscita • diviso in celle elementari, contenenti un dato (valore numerico o carattere), di un numero di bit variabile Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Elementi -e terminologia- essenziali • Stringa: successione finita di caratteri, supposti immagazzinati in celle consecutive • Variabili: celle di memoria, il cui contenuto può cambiare durante l’esecuzione del programma • Identificatori simbolici: successione di lettere e cifre(o il simbolo”_”), con al primo posto una lettera • N.B. il C è CASE SENSITIVE • Identificatori predefiniti e riservati: associati a priori ad elementi del linguaggio e non utilizzabili per le variabili • Parole chiave: altre parole del linguaggio predefinite e riservate Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Struttura sintattica di un programma C Un programma C è composto da un’intestazione seguita da una sequenza di istruzioni racchiusa tra i simboli { e } • L’intestazione è costituita dall’identificatore predefinito main seguito da una coppia di parentesi ( ) (per il momento vuote) • Le istruzionisono frasi del linguaggio di programmazione; ognuna di esse termina con il simbolo ‘;’ Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Le principali istruzioni del C • Istruzioni di sequenza: • Istruzioni di assegnamento x = 23;w = 'a'; y = z;r3 = (alfa*43–xgg)*(delta–32*ijj); x = x+1; • Istruzioni di ingresso e uscita • scanf(): identificatore predefinito di input; le parentesi contengono informazioni relative alla variabile da leggere • printf(): identificatore predefinito di output; le parentesi contengono informazioni relative alla variabile da scrivere printf((a-z)/10); temp = (a-z)/10; printf(temp); printf(‘a’); printf(“alfa”); Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Le principali istruzioni del C:Le istruzioni composte • Istruzioni composte: • corrispondono ai costrutti visti nel capitolo 1 • Comprendono selezione ed iterazione visti nel capitolo 3 • producono effetti diversi a seconda del verificarsi o meno di condizioni sul valore delle variabili • Condizione(espressione booleana): • espressione su variabili booleane il cui valore può essere vero o falso • Costruita tramite: • Operatori di relazione (==; !=; <;>;<=;>=) • Operatori logici (!;||;&&) Es. di condizioni: x == 0alfa > beta && x != 3!((a + b)*3 > x || a < c) Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Istruzioni composte: selezione ed iterazione 2.Istruzioni di Selezione if(x == 0) z = 5; else y = z + w*y;if(x == 0) {z = 5;} else{y = z + w*y;}if ((x+y)*(z-2) > (23+v)) {z = x + 1; y = 13 + x;}if ((x == y && z >3) || w != y) z = 5; else{y = z + w*y; x = z;} • Istruzioni di selezione scorrette: if (x == 0) else y = z; y = 34;if (x == 0) a; else b + c; 3. Istruzioni di Iterazione (ciclo o loop) while (x >= 0) x = x – 1;while (z != y) {y = z – x; x = x*3;} Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Esempi in pseudo C /*Programma NumeroMaggiore – prima versione */ main() {scanf(x);scanf(y); if (x > y) z = x; else z = y;printf(z);} /*Programma NumeroMaggiore – seconda versione */ main() { scanf(x); scanf(y);if (x > y) printf(x); else printf(y);} Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Esempi in pseudo C /*ProgrammaCercaIlPrimoZero */ main(){ uno = 1; scanf (dato);while (dato !=0) scanf(dato); printf(uno);} Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Esempi in pseudo C /*ProgrammaSommaSequenza */ main() { somma = 0; scanf(numero);while (numero != 0) { somma = somma + numero; scanf(numero); } printf(somma);} Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Esempi in pseudo C /*Programma per la valutazione di un triangolo */ main() { /*Lettura dei dati di ingresso */ scanf(X); scanf(Y); scanf(Z); /* Verifica che i dati possano essere le lunghezzedei lati di un triangolo */ if ((X < Y + Z) && (Y < X + Z) && (Z < X + Y)) /*Distinzione tra i vari tipi di triangolo */ if (X == Y && Y == Z) printf("I dati letti corrispondono a un triangolo equilatero"); else if (X == Y || Y == Z || X == Z) printf("I dati letti corrispondono a un triangolo isoscele"); else printf("I dati letti corrispondono a un triangolo scaleno"); else printf("I dati letti non corrispondono ad alcun triangolo"); } Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Le variabili strutturate • Primo arricchimento della macchina astratta C • Consentono di trattare l’informazione aggregata Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Variabili strutturate: gli array • Array: • sequenza di celle di memoria consecutive ed omogenee: • identificato come qualsiasi altra variabile • Composto da elementi che sono a loro volta variabili, accessibili mediante un indice (in C il primo elemento di ogni array è sempre lo 0-esimo) • Elemento indicato tra parentesi quadre dopo l’identificatore dell’array • Es.: scanf(s[2]); • a[3] = s[1] + x; • if (a[4] > s[1] + 3) s[2] = a[2] + a[1]; • x = a[i]; • a[i] = a[i+1];a[i*x] = s[a[j+1]–3]*(y – a[y]); Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Esempi in pseudo C /* Programma InvertiSequenza */ main() { indice = 0; scanf(x); while (x != '%') { sequenza[indice] = x; indice = indice + 1; scanf(x); } while (indice > 0) { indice = indice - 1; printf(sequenza[indice]); } } Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Dallo pseudo-C al C • Che cosa manca per poter “far girare i programmi” precedenti: • Le direttive al compilatore • La parte dichiarativa • L’ I/O formalizzato in C nella parte esecutiva Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Un “vero” programma C /* Programma SommaSequenza */ #include <stdio.h> main() { int numero, somma; somma = 0; scanf("%d", &numero); while (numero != 0) { somma = somma + numero; scanf("%d", &numero); } printf("La somma dei numeri digitati è: %d\n", somma); } Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
La struttura dei programmi C • Un programma C deve contenere, nell’ordine: • Una parte contenente direttive per il compilatore: servono per l’inclusione delle librerie contenenti funzioni da utilizzare nelle parte esecutiva • L’identificatore predefinito main seguito dalle parentesi () • Due parti, racchiuse dalle parentesi {}: • la parte dichiarativa: elenca tutti gli elementi che fanno parte del programma, con le loro principali caratteristiche • laparte esecutiva: consiste in una successione di istruzioni Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
La parte dichiarativa • Tutto ciò che viene usato va dichiarato, in particolare: • Dichiarazione delle costanti • Dichiarazione delle variabili • Perché questa fatica … inutile? • Aiuta la diagnostica (ovvero segnalazione di errori): • x = alfa; • alba = alfa + 1; • Senza dichiarazione,alba è una nuova variabile! • Principio importante:meglio un po’ più di fatica nello scrivere un programma che nel leggerlo -e capirlo! Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
La parte dichiarativa • Una dichiarazione di variabile consiste in: • Uno specificatore di tipo, seguito da una lista di uno o più identificatori di variabili separati da una virgola • Ogni dichiarazione termina con ‘;’ • Esempi • float x,y;inti,j; char simb; Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
La parte dichiarativa • La dichiarazione di costanti: • const float PiGreco = 3.14; • const float PiGreco = 3.1415, e = 2.718; • const intN = 100, M = 1000;const char CAR1 = 'A', CAR2 = 'B'; • Un eventuale assegnamento a una costante sarebbe segnalato come errore dal compilatore. • Esempio: • AreaCerchio = PiGreco*RaggioCerchio*RaggioCerchio; • è equivalente a: • AreaCerchio = 3.14*RaggioCerchio*RaggioCerchio; • (se si fa riferimento alla prima dichiarazione di PiGreco) Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Le istruzioni di I/O • Istruzione per l’output: printf (stringa di controllo, elementi da stampare); • Stringa di controllo, costituita da • caratteri semplici: di stampa immediata • caratteri di conversione: tramutati in speciali visualizzazioni • caratteri di formato: specificano il tipo delle variabili da stampare • L’insieme degli elementi da stampare è una lista di variabili, di costanti o di espressioni composte con variabili e costanti • Esempi: • printf ("Lo stipendio annuo dei dipendenti di categoria %d è pari a L. %f", cat_dipend, stip_medio); • printf("%s\n%c%c\n\n%s\n", "Questo programma è stato scritto da", iniz_nome, iniz_cognome, "Buon lavoro!"); Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Le istruzioni di I/O • Istruzione per l’input: scanf (stringa di controllo, elementi da leggere); • La stringa di controllo contiene caratteri di formato, che specificano il tipo delle variabili da leggere • Gli elementi da leggere sono indicati tramite i nomi delle variabili destinate a contenere la lettura preceduti dall’operatore unario & • Esempio: • scanf("%c%c%c%d%f", &c1, &c2, &c3, &i, &x); Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
La direttiva #include • Ogni programma che utilizza al suo interno le funzioni printf e scanf deve dichiarare l’uso di tali funzioni nella parte direttiva che precede il programma principale: • #include <stdio.h> • È una direttiva data a una parte del compilatore, chiamata preprocessore Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Esempio in C • /* PrimoProgrammaC */ • #include <stdio.h> • main() { • printf("Questo è il mio primo programma in C\n"); • } • NB: niente dichiarazioni! Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Esempio in C • /* Programma SommaDueInteri */ • #include <stdio.h> • main() • { • int a, b, somma; • printf (“inserisci come valore dei due addendi due numeri interi\n”); • scanf("%d%d", &a, &b); • somma = a + b; • printf("La somma di a+b è:\n%d \nArrivederci!\n", somma); • } • Se vengono inseriti i dati 3 e 5, l’effetto dell’esecuzione del programma sullo Standard Output è il seguente: • La somma di a+b è: • 8 • Arrivederci! • Se fossero stati omessi i primi due simboli \n nella stringa di controllo? Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Interpretazione e Compilazione Il programma di traduzione da un linguaggio di alto livello al linguaggio di macchina può: • tradurre ed eseguire frase per frase (interprete) • tradurre tutte le frasi e solo successivamente eseguire (assemblatore o compilatore) Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Interpretazione • Un Interprete è un programma che legge il programma sorgente e, per ogni istruzione • Verifica la correttezza sintattica • Effettua la traduzione nella corrispondente sequenza di istruzioni in linguaggio macchina • Esegue direttamente la sequenza di istruzioni in linguaggio macchina • Svantaggio: istruzioni eseguite più volte (es. ciclo) vengono verificate e tradotte più volte • Vantaggio: facile sviluppo e correzione dei programmi Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Compilazione • UnCompilatore è un programma che legge il programma sorgente e lo traduce interamente in un programma scritto in linguaggio macchina(programma oggetto): • Verifica la correttezza sintattica di ciascuna istruzione • Il programma oggetto è generato solo in assenza di errori sintattici • La correttezza semantica è verificata solo in fase di esecuzione • Svantaggio: difficile correzione dei programmi • Vantaggio: istruzioni eseguite più volte (es. ciclo) vengono verificate e tradotte solo una volta Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Interpretazione vs Compilazione • Velocità di esecuzione: • Bassa per i linguaggi interpretati • Alta per i linguaggi compilati • Facilità di messa a punto dei programmi: • Alta per linguaggi interpretati • Bassa per i linguaggi compilati Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
L’ambiente di programmazione C Le fasi: • Editazione • Preelaborazione • Compilazione • Linking • Caricamento • Esecuzione Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Editazione • Editazione del codice in un file: • Il file dovrà terminare con l’estensione .c • Il programma che consente l’editazione è detto editor • Il programma editato è memorizzato in un dispositivo di memoria secondaria e viene detto programma sorgente (source program) • Esempio: #include<stdio.h> void main() { int n1,n2,sum; printf(“inserire un numero intero”); scanf(“%d”,&n1); printf(“inserire un numero intero”); scanf(“%d”,&n2); sum=n1+n2; } Nell’esempio il source file è somma.c Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Preelaborazione • Precompilazione del programma ed espansione delle macro: • Il programma che esegue la precompilazione è detto preprocessore e viene eseguito in maniera automatica prima che avvenga la compilazione • Il preprocessore obbedisce a comandi detti direttive del preprocessore o macro cheindicano che sul programma devono essere effettuate delle manipolazioni prima della compilazione: • Inclusione di altri file in quello da compilare • Sostituzione di simboli speciali con un testo del programma • Le linee per il preprocessore di macro iniziano con il simbolo # • Esempio: #define max 40 #include<stdio.h> • Prima della compilazione del programma ogni occorrenza di max è sostituita con il valore 40 • La riga #include<stdio.h> viene sostituita dal contenuto del file stdio.h. Ciò consente al programma di usare le funzioni di libreria Printf e Scanf Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
La libreria standard del C Principali componenti: • <stdef.h> definizioni comuni • <assert.h> diagnostica • <ctype.h> gestione di caratteri • <local.h> localizzazione • <math.h> funzioni matematiche • <stdio.h> I/O • <stdlib.h> utilità generiche • <string.h> gestione di stringhe Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Traduzione (compilazione o interpretazione) • Il traduttore (compilatore o interprete) trasforma le istruzioni del programma in istruzioni in linguaggio di macchina • In particolare, il compilatore traduce il programma C nel codice in linguaggio macchina, detto codice oggetto Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Traduzione: Codice oggetto • Un programma può essere suddiviso in parti separate, dette moduli. • Ciascun modulo può essere compilato separatamente • La compilazione separata dei vari moduli genera moduli oggetto separati • Nel codice oggetto di ciascun modulo di programma solo i nomi delle variabili definite nel modulo (indirizzi simbolici) sono trasformati in indirizzi rilocabili: • espressi in forma logica, indipendente dall’allocazione del programma in memoria • calcolati come se il programma fosse caricato a partire dall’indirizzo zero Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Linking • Il linking è eseguito da un programma detto linker, che: • trasforma i vari moduli oggetto in un unico programma eseguibile • collega il programma dell’utente a librerie di programmi di utilità disponibili nell’ambiente di programmazione di ciascun linguaggio: • nelle librerie standard • nelle librerie definite dal programmatore • risolve riferimenti a variabili definite esternamente a ciascun modulo trasformando i relativi indirizzi simbolici in indirizzi rilocabili • Il linker tramite i collegamenti precedenti produce il codice eseguibile o programma eseguibile Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Indirizzi di un programma • Indirizzi di un programma eseguibile: • in formato assoluto: calcolati a partire da una specifica cella di memoria; si verifica se: • la memoria è partizionata staticamente e i programmi vengono allocati alla memoria in modo rigido • tutta la memoria è assegnata ad un unico programma utente • in formato rilocabile: calcolati come se il programma debba essere caricato in memoria a partire dalla cella zero Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Caricamento in memoria • Il caricamento in memoria centrale necessario all’esecuzione è effettuato da un programma detto loader • Il loader preleva dal disco il programma eseguibile e lo trasferisce nella memoria gestendo gli indirizzi: • Se il programma ha già indirizzi assoluti il loader deve caricare il programma in una specifica zona di memoria • Se il programma oggetto ha istruzioni in formato rilocabile il loader effettua la rilocazione Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Il caricamento: rilocazione degli indirizzi • Tipi di rilocazione degli indirizzi: • Statica: • avviene nel momento del caricamento in memoria modificando istruzione per istruzione gli indirizzi che compaiono nel programma in indirizzi assoluti • Non richiede ulteriori elaborazioni in esecuzione sugli indirizzi caricati come assoluti • Dinamica: • non comporta una modifica del codice, caricato in formato rilocabile • gli indirizzi assoluti sono calcolati durante l’esecuzione utilizzando il registro base che contiene l’indirizzo assoluto della cella di memoria a partire dalla quale è caricato il programma Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Esecuzione del programma • L’esecuzione del programma eseguibile (in linguaggio macchina) è effettuata nella CPU. Fondamenti di Informatica CDL in Ingegneria Gestionale(B) - A.A. 2010-2011