Prof.Claudio Maccherani 1995

Documenti analoghi
LINGUAGGI DI ALTO LIVELLO

Il linguaggio di programmazione Python

DAGLI ALGORITMI AI LINGUAGGI. Linguaggi di Programmazione

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

la traduzione dei programmi ed introduzione a Java

Linguaggi di programmazione

Introduzione alla programmazione. Walter Didimo

LINGUAGGI DI PROGRAMMAZIONE E CODIFICA PROGRAMMI

Introduzione alla Programmazione. Giselda De Vita

LA CODIFICA DELLE INFORMAZIONI

Informatica ALGORITMI E LINGUAGGI DI PROGRAMMAZIONE. Francesco Tura. F. Tura

COMPILAZIONE. Tarsformazione di linguaggi

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

Concetti di Base sulla Programmazione. Prof.Ing.S.Cavalieri

Lez. 5 La Programmazione. Prof. Salvatore CUOMO

Linguaggi di alto livello, compilatori e interpreti

; programma MOV AX, DATO_1. ; somma al contenuto dell' accumulatore il contenuto del registro B

Linguaggi di Programmazione

Informatica. Terzo anno Prof. A. Longheu

Algoritmo. La programmazione. Algoritmo. Programmare. Procedimento di risoluzione di un problema

Appunti del corso di Informatica 1 (IN110 Fondamenti) 4 Linguaggi di programmazione

Linguaggi, compilatori e interpreti

Unità di apprendimento 6. Il software: dal linguaggio alla applicazione

Linguaggi di programmazione

Il calcolatore. Architettura di un calcolatore (Hardware)

Cos è un algoritmo. Si dice algoritmo la descrizione di un metodo di soluzione di un problema che sia

Calcolatori Elettronici Parte VIII: linguaggi assemblativi

Introduzione a Java. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi132 Sesto San Giovanni

Linguaggi e moduli. Dott. Franco Liberati

Programmazione: Sommario

10: I LINGUAGGI di PROGRAMMAZIONE PARTE 1

Linguaggi di programmazione e astrazione

Problema: dati i voti di tutti gli studenti di una classe determinare il voto medio della classe.

Fondamenti di Algoritmi

Introduzione al Linguaggio C Corso di Informatica Laurea in Fisica

Linguaggi di Programmazione

PROBLEMI ALGORITMI E PROGRAMMAZIONE

Macchine astratte, linguaggi, interpretazione, compilazione

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

TEORIE E TECNICHE PER LA COMUNICAZIONE DIGITALE

Corso di Fondamenti di Informatica Linguaggi di Programmazione

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

Davide Cervi Classe : 3E I.T.E Agostino Bassi - Lodi

Laboratorio di Calcolo Linguaggi di programmazione

Fondamenti di programmazione!! Parte 2!

Algoritmi e Linguaggi

Algoritmo Linguaggio macchina Linguaggi simbolici Compilatori ed Interpreti

Corso di Fondamenti di Informatica Linguaggi di Programmazione

Algoritmi, linguaggi e programmi. Emilio Di Giacomo e Walter Didimo

Linguaggi per COMUNICARE. Il linguaggio è un sistema codificato di segni che consente la comunicazione, intesa come scambio di informazioni

Fondamenti VBA. Che cos è VBA

Marta Capiluppi Dipartimento di Informatica Università di Verona

Unità Didattica 2 I Linguaggi di Programmazione

Programmazione Procedurale in Linguaggio C++

Sviluppo di programmi

Corso di Laurea Ingegneria Informatica Laboratorio di Informatica

Modulo 1. Concetti base della Tecnologia dell informazione. Prof. Nicolello Cristiano. Modulo 1

Programmazione C Massimo Callisto De Donato

Teoria dell Informazione

Informatica Generale Andrea Corradini I linguaggi di programmazione

Linguaggi di programmazione

Analizzatore lessicale o scanner. Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser.

