Il programma. Breve storia della programmazione



Documenti analoghi
Corso di Informatica

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

Il Software e Il Sistema Operativo. Prof. Francesco Accarino IIS Altiero Spinelli A.S. 09/10

Fondamenti di Informatica Ingegneria Clinica Lezione 16/10/2009. Prof. Raffaele Nicolussi

Programmi. Algoritmi scritti in un linguaggio di programmazione

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

Software di sistema e software applicativo. I programmi che fanno funzionare il computer e quelli che gli permettono di svolgere attività specifiche

Il software impiegato su un computer si distingue in: Sistema Operativo Compilatori per produrre programmi

Dispensa di Informatica I.1

Linguaggi e Paradigmi di Programmazione

Linguaggi di programmazione

Approccio stratificato

L informatica INTRODUZIONE. L informatica. Tassonomia: criteri. È la disciplina scientifica che studia

Introduzione alla programmazione in C

Corso di Informatica

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

EVOLUZIONE DEI LINGUAGGI DI ALTO LIVELLO

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

Il database management system Access

Scopo della lezione. Informatica. Informatica - def. 1. Informatica

Introduzione Ai Data Bases. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San giovanni

Programmazione in Java e gestione della grafica (I modulo) Lezione 1: Presentazione corso

Il Sistema Operativo

Sistema Operativo. Fondamenti di Informatica 1. Il Sistema Operativo

Appunti sulla Macchina di Turing. Macchina di Turing

Origini e caratteristiche dei calcolatori elettronici

I componenti di un Sistema di elaborazione. Memoria centrale. È costituita da una serie di CHIP disposti su una scheda elettronica

Introduzione a Dev-C++

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Software. Algoritmo. Algoritmo INFORMATICA PER LE DISCIPLINE UMANISTICHE 2 (13042)

Strumenti per la programmazione

Scienze della Comunicazione Università di Salerno. UD 3.2a: Introduzione alla Programmazione

Dispense di Informatica per l ITG Valadier

Il Software. Il software del PC. Il BIOS

Linguaggi di programmazione

Il Sistema Operativo (1)

Che cosa è un VIRUS?

Informatica pratica. File e cartelle

I Problemi e la loro Soluzione. Il Concetto Intuitivo di Calcolatore. Risoluzione di un Problema. Esempio

Fondamenti di Informatica PROBLEMI E ALGORITMI. Fondamenti di Informatica - D. Talia - UNICAL 1

AXO Architettura dei Calcolatori e Sistema Operativo. processo di assemblaggio

Introduzione. Informatica B. Daniele Loiacono

Scuola Secondaria di Primo Grado Anna Frank Nome Cognome classe anno sc. 2008/09 INFORMATICA

Informatica per la comunicazione" - lezione 7 -

Fasi di creazione di un programma

Informatica per le discipline umanistiche 2 lezione 14

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

Software. Definizione, tipologie, progettazione

Archivi e database. Prof. Michele Batocchi A.S. 2013/2014

Corso di PHP. Prerequisiti. 1 - Introduzione

Linguaggio C. Fondamenti. Struttura di un programma.

La Macchina Virtuale

ASPETTI GENERALI DI LINUX. Parte 2 Struttura interna del sistema LINUX

RISOLUTORE AUTOMATICO PER SUDOKU

Software relazione. Software di base Software applicativo. Hardware. Bios. Sistema operativo. Programmi applicativi

Sistemi Operativi STRUTTURA DEI SISTEMI OPERATIVI 3.1. Sistemi Operativi. D. Talia - UNICAL

Metodologie di programmazione in Fortran 90

I sistemi di numerazione

Introduzione alle basi di dati. Gestione delle informazioni. Gestione delle informazioni. Sistema informatico

INFORMATICA GENERALE. Prof Alberto Postiglione Dipartim. Scienze della Comunicazione Univ. Salerno. Università degli Studi di Salerno

PLC Sistemi a Logica Programmabile Il linguaggi di programmazione

Contenuti. Visione macroscopica Hardware Software. 1 Introduzione. 2 Rappresentazione dell informazione. 3 Architettura del calcolatore

Gian Luca Marcialis studio degli algoritmi programma linguaggi LINGUAGGIO C

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

SOFTWARE. È l insieme delle istruzioni che è necessario fornire alla macchina per il suo funzionamento. Vi sono due categorie di software:

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Architetture Applicative

Più processori uguale più velocità?

Laboratorio di Informatica

4 3 4 = 4 x x x 10 0 aaa

Protezione. Protezione. Protezione. Obiettivi della protezione

DATABASE. nozioni di base

