Linguaggi di programmazione Programmazione L attività con cui si predispone l elaboratore ad eseguire un particolare insieme di azioni su particolari dati, allo scopo di risolvere un problema Dati Input Elaboratore Elettronico Risultati Output Fondamenti di Informatica 2
Linguaggio di programmazione Insieme di regole per la descrizione formale di un algoritmo eseguibile da un calcolatore: Lessico (alfabeto): insieme dei termini disponibili Sintassi: forma delle frasi Semantica: significato delle frasi Fondamenti di Informatica 3 Algoritmi, programmi e calcolatori Ogni elaboratore è una macchina in grado di eseguire azioni elementari su oggetti detti DATI L esecuzione delle azioni è richiesta all elaboratore tramite comandi elementari chiamati ISTRUZIONI espresse mediante un opportuno formalismo: il LINGUAGGIO DI PROGRAMMAZIONE La formulazione testuale di un algoritmo in un linguaggio comprensibile ad un elaboratore è detta PROGRAMMA Fondamenti di Informatica 4
Programma Un programma è un testo scritto in accordo alla sintassi e alla semantica di un linguaggio di programmazione Un programma è la formulazione testuale, in un certo linguaggio di programmazione, di un algoritmo che risolve un dato problema È composto da un numero finito di istruzioni Ogni istruzione descrive una operazione Fondamenti di Informatica 5 Algoritmo e programma Passi per la risoluzione di un problema: Individuazione di un procedimento risolutivo Scomposizione del procedimento in un insieme ordinato di azioni ALGORITMO Rappresentazione dei dati e dell algoritmo attraverso un formalismo comprensibile dal calcolatore PROGRAMMA Problema Algoritmo Programma Metodo risolutivo Linguaggio di programmazione Fondamenti di Informatica 6
Compiti del programmatore Analizzare il problema riducendolo in termini astratti, eliminando ogni componente non indispensabile e formulando un modello del problema. Individuare una strategia risolutiva e ricondurla ad un algoritmo. Codificare l algoritmo in modo tale da renderlo comprensibile al calcolatore. Analizzare il risultato dell elaborazione evidenziando eventuali errori nella formulazione del problema, nella strategia risolutiva, nella codifica dell algoritmo. Fondamenti di Informatica 7 Competenze ed abilità del programmatore Deve essere in grado di capire i problemi e schematizzarli, distinguendone le diverse componenti (dati in input, parametri del problema, dati in output). Deve essere in grado di risolvere problemi mediante un approccio algoritmico, individuando gli aspetti del problema che possano essere risolti reiterando più volte operazioni simili. Deve conoscere i metodi fondamentali di risoluzione dei problemi, gli approcci più comuni, le strade notoriamente meno convenienti. Deve conoscere a fondo le caratteristiche e le capacità del calcolatore. Deve essere in grado di comunicare con il calcolatore: ne deve conoscere il linguaggio. Fondamenti di Informatica 8
Linguaggi di programmazione Classificati rispetto alle caratteristiche principali: potere espressivo che influenza lo stile di programmazione Fondamenti di Informatica 9 Linguaggi Diversi tipi di linguaggi: Imperativi Funzionali Dichiarativi A oggetti Tutti basati sulla traduzione nell'unico linguaggio eseguibile dal calcolatore: il Linguaggio Macchina Fondamenti di Informatica 10
Linguaggio Macchina Insieme di istruzioni eseguibili dalla CPU Dipende dalla CPU: cablata al suo interno, ogni istruzione genera una sequenza di segnali di controllo Linguaggio di basso livello si può accedere direttamente alle funzionalità di base del calcolatore Fondamenti di Informatica 11 Linguaggio Macchina Complesso da utilizzare: ogni istruzione esegue un'operazione semplicissima esistono librerie con procedure generali Gli altri linguaggi vengono convertiti in sequenze di istruzioni in linguaggio macchina Fondamenti di Informatica 12
Linguaggio Macchina Il Linguaggio Macchina è estremamente efficiente I programmi sono: più veloci più corti ma più complessi Fondamenti di Informatica 13 Linguaggi - basso livello Il linguaggio macchina specifica solo le operazioni che l'elaboratore può eseguire sintattica molto elementare" diverso per ogni processore dipende dalle caratteristiche architetturali della CPU E' più orientato alla macchina che ai problemi da trattare è infatti definito di "basso livello Le istruzioni devono essere espresse come sequenze di bit! Fondamenti di Informatica 14
Linguaggio Macchina La scrittura è complessa: istruzioni formate da stringhe di 1 e 0: quindi è necessario un insieme di simboli (Linguaggio Assembly) per referenziare le locazioni di memoria è necessario avere delle etichette necessario commentare ogni istruzione Fondamenti di Informatica 15 Linguaggi - basso livello Una prima evoluzione è stata l'introduzione di linguaggi simbolici: linguaggi assemblativi (assembly) ancora orientati alla macchina e non ai problemi più immediati da utilizzare definiscono variabili, simboli,... Fondamenti di Informatica 16
Linguaggi - alto livello Altri linguaggi sono basati su: la descrizione del problema in modo intuitivo, dimenticandosi che verranno eseguiti da un calcolatore obiettivo: fornire un mezzo espressivo per specificare all'elaboratore il compito da eseguire Fondamenti di Informatica 17 Linguaggi - alto livello Caratteristiche: ognuno ha i propri paradigmi che garantiscono forme espressive appropriate per alcuni problemi specifici questa specificità ha favorito la loro proliferazione (fenomeno intrinseco alla natura del linguaggio come forma di comunicazione) Fondamenti di Informatica 18
Linguaggi La programmazione a basso livello è più ardua e meno intuitiva, ma consente di sviluppare programmi efficienti. Ad alto livello la programmazione è più naturale e rapida, ma è possibile che non consenta di produrre software efficiente. Efficienza del programma Programmazione a basso livello Programmazione ad alto livello Facilità e velocità di programmazione Fondamenti di Informatica 19 Tipologie di linguaggi Possiamo aggregare i numerosi linguaggi di programmazione esistenti (ad alto livello) sulla base del modello astratto di programmazione che sottintendono e che è necessario adottare per utilizzarli. Linguaggi di programmazione Imperativi Dichiarativi Procedurali C, Pascal, Fortran Ad oggetti C++, Java Paralleli Funzionali Lisp Logici Prolog Fondamenti di Informatica 20
Linguaggi Imperativi permettono di descrivere operazioni più complesse di quelle che l'elaboratore può eseguire direttamente livello di astrazione più alto risalgono agli anni '50 detti di alto livello di tipo imperativo Es: Basic, Fortran, Pascal, C Fondamenti di Informatica 21 Linguaggi Imperativi Caratteristiche: di utilizzo più semplice indipendenti dall'elaboratore purtroppo ancora legati al modello di Von Neumann: i programmi sono ancora una sequenza di istruzioni; l'evoluzione del calcolo è costituita da una variazione dello stato della memoria Fondamenti di Informatica 22
Linguaggi Imperativi Eseguono 3 tipi di operazioni: trasferimento dati operazioni aritmetiche alterazione del flusso del programma Fondamenti di Informatica 23 Linguaggi Funzionali Non sono legati al modello di Von Neumann ma al concetto di programmazione funzionale Il primo linguaggio funzionale: Lisp (List Processing), fine anni '50 caratteristiche di manipolazione agevole di informazioni di tipo simbolico Fondamenti di Informatica 24
Linguaggi Funzionali Differenze con i linguaggi imperativi: il calcolo è basato sul calcolo di valori e non sull'assegnamento di valori a variabili basato su valori e non su effetti il risultato è il risultato di una funzione, non l'effetto causato dalla esecuzione di una sequenza di operazioni Fondamenti di Informatica 25 Linguaggi Logici Basati sulla logica obiettivo: formalizzare il ragionamento caratterizzati da meccanismi deduttivi Programmare significa: descrivere il problema con formule del linguaggio interrogare il sistema, che effettua deduzioni sulla base delle definizioni Fondamenti di Informatica 26
Linguaggi Logici Programmazione: semplice (occorre solo definire la propria conoscenza del problema) avviene tramite una formulazione dichiarativa Esempio: Prolog Fondamenti di Informatica 27 Linguaggi a Oggetti Sono nati di recente Favoriscono la modularità ed il riutilizzo del codice Modellazione del problema da risolvere come un insieme di oggetti che si scambiano messaggi Es: C++, Java Fondamenti di Informatica 28
Traduzione dei programmi Affinchè un programma scritto in un qualsiasi linguaggio di programmazione sia comprensibile (e quindi eseguibile) da un calcolatore, occorre tradurlo dal linguaggio originario al linguaggio della macchina Questa operazione viene normalmente svolta da speciali programmi detti traduttori Fondamenti di Informatica 29 Traduzione di un programma Il traduttore converte: Il testo di un programma scritto in un particolare linguaggio di programmazione (sorgente) nella corrispondente rappresentazione in linguaggio macchina (programma eseguibile) sorgente X=X+1; If X>0 traduzione eseguibile 0010100 01001.. 10010 Fondamenti di Informatica 30
Compilatori e Interpreti Esistono due categorie di traduttori: i compilatori: traducono l intero programma (senza eseguirlo) e producono in uscita il programma convertito in linguaggio macchina gli interpreti: traducono ed eseguono immediatamente ogni singola istruzione del programma sorgente Fondamenti di Informatica 31 Interprete L interprete: itera più volte questo processo Legge un istruzione del programma sorgente Traduce l istruzione in linguaggio macchina Esegue l istruzione Passa all interpretazione dell istruzione successiva Al termine di questa operazione, del programma in linguaggio macchina non rimane alcuna traccia (la traduzione non viene memorizzata) Se il programma torna più volte su una stessa istruzione, questa verrà tradotta (ed eseguita) ogni volta. È necessario disporre dell interprete per poter eseguire il programma. Fondamenti di Informatica 32
Compilatore Compilatore: esegue una sola volta il processo Legge tutte le istruzioni del programma sorgente e le traduce in linguaggio macchina. Memorizza su disco il programma eseguibile tradotto in linguaggio macchina. Al termine della compilazione avremo un programma eseguibile in linguaggio macchina. La traduzione di ogni istruzione del programma avviene una sola volta, anche se una stessa istruzione viene ripetuta più volte all interno del programma. Non ho bisogno di avere il compilatore ed il sorgente per eseguire il programma: mi basta il programma eseguibile Fondamenti di Informatica 33 Compilatori e Interpreti sorgente X=X+1; If X>0 traduzione eseguibile 0010100 01001.. 10010 esecuzione Nel caso del compilatore, lo schema precedente viene percorso una volta sola, prima dell esecuzione Nel caso dell interprete, lo schema viene invece attraversato tante volte quante sono le istruzioni che compongono il programma Fondamenti di Informatica 34
Compilatori e Interpreti Tipicamente, l esecuzione di un programma compilato è più veloce dell esecuzione di un programma interpretato Fondamenti di Informatica 35 Esecuzione dei programmi Nel caso dei compilatori, l'esecuzione di un programma scritto con un linguaggio ad alto livello è preceduta dai seguenti passi: 1. traduzione in linguaggio macchina 2. collegamento con programmi di supporto (calcoli, comunicazione con periferiche, ) 3. caricamento in memoria Fondamenti di Informatica 36
Traduzione in linguaggio macchina: compilatore Viene suddivisa in 2 passi: analisi (lessicale, grammaticale, contestuale) trasformazione del programma sorgente in programma oggetto (forma più vicina al linguaggio macchina): creazione tabella simboli ottimizzazioni (rimozione ripetizioni, eliminazione cicli, sfruttamento registri, ); livelli di ottimizzazione Fondamenti di Informatica 37 Collegamento con programmi di supporto linker Il codice oggetto così formato: può ancora contenere dei simboli irrisolti riferimenti esterni a programmi di servizio (accesso alle periferiche, calcoli matematici,...) contiene indirizzi relativi Il linker serve per collegare diversi moduli oggetto, e formare un unico programma eseguibile Fondamenti di Informatica 38
Caricamento in memoria: loader Il Loader serve per caricare in memoria un programma Nel caricamento vengono fissati tutti gli indirizzi relativi variabili, salti, Vengono caricati anche i moduli di supporto, se necessari Fondamenti di Informatica 39 Costruzione manuale In passato, la costruzione dell eseguibile si faceva a mano, attivando compilatore e linker dalla linea di comando del sistema operativo (DOS, Unix,...) C:\PROVA> gcc -c f1.c (genera f1.obj) C:\PROVA> ld -o prog.exe f1.obj lc (genera prog.exe) Eseguibile da produrre File oggetto Libreria di sistema C Fondamenti di Informatica 40
Ambienti Integrati Oggi, gli ambienti di lavoro integrati (IDE Integrated Development Environments) automatizzano la procedura: compilano i file sorgente (se e quando necessario) invocano il linker per costruire l eseguibile ma per farlo devono sapere: quali file sorgente costituiscono l applicazione il nome dell eseguibile da produrre. Fondamenti di Informatica 41