Programmazione. Andrea Passerini Informatica. Programmazione

RAPPRESENTAZIONE GLI ALGORITMI NOTAZIONE PER LA RAPPRESENTAZIONE DI UN ALGORITMO

La Programmazione. Programmare Macchine Astratte Compilazione / Interpretazione Java. Laboratorio di Programmazione - Luca Tesei

LINGUAGGI - COMPILATORI - INTERPRETI

FONDAMENTI DI INFORMATICA

Funzioni, Stack e Visibilità delle Variabili in C

Informatica (A-K) 6. Linguaggi di programmazione

I linguaggi di alto livello

Sorgenti di errore. Laboratorio di Informatica 1

CONCETTI FONDAMENTALI

Cos è. In un linguaggio di programmazione si possono distinguere:

Laboratorio di Informatica. Esercitazione su algoritmi e diagrammi di flusso

Linguaggi e Paradigmi di Programmazione

Linguaggi di programmazione

Primi passi col linguaggio C

Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly

Introduzione a Visual Studio Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Il software: dall algoritmo al linguaggio macchina

Scope, Memoria e Tabella dei Simboli

Dall algoritmo al programma

Espressioni e Comandi

AMBIENTI DI PROGRAMMAZIONE

Lezione 16. Il Software di base

Traduzione ed Interpretazione

UD 3.2b: Programmazione in Pascal (1)

programmazione A.A Elementi di Informatica ( Lezione VI ) Linguaggi di programmazione Prof. Giovanni Gallo Dr.

LINGUAGGIO MACCHINA e ASSEMBLER. Una CPU MINIMA Il linguaggio macchina di MINIMA Il linguaggio Assembler per MINIMA

PROGRAMMAZIONE STRUTTURATA

Fortran in pillole : prima parte

Corso Programmazione

Macchina Astratta: struttura e realizzazione.

Lezione 13: Il linguaggio assembly di LC-3

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

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

LABORATORIO di INFORMATICA

Informazioni Generali. Esercitazioni di Informatica

Fasi di un Compilatore

Transcript:

I.T.C. "V.Emanuele II" - Perugia Prof.Claudio Maccherani 1995 2004 / 05 INDICE LINGUAGGI di PROGRAMMAZIONE...1 TRADUTTORI...1 INTERPRETE...2 COMPILATORE (e LINK)...3 ASSEMBLATORE...4 Confronto tra Assembler e Linguaggio Macchina...5 Breve elenco di alcuni linguaggi di programmazione...6