SISTEMI OPERATIVI. Prof. Enrico Terrone A. S: 2008/09

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Il calcolatore oggi : UN SISTEMA DI ELABORAZIONE

1. BASI DI DATI: GENERALITÀ

GLI ARCHIVI DI DATI. File Un File è una sequenza di informazioni che costituisce una unità logica. Un file è un un contenitore di di informazioni

Esame di INFORMATICA

Il Web Server e il protocollo HTTP

Il SOFTWARE DI BASE (o SOFTWARE DI SISTEMA)

NozionidiBase di Informatica

Lezione V. Aula Multimediale - sabato 29/03/2008

Sistemi operativi. Esempi di sistemi operativi

Database. Si ringrazia Marco Bertini per le slides

INFORMATICA 1 L. Mezzalira

VIRTUALIZZAZIONE. Docente: Marco Sechi Modulo 1

Object Oriented Programming

Informazione analogica e digitale

Soluzione dell esercizio del 2 Febbraio 2004

Architettura hardware

IL SISTEMA OPERATIVO IL SISTEMA OPERATIVO INTERFACCE TESTUALI INTERFACCE TESTUALI FUNZIONI DEL SISTEMA OPERATIVO INTERFACCE GRAFICHE

Informatica - A.A. 2010/11

Introduzione al sistema operativo Il file system: file, directory,...

Introduzione alle tecnologie informatiche. Strumenti mentali per il futuro

Excel. A cura di Luigi Labonia. luigi.lab@libero.it

Introduzione. Laboratorio di Calcolo Corso di Laurea in Fisica. Università degli Studi di Roma La Sapienza

LINGUAGGI DI PROGRAMMAZIONE

Algoritmo. I dati su cui opera un'istruzione sono forniti all'algoritmo dall'esterno oppure sono il risultato di istruzioni eseguite precedentemente.

Transcript:

Il programma Si definisce "programma" qualsiasi sequenza di istruzioni scritte in linguaggio macchina (l'unico linguaggio comprensibile ad un calcolatore, le famose sequenze di 0 e 1) atta ad essere elaborata da un calcolatore o comunque da una struttura informatica. Ogni volta che accendiamo il PC facciamo uso di programmi. Word e Outlook sono programmi. WindowsMediaPlayer è un programma. Windows stesso non è altro che un programma (un "programma di base" o "software di base"). Anche i virus sono dei programmi eseguibili. Si pone qui il problema di come scrivere un programma. Per questa esigenza si fa ricorso ai linguaggi di programmazione. Breve storia della programmazione I linguaggi a basso livello In principio, quando i computer erano enormi mobili chiusi a chiave dentro le stanze delle università o dei laboratori di ricerca, era il programmatore stesso a dettare le istruzioni binarie al calcolatore. Ma scrivere programmi usando sequenze di 0 e 1 non è certo la cosa più comoda del mondo, oltre ad essere del tutto innaturale per l'uomo. Passiamo alla metà degli anni 50: i programmatori creano un sistema più "comodo" per creare i loro progetti, l'assembly. L'Assembly (o gli Assembly, dato che la sintassi di questo linguaggio cambia in funzione di molte variabili, quali il sistema operativo in uso, l'architettura della macchina che si va a programmare e l'assemblatore in uso) non è altro che una rappresentazione simbolica del linguaggio macchina, dove ad ogni istruzione binaria corrisponde un'istruzione mnemonica, relativamente più semplice da ricordare. Così la sequenza 1100 1101 0010 0001, o CD 21 (linguaggio macchina) diventa int 21h (sintassi Assembly Intel). I linguaggi a medio/alto livello Ma l'assembly non è il massimo della vita. E' pur sempre un linguaggio orientato alla macchina, non al problema, e, col passare degli anni i progetti si fanno via via più grandi, e l'assembly da solo non può gestirli. Ecco quindi che compaiono sulla scena i primi linguaggi ad "alto livello", ossia linguaggi più orientati al problema (e quindi all'utente) che all'architettura intrinseca della macchina. Sono il COBOL, il BASIC e il FORTRAN, linguaggi molto più semplici dell'assembly ma non altrettanto potenti. Anche questi linguaggi hanno le loro pecche: il COBOL ha delle regole sintattiche troppo rigide per essere usato dalle masse di programmatori, ed è dedicato ad uno scopo, ovvero la gestione di basi di dati (archivi) piuttosto primitive e di applicazioni per il business, che non lo rende universale. Il FORTRAN è ottimo per la progettazione di applicazioni a carattere scientifico, ma non per la progettazione di codice di sistema, il BASIC, nonostante la sua incredibile facilità di apprendimento, non è potente, e non ha una struttura vera e propria. Inoltre, questi tre linguaggi si basano tutti sull'istruzione GOTO ("vai a"), ripresa dall'istruzione JMP dell'assembly, quindi i programmi scritti con questi linguaggi tendono al cosiddetto "codice spaghetti", un codice spezzettato, pieno di diramazioni e salti condizionati che rendono spesso il programma illeggibile, un vero dramma quando si tratta di fare manutenzione.

Nasce quindi il PASCAL, un linguaggio ad alto livello dotato di una struttura e di istruzioni vere e proprie per il controllo del flusso del programma, ma non progettato per un vasto campo di azione, quindi poco efficiente per la scrittura di codice di sistema. Al giorno d'oggi il PASCAL è usato solo per scopi didattici, grazie alla sua semplicità di apprendimento e alla sua sintassi "pulita". Il C Arriviamo all'inizio degli anni 70, l'hardware diventa sempre più potente e la richiesta di software cresce giorno dopo giorno, ma non esiste ancora un linguaggio ad alto livello che soddisfi qualsiasi richiesta di software. Fino al 1972, "l'ora zero" del linguaggio C: in un laboratorio della AT&T Bell Dennis Ritchie fa girare un primo prototipo del C su un DEC PDP-11 con sistema operativo UNIX. Il C fu il risultato dello sviluppo di due linguaggi di programmazione più vecchi: il B (sviluppato da Ken Thompson) e il BCPL (sviluppato da Martin Richards). Per anni il linguaggio C fu strettamente legato al sistema operativo UNIX (infatti, dopo la progettazione del C, tutte le successive versioni di UNIX furono scritte in questo linguaggio, e ancora oggi i kernel UNIX sono scritti in C). Nel 1989, alla luce dei vari "stili" del C formatisi, l'ansi (American National Standards Institute) mise a punto l'ansi-c, una versione standard del C priva di ambiguità, che è in uso tutt oggi. La novità del C, ed anche il motivo di tutto il suo successo, è che il C è un linguaggio di programmazione sviluppato dai programmatori stessi, e non da un'istituzione governativa o da un'università, per i programmatori stessi: questo rende il C il linguaggio dei programmatori. Unita a questa caratteristica, c'è la versatilità del C: un linguaggio usato tanto per semplici programmini didattici, tanto per programmare sistemi operativi: è un linguaggio che si presta ad un'infinità di usi, grazie anche ad una libreria davvero vastissima. Il C infatti, a differenza degli altri linguaggi di programmazione, ha davvero pochissime keyword (parole riservate), ma una vastissima gamma di funzioni che spaziano dalle funzioni per l'i/o standard alle funzioni matematiche, dalla manipolazione dei files alla gestione della memoria, dagli strumenti per la creazione di interfacce grafiche (GUI). Inoltre, chiunque può aggiungere nuove funzioni a quelle che corredano il C, e questo è un altro elemento che rende il C tanto flessibile e potente. E' inoltre uno dei pochi linguaggi ad alto livello che mette a disposizione delle funzioni per la gestione della memoria e dei processi, o anche per la gestione di porte e periferiche di I/O (operazioni notoriamente di basso livello): se voglio creare un programma che gestisca queste componenti, devo fare assolutamente ricorso ad un linguaggio di basso livello come l'assembly. L'evoluzione ad oggetti del C - il C++ Del 1982 è invece il C++ che, a differenza di quello che pensano in molti, non è un nuovo linguaggio, bensì un'evoluzione naturale del C; un programma scritto in C infatti verrà compilato senza problemi anche da un compilatore C++. Tuttavia, il C++ mette a disposizione del programmatore la OOP, la programmazione orientata agli oggetti, che non è qualcosa che si "aggiunge" al programma, bensì è un modo totalmente diverso di concepire un'applicazione. Quando si ha che fare con grandi progetti diventa difficile gestire l'applicazione nella sua interezza. Qui entra in soccorso il C++, che permette al programmatore di gestire le singoli componenti del programma come oggetti, ossia come componenti intrinseche del linguaggio stesso; gli oggetti sono disposti in classi, che sono la loro rappresentazione astratta, ed ogni classe può ereditare oggetti da altre classi o cambiare la loro visibilità all'interno del programma (esistono oggetti privati, protetti e pubblici). La potenza della OOP permette al programmatore di fare cose davvero interessanti, come ridefinire gli operatori, fare l'overloading di funzioni, creare tipi di dati "su misura" (con i template), gestire le eccezioni in modo potente (con i blocchi try e catch).

Ovviamente, occorre procedere per passi: non si possono apprezzare appieno le novità introdotte dal C++ se non si ha familiarità col C. La programmazione oggi Nel 1991 fu concepito il Java che, pur essendo un linguaggio a se stante, è considerato da molti come un'evoluzione del C++. Infatti, la sintassi di questo linguaggio deve molto al C/C++, i costrutti alla base sono molto simili. Ciononostante, il Java si pone come obiettivi quello di essere un linguaggio di programmazione orientato al Web (ed è diventato con gli anni il linguaggio di programmazione del Web, grazie ai suoi meccanismi estremamente versatili di applet e servlet) e quello di essere un linguaggio multipiattaforma (write once, run everywhere è il motto del Java), e queste caratteristiche hanno decretato il suo successo negli ultimi anni. Lo stesso programma che scrivo in Java lo posso eseguire teoricamente senza problemi su Windows, su Linux, un Mac e persino su un telefonino (i famosi "giochi Java"), a patto che esista una JVM (Java Virtual Machine) per quel sistema. Passando all'ultimo decennio, abbiamo la nascita dei linguaggi di quarta generazione, linguaggi di script (non di programmazione) estremamente intuitivi e facili da usare: il Perl, il Python (entrambi sviluppati grazie al C). Microsoft ha messo a punto un suo ambiente di sviluppo basato sul C++ (Visual C++) ed il C# (C Sharp), un linguaggio ad oggetti che deve molto sia alla sintassi del C/C++, sia a Java. Le origini del Linguaggio C A volte gli uomini sono così stupidi da pensare di avere inventato qualcosa di nuovo quando hanno solamente trovato un nuovo nome per qualcosa di vecchio. Il C non è un linguaggio creato dal nulla, ripercorriamo le tappe fondamentali. Nel 1963, in Inghilterra, durante un progetto che coinvolgeva ricercatori di Cambridge e dell'università di Londra, fu sviluppato un linguaggio chiamato CPL, cioè ``Combined Programming Language''. CPL era basato su Algol 60, uno dei primi linguaggi di programmazione moderni ben definiti. Quattro anni più tardi, nel 1967, un programmatore di Cambridge, Martin Richards, creò BCPL, ``Basic CPL'' e BCPL diede origine a un altro linguaggio, che divenne noto con la singola lettera B. Il linguaggio B fu ripreso ai Laboratori Bell, dove Ken Thompson e Dennis M. Ritchie lo modificarono e lo ridenominarono NB. All'inizio degli anni '70, Thompson utilizzò NB per riscrivere la parte basilare di Unix per la seconda edizione. Poco tempo dopo, a partire dall'nb, Ritchie sviluppò il C, che divenne presto il linguaggio per scrivere nuove utility e applicazioni oltre al Sistema Operativo. Questo nuovo linguaggio, oltre ad essere ad alto livello e strutturato, offriva costrutti che permettevano di manipolare i bit e i byte e di interagire direttamente con l'hardware. Concepire un linguaggio di programmazione completamente nuovo non avrebbe permesso di avvalersi direttamente dei pregi dell'esistente e non avrebbe garantito il superamento di tutti i difetti; inoltre avrebbe richiesto molto più tempo. Ci si potrebbe chiedere da dove venga il nome ''C''. È la lettera che viene dopo ''B'' in ordine alfabetico o è la seconda lettera di ``BCPL''? Vista la storia del nome dell'x Window System (''W'' ''X''), personalmente sono portato a pensare che la realtà corrisponda principalmente alla prima di queste ipotesi.

Linguaggi di programmazione compilati e interpretati Un linguaggio è un insieme di parole (lessico o vocabolario) e della loro sintassi (regole da seguire per costruire una frase che risulti comprensibile dal ricevente). Il linguaggio è un sistema di comunicazione esclusivo dell uomo che gli permette di interagire con i suoi simili. Nelle diverse regioni del mondo si sono sviluppati, negli anni, linguaggi in differenti lingue definiti: linguaggi naturali. Il linguaggio naturale dell uomo consente ricchezza espressiva ma anche, alcune volte, ambiguità. Ad esempio la frase: la giovane mente può essere interpretata in differenti modi. Il linguaggio naturale pertanto, non può essere utilizzato per "istruire" l'elaboratore su ciò che deve compiere, in quanto le caratteristiche che presenta non sono adatte alla sua logica. Il computer riesce ad interpretare un linguaggio costituito da istruzioni non ambigue e ad esso comprensibili. L'unico linguaggio direttamente comprensibile dall'elaboratore è il linguaggio macchina. Il linguaggio macchina ha una sintassi limitatissima. Esso è costituito da una serie di comandi in codice binario (sequenze di 0 e 1), programmati mediante la logica booleana, che impegnano direttamente i circuiti elettronici del computer. Inoltre è strettamente collegato alla struttura fisica del particolare elaboratore. Ciò vuol dire che un medesimo programma, scritto in linguaggio macchina, può non funzionare in microprocessori diversi. Per ovviare a questi inconvenienti sono stati sviluppati i linguaggi di programmazione (di alto livello) in cui le istruzioni non sono più indicate da sequenze di cifre binarie, ma da nomi simbolici, più facili da riconoscere, memorizzare e utilizzare da parte del programmatore. Inoltre essi non sono vincolati alla struttura dello specifico processore, ma risultano funzionanti su qualsiasi elaboratore. Tuttavia, poiché l'elaboratore riesce ad interpretare solo istruzioni formulate in linguaggio macchina, per ogni programma scritto in linguaggio di alto livello esiste il corrispondente programma traduttore in linguaggio macchina. Questa operazione di traduzione può essere eseguita da: Programmi compilatori, che traducono l'intero programma scritto in linguaggio di alto livello (in Pascal, in C++, ) nella corrispondente copia in linguaggio macchina: tutte le istruzioni vengono controllate nel lessico e nella sintassi, tradotte e trasformate in un file eseguibile (con estensione.exe nei sistemi Windows) che, memorizzato per esempio in un CD o su disco fisso, potrà essere utilizzato tutte le volte che si ritiene opportuno. Il file eseguibile, quindi, diventa indipendente dal programma scritto in linguaggio di alto livello che lo ha prodotto e una volta tradotto può essere eseguito senza il programma compilatore. Programmi interpreti, che "leggono" riga per riga le istruzioni scritte in linguaggio di alto livello, ne controllano il lessico e la sintassi e le traducono in linguaggio macchina per farle eseguire direttamente dall'unità centrale di elaborazione. In questo caso non viene prodotta una copia del programma in linguaggio macchina, ma ogni istruzione viene di volta in volta tradotta e poi fatta eseguire.

Dall algoritmo al programma Il linguaggio di programmazione serve per descrivere l algoritmo risolutivo di un problema in una forma (programma sorgente) comprensibile sia dall uomo sia dall'elaboratore. La persona che è in grado di effettuare tale operazione è chiamato programmatore. Il programma sorgente è poi tradotto dal compilatore (o interprete) in linguaggio macchina. Il programma tradotto in linguaggio macchina è detto programma oggetto. Dopo la compilazione viene effettuata l operazione di linking o di collegamento (svolta da un programma chiamato linker o collegatone). Tale operazione consiste nell'aggiungere al programma compilato i moduli del compilatore che realizzano le funzioni di basso livello richieste dalle istruzioni del programma. Alla fine di questo procedimento si ottiene il sospirato programma eseguibile (.exe). Il compilatore effettua la compilazione se il programma sorgente è formalmente corretto, cioè che rispetta le regole sintattiche del linguaggio. Ogni volta che ciò non si verifica il compilatore emette un messaggio di errore. Gli errori possono essere di tipo lessicale (uso di termini non appartenenti al linguaggio) oppure di tipo sintattico (costruzione di frasi non corrette dal punto di vista delle regole grammaticali del linguaggio). Il compilatore non è in grado di rilevare errori logici (cioè riguardanti la correttezza dell'algoritmo). II compilatore non è in grado di rilevare errori che possono verificarsi durante l'esecuzione del programma (runtime error), sulla base di particolari valori assunti dai dati durante l'elaborazione (Es. divisione per zero). Alcuni linguaggi di programmazione utilizzano, al posto del programma compilatore, il programma interprete, che traduce il programma sorgente in linguaggio macchina un'istruzione per volta e la esegue. Pertanto, eventuali errori formali (lessicali o sintattici) vengono rilevati e segnalati solo quando l'istruzione errata viene tradotta e causano l'interruzione dell'esecuzione del programma.

Nei linguaggi interpretati il codice sorgente viene tradotto in linguaggio macchina ogni volta che viene eseguito. La traduzione viene effettuata da un apposito software (l interprete) che deve essere presente sul computer dell utente. Un tipico interprete è la Java Virtual Machine (JVM) che interpreta i programmi scritti in Java. Nei linguaggi interpretati il programmatore scrive il programma e distribuisce direttamente il codice sorgente. C e C++ sono linguaggi compilati mentre i moderni PERL, PYTHON sono interpretati.