Concetti Fondamentali sulla Programmazione Cosa Significa Programmare Linguaggi di Programmazione Lo sviluppo dei programmi: tecniche di programmazione L’esecuzione dei programmi L’interpretazione La compilazione Le Librerie Le Fasi di Compilazione e Link Esempio in C 1 La Programmazione Dato un problema INFORMATICO, programmare significa: Definire l’algoritmo risolutivo, che deve essere finito e realizzabile con le risorse disponibili Tradurre l’algoritmo nel linguaggio di programmazione scelto, attraverso la particolare tecnica di programmazione scelta, rispettando le regole sintattiche del linguaggio 2 Linguaggi di programmazione: Linguaggio Macchina I primi linguaggi di programmazione coincidevano con l'insieme delle istruzioni eseguibili dall'hardware. Le istruzioni hardware sono codificate in codice binario: ogni informazione è rappresentata, all'interno della macchina, come una sequenza di bit. LOAD 8 potrà essere rappresentata in una macchina reale come 00110010, dove 0011 è la rappresentazione interna del codice operativo LOAD Enorme sforzo richiesto per codificare algoritmi semplici. 3 Linguaggi di programmazione: Assembly Dalla nascita dei primi calcolatori, si è cercato di diminuire lo sforzo e aumentare la produttività dell'utente, anche a costo di caricare la macchina di maggiori compiti. E’ meglio risparmiare il tempo dell'uomo anche a costo di sprecare tempo-macchina (traduzione di programmi e scarsa efficienza del programma). La prima evoluzione dei linguaggi di programmazione ha portato ad una codifica di tipo simbolico, anziché binaria, dei programmi. Tali versioni simboliche dei linguaggi hardware sono note come linguaggi assembly 4 Linguaggi di programmazione: Evoluzione Il passo successivo nell’evoluzione dei linguaggi di programmazione tese a rendere la codifica degli algoritmi il più possibile “vicina” al problema da risolvere anziché all'architettura della macchina destinata all'esecuzione del programma. Non a caso i primi due linguaggi di alto livello, FORTRAN e COBOL, hanno costrutti fortemente ispirati alla notazione usata per descrivere i problemi di maggior rilievo per il calcolo automatico degli anni '50, cioè l'elaborazione numerica e quella gestionale. Alto Livello Assembly Macchina/binario MicroProgrammi Hardware 5 Linguaggi di programmazione: Evoluzione Gli anni '70 vedono il fiorire dei linguaggi Strutturati: il SIMULA 67, l’ALGOL 68, ma soprattutto il PASCAL e il C Negli anni '80 si ha l'affermarsi dei linguaggi Object-Oriented (OO): C++, Visual BASIC, Java, C# 6 La Tecnica di Programmazione Non è legata ad un linguaggio, anche se alcuni linguaggi sono ideali per essere abbinati ad una specifica tecnica di programmazione Esistono tre tecniche: a) Programmazione NON Strutturata, che produce lo Spaghetti Code b) Programmazione Strutturata: Sequenza, Selezione, Ripetizione c) Programmazione ad Oggetti: Classe, Oggetto, Metodo 7 L’Esecuzione dei Programmi Il programma scritto in un qualunque linguaggio deve essere tradotto in linguaggio binario Esistono due soluzioni: Interpretazione Compilazione 8 L’Interpretazione Funzionamento di un interprete: Preleva un’istruzione I del programma P scritto nel linguaggio L Decodifica I Traduce I in una serie di istruzioni in linguaggio macchina M1, M2, … , Mn Esegue M1, M2, … , Mn Passa all’istruzione successiva di P fino a quando non si sia raggiunta una istruzione di terminazione 9 Lo sviluppo dei programmi basato sulla Compilazione File sorgente File sorgente File sorgente File sorgente Compilazione Compilazione Compilazione Compilazione File oggetto File oggetto File oggetto File oggetto Link Libreria/e File eseguibile I codici sorgente ed oggetto possono essere suddivisi in più file, il codice eseguibile di un programma risiede in un unico file 10 Le Funzioni di Libreria In molti linguaggi (quali il C), molte operazioni vengono delegate a delle librerie Le funzioni sono divise in gruppi, quali I/O, gestione della memoria, operazioni matematiche e manipolazione di stringhe Per ogni gruppo di funzioni esiste un file sorgente, chiamato file header, contenente le informazioni necessarie per utilizzare le funzioni (Dichiarazione costanti, funzioni, parametri delle funzioni, etc.) I nomi dei file header terminano, per convenzione, con l’estensione “.h” (ad es., stdio.h è il file header dello standard I/O nel linguaggio C) 11 La compilazione dei file sorgente Un file sorgente contiene un main e un insieme di routine, chiamate funzioni, ognuna delle quali risolve una piccola parte del problema di programmazione Un file sorgente può contenere chiamate a funzioni di libreria e chiamate a funzioni contenute in altri file sorgenti Il compilatore è esso stesso un programma (o un gruppo di programmi) che deve essere eseguito Durante la compilazione avviene: Controllo del codice sorgente da parte di un preprocessore: interpretare speciali direttive di precompilazione, Controllo di eventuali errori sintattici (NON LOGICI), Produzione di un file in codice Assembly, Trasformazione del file in codice Assembly in un altro file in codice OGGETTO (Macchina): estensione .obj 12 Il link Il linker è generalmente un programma distinto dal compilatore: in alcuni ambienti il programma di link deve essere lanciato separatamente Il Linker fa in modo che: i riferimenti tra diversi file oggetto e con le librerie vengano risolti i file oggetto creati dal compilatore vengano trasformati in un unico file eseguibile, al quale vengano associate le librerie necessarie all’esecuzione Il risultato prodotto dal Linker è un programma eseguibile, che può essere caricato in memoria 13 La Fase di Caricamento Il Caricamento di un programma in memoria, avviene nel momento in cui l’utente richiede la sua esecuzione Durante la fase di caricamento (o loading ), il programma eseguibile viene caricato nella memoria del calcolatore; Le Fasi di Compilazione, Linker e Loading sono separate (anche temporalmente) Attenzione: l’uso dei compilatori crea false impressioni ! 14 Esempio – Linguaggio C Molte idee basilari del C derivano dal linguaggio BCDL e linguaggio B Nel 1978 Kernighan e Ritchie pubblicano “The C Programming Language” Nel 1983 l’American National Standards Institute (ANSI) ha iniziato i lavori per la definizione dell’ANSI C Nel 1988 nasce l’ANSI C 15 Esempio – Linguaggio C Per includere un file header in un programma in linguaggio C, occorre inserire nel codice sorgente: include <nomefile.h> La direttiva include è rivolta al preprocessore Si chiama: Direttiva di Precompilazione Esempio: Per utilizzare printf(), che permette di visualizzare dati su terminale, è necessario inserire nel sorgente la direttiva di precompilazione: include <stdio.h> 16 Esempio – Linguaggio C include<stdio.h> Include la libreria standard di I/O main() Definisce una funzione main che non riceve alcun valore come argomento { printf(“Salve, mondo\n”); } main richiama la funzione di libreria printf per stampare la sequenza di caratteri specificata; \n indica il new line 17