LINGUAGGI di PROGRAMMAZIONE Per realizzare un programma - da eseguire nel computer - che codifica un algoritmo occorre utilizzare un Linguaggio di Programmazione. Generalmente, per "linguaggio di programmazione" si intende un linguaggio ad ALTO LIVELLO, più vicino al programmatore. Ne esistono molti, suddivisi in imperativi e dichiarativi (e visuali): o imperativi - procedurali [Fortran, Cobol, Pascal, C, Basic], orientati agli oggetti [C++, Java, SmallTalk], paralleli [applicazioni parallele]; o dichiarativi - funzionali [Lisp], logici [Prolog] e relazionali [SQL]; o visuali - ad eventi e orientati agli oggetti [Basic Visual Basic, Pascal Delphi ]. Il computer, basato sulla logica binaria, è in grado di eseguire solamente programmi in linguaggio a BASSO LIVELLO, linguaggio MACCHINA, un linguaggio composto da istruzioni elementari scritte direttamente in binario {0,1}. Tale linguaggio non contempla il concetto di variabile, ma tutto è riferito a costanti o ad indirizzi di memoria centrale che contengono i dati. Questo significa che, dopo aver faticosissimamente scritto un programma in linguaggio macchina, cioè in "binario puro", calcolando esattamente tutti gli indirizzi di ogni istruzione e di ogni dato, se si deve inserire o cancellare un istruzione occorre ricalcolare tutti gli indirizzi e variare opportunamente tutte le istruzioni interessate, che saranno la stragrande maggioranza. Ad un livello intermedio tra i linguaggi ad alto livello ed il linguaggio macchina si pone il linguaggio ASSEMBLER, un linguaggio simbolico molto legato al linguaggio macchina - e quindi all hardware, al processore - ma molto più "evoluto" ed "umano" del linguaggio macchina. In Assembler viene introdotto il concetto di "variabile", cioè di un dato individuato da un nome simbolico e non più - come nel linguaggio macchina dal proprio indirizzo di memoria. TRADUTTORI Qualunque programma scritto in un qualsiasi linguaggio, ad alto livello o Assembler, per poter essere eseguito dal computer, deve essere tradotto in un equivalente programma in linguaggio macchina. Questa traduzione, per quanto concerne i linguaggi ad alto livello, viene fatta da appositi moduli (programmi) denominati compilatori e interpreti, che differiscono tra di loro solamente per la modalità di traduzione; il risultato è lo stesso, è il programma in linguaggio macchina. Ogni linguaggio di programmazione ad alto livello avrà il proprio compilatore e/o interprete. Per quanto concerne il linguaggio Assembler, la traduzione viene fatta da un apposito modulo (programma) chiamato assemblatore. programma in un linguaggio ad alto livello programma in un linguaggio assembler traduzione (compilatore o interprete) traduzione (assemblatore) programma in linguaggio macchina c o m p u t e r ( h a r d w a r e ) Linguaggi di programmazione e Traduttori - Prof.Claudio Maccherani - ITC"V.Emanuele II" Perugia - 2004 - Pag.1

INTERPRETE L interprete che nella maggior parte dei casi si identifica con il linguaggio stesso e con il suo ambiente di sviluppo, come nel caso del Visual Basic ha il compito di tradurre ogni istruzione di un programma scritto in un linguaggio ad alto livello in linguaggio macchina e di eseguirla immediatamente. In genere l ambiente integrato di sviluppo dispone di editore di testi per la stesura del programma sorgente, di interprete per la sua traduzuione ed esecuzione, di debugger per il rilvamento degli errori e di altri strumenti di ausilio alla programmazione, molto spesso anche del compilatore. Come si è detto, l interprete traduce ed esegue immediatamente le istruzioni iterando, per ciascuna di esse, i seguenti passi: lettura dell istruzione del programma sorgente traduzione dell istruzione letta in linguaggio macchina esecuzione dell istruzione tradotta Questo modo di operare implica che: ogni volta che si esegue un programma esso viene nuovamente tradotto; se una stessa istruzione viene eseguita più volte, essa sarà ritradotta ogni volta; al termine dell esecuzione del programma sorgente non resta alcuna traccia del programma in linguaggio macchina (non viene creato il programma eseguibile); per eseguire il programma occorre disporre dell interprete. Un tipico linguaggio "interpretato" è il Visual Basic, il cui ambiente di sviluppo fornisce, oltre ai vari strumenti di disegno e progettazione dell applicazione, anche il relativo compilatore": o l interprete si attiva da "Esegui"-"Avvia" (il programma sorgente viene tradotto ed eseguito, non viene creato alcun file intermedio) o il compilatore si attiva da "File"-"Crea progettox.exe " (i sorgenti.vbp,*..frm,.*.bas vengono tradotti in linguaggio macchina e viene creato un file eseguibile con lo stesso nome del progetto ed estenzione.exe, in linguaggio macchina, eseguibile) Linguaggi di programmazione e Traduttori - Prof.Claudio Maccherani - ITC"V.Emanuele II" Perugia - 2004 - Pag.2

COMPILATORE (e LINK) Il compilatore è un modulo - programma - che traduce un programma scritto in un linguaggio ad alto livello [file sorgente] in un equivalente programma in linguaggio macchina [modulo oggetto]. Ogni linguaggio di programmazione ad alto livello avrà il proprio compilatore. file sorgente (COBOL) compilatore COBOL modulo oggetto (ling.macchina) La compilazione avviene attraverso varie fasi successive: Gestione TABELLA dei SIMBOLI analisi lessicale analisi sintattica analisi semantica codice intermedio (assembler) assemblatore Trattamento Errori Analisi Lessicale: si riconoscono le sequenze di caratteri come elementi del lessico del linguaggio (parole chiave, identificatori, operatori, costanti, etichette). Durante questa fase viene aggiornata la Tabella dei Simboli (con gli identificatori, le parole chiave, le etichette) e segnalati eventuali errori lessicali (identificatori troppo lunghi, uso di caratteri non previsti, etc.). Analisi Sintattica: si riconoscono le strutture sintattiche del linguaggio e si segnalano eventuali errori di sintassi (espressioni scorrette, parole chiave mancanti o al posto sbagliato, punteggiatura). Analisi Semantica: si analizza semanticamente la struttura, si verifica che un identificatore non sia dichiarato più volte, che le variabili siano definite prima della loro utilizzazione, la presenza delle etichette per i salti, la compatibilità degli assegnamenti al tipo delle variabili e si segnalano eventuali errori semantici (identificatori non dichiarati, costanti troppo grandi, istruzioni non raggiungibili, variabili dichiarate due volte, etc.). Il risultato delle precedenti fasi, se non sono riscontrati errori, è la generazione di un codice intermedio Assembler che sarà sufficiente "assemblare" (utilizzando l assemblatore - vedi sotto) per ottenere il modulo oggetto in linguaggio macchina. Se non vengono riscontrati errori il modulo oggetto (.obj) risultato dalla compilazione è pronto per essere mandato in esecuzione (dopo "linkaggio"), in caso contrario tale modulo oggetto non viene generato. Rispetto all interprete, il compilatore traduce una sola volta il programma sorgente, dopo di che, al momento della sua esecuzione, tale traduzione non sarà ripetuta, diminuendo notevolmente il tempo di esecuzione. Per contro, in fase di sviluppo, per testare il programma, occorre ogni volta compilarlo, allungando così i tempi di realizzazione. La soluzione ideale è avere sia l interprete per lo sviluppo che il compilatore per produrre l eseguibile finale. La fase di "compilazione" crea un modulo oggetto.obj. Per rendere tale file eseguibile occorre "linkarlo", cioè "collegarlo" ad eventuali moduli esterni (sottoprogrammi e procedure), utilizzando un apposito programma LINK. sorgente (.cob) compilazione oggetto (.obj) link eseguibile (.exe) Linguaggi di programmazione e Traduttori - Prof.Claudio Maccherani - ITC"V.Emanuele II" Perugia - 2004 - Pag.3

ASSEMBLATORE L assemblatore è un modulo - programma - che traduce un programma Assembler in un equivalente programma in linguaggio macchina. La traduzione avviene in due passate: PRIMA PASSATA (determina gli indirizzi delle variabili) - determina la lunghezza delle istruzioni ed aggiorna il Contatore delle Locazioni (LC) - aggiorna la Tabella dei Simboli inserendo i simboli (nomi delle variabili e delle etichette) e, quando li incontra, il loro indirizzo - elabora alcune pseudo istruzioni (EQU, DS, DC, etc.) SECONDA PASSATA (genera il programma oggetto) - traduce i codici operativi da simbolici a linguaggio macchina binario - traduce gli indirizzi relativi lasciati in sospeso nella prima passata utilizzando la Tabella dei Simboli Vediamo come opera l Assemblatore - di un IBM 370 - quando traduce un programma Assembler che effettua la somma di due costanti, l equivalente, in un linguaggio ad alto livello, dell istruzione C = 22 + 33 programma C = 22 + 33 I passata II passata PIPPO START 0 USING *, 15 LR R1, A 0 LR 1,? [15] 0 LR 1, 12[15] ADD R1, B 4 ADD 1,? [15] 4 ADD 1, 16[15] ST R1, C 8 ST 1,? [15] 8 ST 1, 20[15] A DC F 22 12 22 12 22 B DC F 33 16 33 16 33 C DS 1F 20-20 - END LR R1,A carica nel registro R1 il contenuto di A (22) ADD R1, B somma al registro R1 il contenuto di B (33) ST R1, C memorizza il contenuto del registro R1 in C Nella PRIMA passata si comincia ad esaminare il programma a partire dalla sua prima istruzione. START è una pseudo istruzione - cioè un istruzione per l assemblatore - che serve a dare il nome al programma (in questo caso PIPPO) e a dire qual è il suo indirizzo iniziale (in questo caso 0). USING è un altra pseudo istruzione che dichiara il registro 15 quale "registro base" (cioè il registro che, al momento del caricamento del programma in memoria centrale, conterrà l indirizzo fisico della sua prima istruzione, qui LR; valore che, sommato agli indirizzi logici calcolati dall assemblatore, produrrà gli equivalenti indirizzi fisici - rilocazione degli indirizzi). Mancano gli indirizzi di A, B e C che sono costituiti sommando il relativo indirizzo logico o dispalcement - 12, 16, 20 che però in questa prima passata ancora non sono noti - calcolato dall assmblatore all indirizzo di caricamento del programma in memoria centrale contenuto del registro base 15. In questa fase si può solo aggiornare il Contatore delle Locazioni (LC) della lunghezza dell istruzione corrente e passare all istruzione successiva e poi, quando si arriva all area dati, si può determinare l indirizzo delle costanti e delle variabili. Terminata la PRIMA passata si procede, ripartendo dall inizio, con la SECONDA passata. Le varie istruzioni vengono tradotte sostituendo al loro codice operativo simbolico il relativo codice operativo binario contenuto in una apposita Tabella dei Codici Operativi e si sostituiscono nelle varie istruzioni gli indirizzi relativi lasciati precedentemente in sospeso (?) con quelli presenti nella Tabella dei Simboli costruita durante la PRIMA passata. Linguaggi di programmazione e Traduttori - Prof.Claudio Maccherani - ITC"V.Emanuele II" Perugia - 2004 - Pag.4

Confronto tra Assembler e Linguaggio Macchina Per avere un idea della differenza che c è tra i vari livelli di linguaggi, vediamo come un programma che assegna alla variabile C la somma delle costanti 22 e 33 viene scritto ai diversi livelli: Linguaggio Alto Livello Assembler Linguaggio Macchina C = 22 + 33 PIPPO START 0 indir cod.op. operandi USING *, 15 LR R1, A 0 LR 1, 12[15] 0 00011100 00000001 00001100 00001111 ADD R1, B 4 ADD 1, 16[15] 4 00111001 00000001 00010000 00001111 ST R1, C 8 ST 1, 20[15] 8 01110001 00000001 00010100 00001111 A DC F 22 12 22 12 00010100 costante 22 B DC F 33 16 33 16 00100001 costante 33 C DS 1F 20-20 area per il risultato (C) END Come si vede dall esempio sopra riportato, il rapporto tra linguaggi ad alto livello e l Assembler è 1:N (ad una istruzione del linguaggio ad alto livello equivalgono N istruzioni in linguaggio Assembler), mentre il rapporto tra il lingiaggio Assembler e il linguaggio macchina è 1:1 (a un istruzione Assembler equivale un istruzione in linguaggio macchina). Programmare in Linguaggio Macchina - esempio lampante di supremo masochismo signfica non solo scrivere ogni istruzione in binario (codici operativi, operandi, costanti, etc ), ma anche e soprattutto calcolare accuratamente tutti gli indirizzi delle istruzioni e delle aree dati contenenti le costanti e le variabili, aree dati che vengono allocate subito dopo l ultima istruzione eseguibile del programma. Questo significa che prima occorre scrivere il programma calcolando l indirizzo di ogni successiva istruzione ed alla fine si potranno avere gli indirizzi delle aree dati che dovranno essere utilizzati nelle istruzioni stesse. Per non parlare del caso di dover modificare il programma inserendo e/o cancellando una o più istruzioni: occorre ricalcolare la gran parte degli indirizzi e sostituirli in tutte le istruzioni che ne fanno riferimento: una vera tragedia. Passare allora alla programmazione in Assembler, dopo aver scritto anche un solo programma in linguaggio macchina, è un vero sollievo. Non occorre più scrivere tutto in binario, ma si utilizzano codici operativi simbolici e mnemonici [ST-store/memorizza, ADD-addiziona, LR-load_register/carica nel registro, etc..] e, soprattutto, le etichette delle istruzioni e i nomi simbolici delle aree dati, costanti e/o variabili che siano. A tradurre il tutto in binario e a calcolare esattamente ogni indirizzo ci pensa il nostro amico Assemblatore al quale passiamo in input il file sorgente assembler e che ci restituisce in output il relativo programma - modulo oggetto - tradotto in linguaggio macchina. Se dobbiamo apportare delle modifiche al programma - variare, cancellare, inserire istruzioni - non ci sono problemi: facciamo le nostre modifiche e poi assembliamo di nuovo il sorgente. Il nostro amico Assemblatore penserà a tutto, tradurrà di nuovo il sorgente in binario e ricalcolerà tutti gli indirizzi, fornendoci il modulo oggetto in linguaggio macchina, aggiornato con le nostre variazioni. Ma la vera goduria è programmare utilizzando uno dei tantissimi linguaggia ad Alto Livello. Con una semplice istruzione scriviamo l equivalente di un intero programma Assembler. A tradurre il tutto in Linguaggio Macchina ci penserà poi l Interprete e/o il Compilatore, in un modo così discreto che noi neppure ce ne accorgiamo. Linguaggi di programmazione e Traduttori - Prof.Claudio Maccherani - ITC"V.Emanuele II" Perugia - 2004 - Pag.5

Breve elenco di alcuni linguaggi di programmazione La prima programmatrice è stata la contessa di Lovelace, Ada Byron, figlia del poeta Lord Byron, che nel 1842 scrisse i primi programmi della storia. Il primo linguaggio di programmazione, il Plankalkül, di Konrad Zuse, è del 1945. Segue un breve elenco di alcuni dei principali linguaggi di programmazione, con il relativo anno di realizzazione: A-0 (1952), FLOW-MATIC (1955), FORTRAN (1955), IPL (1956), FORTRAN II (1958), ALGOL 58 (1958), LISP (1959), RPG (1959), COBOL (1960), FORTRAN III (1962), APL (1962), SIMULA (1962), SNOBOL (1962), PL/1 (1964), BASIC (1964), FORTRAN IV (1966), SIMULA 67 (1967), SNOBOL 4 (1967), ALGOL 68 (1968), FORTH (1968), B (1970), PASCAL (1971), SMALLTALK (1972), C (1972), PROLOG (1973), MODULA (1977), FORTRAN 77 (1978), VISICALC (1978), SMALLTALK80 (1980), ADA (1983), TURBO PASCAL (1983), C++ (1983), CLIPPER (1984), PARADOX (1985), SQL-1 (1987), PERL (1987), DBASEIV (1988), PYTHON (1991), VISUAL BASIC 1 (1992), VISUAL BASIC 3 (1993), PHP (1994), ADA 95 (1995), DELPHI (1995), JAVA (1995), VISUAL BASIC 4 (1995), VISUAL BASIC 5 (1997), VISUAL BASIC 6 (1998), D (2000), C# (2001), VISUAL BASIC.NET (2001). Linguaggi di programmazione e Traduttori - Prof.Claudio Maccherani - ITC"V.Emanuele II" Perugia - 2004 - Pag.6