Tecnologia dell'Informazione e della Comunicazione (TIC)
Modulo 4: Programma e sistema operativo
Software: è l'insieme dei componenti (programmi, applicazioni, librerie, etc.) che permettono
l'utilizzo del calcolatore da parte dell'utente.
Programma: è una sequenza finita e ordinata di istruzioni (algoritmo) che, a partire da dei dati in
ingresso, restituisce dei risultati in uscita in seguito alla loro elaborazione eseguita dall'hardware del
calcolatore (processore).
Applicazione: è un servizio del quale l'utente può usufruire e può essere realizzato da un singolo
programma o da un insieme di programmi.
Libreria: è un insieme di funzioni o strutture dati predefinite utilizzate per essere collegate ad un
programma attraverso opportuno collegamento. Le librerie facilitano la programmazione del
software (scrittura e manutenzione) poiché evitano di dover riscrivere ogni volta programmi simili
(riuso del codice).
Processo: è un'istanza di un programma in esecuzione ovvero è un'attività controllata da un
programma che si svolge su un processore.
N.B. Il termine software è più generico di quello di programma. Un programma è un tipo di
software che può essere eseguito dal calcolatore (processo) mentre, in generale, un software
(libreria) non ha questa proprietà.
Tipi di software: il software può essere suddiviso in due categorie:
• software di sistema: detto anche software di base include i programmi di base per il
funzionamento e la gestione del calcolatore. Sistema operativo, programmi di utilità e driver.
• software applicativo e sistemi di sviluppo software.
Sistema operativo: è detto anche SO o in inglese OS (Operating System), è il software
fondamentale del calcolatore che fa da tramite tra l'utente e l'hardware: gestisce le risorse hardware
di elaborazione e memorizzazione, le periferiche e implementa l'interfaccia con l'utente. Il SO funge
da “base” sulla quale si appoggiano gli altri software più specifici, come applicazioni o librerie
software, i quali sono progettati in modo da essere riconosciuti e supportati da quel particolare
sistema operativo.
Gli applicativi sono uno strato software usato dall'utente per determinati scopi (scrivere un testo,
archiviare dei dati, visualizzare un filmato, etc.). Il software generalmente è installato su una
memoria di massa del computer locale (disco fisso), ma ciò non avviene sempre: infatti, esistono
computer, detti in inglese thin client di solito privi di memorie di massa, collegati a un server da cui
ricevono sia il SO sia le applicazioni.
Le principali funzioni del SO sono:
• gestire i vari processi tra i componenti del computer (processore, memoria di sistema e di
massa, etc.);
• mettere a disposizione dell'utente un'interfaccia, che può essere a caratteri o grafica, basata
su finestre ed icone, per gestire le varie funzionalità e i programmi applicativi del
calcolatore;
• far funzionare e rendere disponibili le varie periferiche di input ed output per mezzo dei
driver;
1
permettere ai vari programmi applicativi di usufruire delle risorse del computer e quindi di
poter svolgere i propri compiti.
Il SO è il primo programma che si attiva al momento dell'accensione del calcolatore subito dopo il
BIOS e normalmente è già installato nel calcolatore al momento dell'acquisto.
Esistono diversi sistemi operativi che si distinguono per caratteristiche e destinazione, ciascuno dei
quali ha una o più interfacce con caratteristiche esteriormente rilevanti, ma che permettono di
svolgere gli stessi compiti.
I sistemi operativi per calcolatore più diffusi sono:
• Windows: prodotto da Microsoft in varie versioni (1985 Windows 1.0) è attualmente il
sistema operativo più diffuso. In particolare la versione 8 introduce moltissimi cambiamenti
per adattarsi al crescente utilizzo di dispositivi tattili (smartphone e tablet);
• Unix: progettato da Bell Laboratories (1970) era realizzato da varie aziende in versioni
differenti. Attualmente non è più utilizzato, ma ha ispirato i sistemi operativi Mac OSX e
Linux;
• Mac OSX è prodotto da Apple nella versione X (1984 Classic Mac OS - 2001 Mac OSX 10)
ed è il primo ad avere utilizzato l'interfaccia grafica. Può essere installato solo su sistemi
Apple e questo ne limita la diffusione.
• Linux è stato inventato dallo studente finlandese Linus Torvalds (1991) e ha la caratteristica
di essere software libero, gratuito e open source differentemente dai sistemi operativi
precedenti. Linux è un SO modificabile dall'utente il quale lo può personalizzare in base alle
proprie esigenze. Non esiste un'unica versione di Linux, ma esistono diverse distribuzioni
che condividono il nucleo (kernel) di Linux, ma si differenziano tra loro per gli strumenti e
le applicazioni. Le più note distribuzioni sono: Ubuntu, Debian, Fedora, CentOS, Open
SUSE.
I dispositivi come smartphone e tablet hanno caratteristiche hardware differenti rispetto a un
calcolatore (minore potenza di calcolo, schermi sensibili al tocco, etc.) e dispongono di sistemi
operativi dedicati. I principali sistemi operativi per dispositivi portatili sono:
• Android (Google 2008) è basato su Linux, attualmente disponibile nella versione 5, è il più
diffuso SO poiché è utilizzato su un gran numero di dispositivi di varie marche;
• iOS (Apple 2007), attualmente alla versione 8, è usato solo sugli apparecchi prodotti da
Apple;
• BlackberryOs (Blackberry 1999 - Blackberry 10 2010), disponibile nella versione 10, è
usato solo sugli apparecchi prodotti da Blackberry;
• Windows phone (Microsoft 2010), disponibile nella versione 8, è poco diffuso rispetto alla
controparte per calcolatore;
• Ubuntu phone (Canonical 2014) è disponibile la prima versione per dispositivi portatili del
SO per calcolatori Ubuntu basato su Linux.
• Firefox OS (Mozilla 2013) è un sistema operativo, attualmente disponibile nella versione
1.4, basato su Linux e sviluppato usando tecnologie completamente open source.
• Sailfish OS (Jolla 2013) è un sistema operativo, attualmente disponibile nella versione 1.1,
basato su Linux e sviluppato da ex dipendenti Nokia utilizzando un progetto gestito in
precedenza da Nokia-Intel MeeGo.
• Tizen OS (Linux Foundation 2012) è un sistema operativo, attualmente disponibile nella
versione 2.3, basato su Linux e supportato dalla Linux Foundation, da Samsung e da Intel.
•
N.B. Il funzionamento dei sistemi operativi non è identico di conseguenza i programmi applicativi
funzionano solo per il sistema operativo per il quale sono stati progettati. Per tale motivo alcuni di
essi vengono prodotti in versioni differenti, adatte ai vari sistemi operativi (programmi
multipiattaforma).
2
N.B. Le prossime versioni dei principali sistemi operativi avranno come obiettivo quella di far
convergere la versione per computer e la versione per dispositivi mobili (smartphone e tablet).
Interfaccia utente: è il metodo di interazione tra l'utente e il calcolatore. I primi sistemi operativi
avevano un'interfaccia a riga di comando: l'utente doveva impartire i comandi digitando sulla
tastiera insiemi di parole e caratteri, separati da spazi o segni di punteggiatura, che comparivano poi
su una riga dello schermo. L'interazione tra l'utente e il calcolatore richiedeva un personale esperto.
Proprio per questo motivo nelle successive versioni dei sistemi operativi si è cercato di rendere
l’interfaccia utente sempre più semplice e immediata da utilizzare. Sono nati i primi sistemi
operativi con interfaccia grafica, Grafical User Interface (GUI), formata da finestre, icone e menu a
discesa attraverso i quali si possono impartire i comandi al calcolatore utilizzando il mouse.
Account utente: ciascun utilizzatore del computer è identificato da un proprio nome utente e da
una password. All'accensione del sistema operativo, ogni utente deve fornire i propri dati
identificativi per accedere al proprio ambiente di lavoro: in questo modo, ogni utente può
personalizzare le impostazioni dell'ambiente e salvare i propri documenti in modo che non siano
visibili e modificabili dagli altri utenti.
Programmi utilità o strumenti: detti utility in inglese, sono programmi che svolgono compiti
integrativi rispetto al sistema operativo. Alcuni programmi di utilità sono forniti insieme al sistema
operativo (utilità di manutenzione dell'hard disk in Windows, strumenti di gestione degli
aggiornamenti) mentre altri devono essere acquistati o scaricati (antivirus, antimalware e strumenti
di diagnostica (hardware o software)).
Driver: sono programmi che permettono al sistema operativo di gestire le periferiche e consentono
di utilizzare periferiche di tipo diverso anche senza conoscerne le caratteristiche specifiche. I driver
devono essere installati per ogni nuova periferica e sono forniti dalla casa costruttrice dell'hardware.
Nei moderni sistemi operativi, la funzionalità Plug and Play permette di collegare la periferica e di
installare automaticamente i driver poiché sono già presenti nel software di sistema. Un driver è
3
specifico sia per la particolare periferica sia per il sistema operativo: infatti, non è possibile
utilizzare driver scritti per un sistema operativo su uno diverso.
Programmi applicativi: detti anche applicazioni, sono i programmi usati per svolgere compiti
particolari. Alcuni esempi sono: per scrivere si utilizza l'elaboratore di testo (word processor); per
organizzare delle tabelle con la possibilità di fare operazioni matematiche si usa il foglio elettronico
(Spreadsheet); per archiviare e successivamente estrarre grandi quantità di dati si usa il database. Ci
sono poi programmi particolari per la gestione aziendale, i videogiochi, i lettori audio e video, i
programmi di consultazione come enciclopedie, dizionari, browser (programma navigazione), posta
elettronica, programmi professionali (il programma utente per gestire una macchina o un impianto),
in applicazioni industriali, un PLC.
Esistono centinaia di programmi per calcolatore per svolgere i compiti più diversi. I programmi più
comuni sono i seguenti:
• Produttività da ufficio:
• Elaborazione testi: è un applicativo per scrivere in modo simile a un macchina per
scrivere, ma con molte funzionalità aggiuntive come la rielaborazione del testo prima
della stampa, il salvataggio del testo per il riutilizzo, l'inserimento di tabelle ed
elementi grafici, la modifica dell'aspetto dei caratteri e dei paragrafi. Esempi di
applicativi di elaborazione testi sono LibreOffice Writer e Microsoft Word.
• Foglio di calcolo: è un applicativo che gestisce dati generalmente di tipo numerico
inseriti in tabelle. I dati sono usati per effettuare calcoli anche complessi, estrarre dati
statistici e generare grafici. Esempi di applicativi fogli di calcolo sono LibreOffice
Calc, Microsoft Excel e Gnumeric;
• Database: è un applicativo specifico per la gestione delle basi di dati che permette la
consultazione delle informazioni contenute al loro interno. E' usato sia a livello
personale sia aziendale, ma anche per far funzionare siti web interattivi. Esempi di
applicativi database a livello personale sono LibreOffice Base, Microsoft Access; a
livello aziendale si utilizzano software molto più complessi e potenti come MySql,
Oracle, IBM Informix, SAP Sybase e molti altri;
• Presentazioni multimediali: è un applicativo che permette di realizzare schermate da
proiettare (slide o diapositive) contenenti sia testo sia elementi multimediali come
immagini, filmati e suoni. E' impiegato per presentare in modo più efficace e
interessante una relazione sia di tipo didattico (una lezione, una ricerca) sia di tipo
aziendale (un progetto, un bilancio). Esempi di applicativi di presentazione sono
LibreOffice Impress e Microsoft Powerpoint;
• Comunicazione: sono applicazioni che permettono di comunicare a distanza con altre
persone sfruttando la rete Internet:
• Posta elettronica: è un applicativo, in versione client, che permette di ricevere ed
inviare messaggi di posta elettronica (email). Esistono molti programmi che
funzionano da email client: Mozilla Thunderbird, Microsoft Outlook, Evolution e
molti altri ancora. Il servizio di posta elettronica può essere utilizzato in versione
webmail, ovvero utilizzando un browser e le applicazioni web messe a disposizione
da tutti i principali fornitori di servizi email (Googlemail, Hotmail, Yahoo, etc.).
Infine esistono anche apps per la posta disponibili per dispositivi mobili come
smartphone e tablet;
• Browser web: permettono di sfogliare, in inglese to browse significa sfogliare, le
pagine del web: non solo di navigare tra le pagine di vari siti, ma anche di scrivere e
inviare immagini o video su blog e sulle reti sociali. Esistono molti programmi, tra
cui Mozilla Firefox, Microsoft Internet Explorer, Opera, Google Chrome e Apple
Safari;
4
Telefonia su protocollo IP: è un servizio realizzato da applicazioni che permettono di
telefonare e di videotelefonare ad altre persone utilizzando la tecnologia Voice over
IP (VoIP). I programmi più diffusi sono: Microsoft Skype, Viber, Linphone e
Mozilla Firefox Hello e Google Hangout;
• Messaggistica istantanea: è un servizio realizzato da applicazioni che permettono di
comunicare attraverso testo, di inviare file, tra persone. Esistono molti programmi:
alcuni resi disponibili dal fornitore del servizio come Microsoft Messenger, Yahoo
Messenger, ICQ, Microsoft Skype, Mozilla Firefox Hello e Google Hangout mentre
altri sono client che possono utilizzare diversi protocolli Pidgin, Trillian;
Multimedia: sono applicazioni per la visualizzazione, modifica dei file multimediali
(immagini, suoni e video):
• Elaborazione immagini: è un applicativo per effettuare varie operazioni sulle
immagini tra le quali ritocco fotografico. Appartengono a questa categoria sia
programmi di livello professionale come Adobe Photoshop, Corel Paint Shop Pro e
GIMP, sia programmi con minori funzionalità ma più semplici da usare, come
Paint.Net, Google Picasa;
• Suoni: esistono applicativi molto semplici da usare per ascoltare musica come VLC,
Rythmbox, Windows Media Player, Apple iTunes e altri programmi più professionali
per produrre musica come Audacity, Cubase;
• Video: generalmente un applicativo in grado di gestire i suoni è in grado anche di
gestire i filmati. La produzione di video richiede altri applicativi come Cinelerra,
Adobe Premiere, Avid Media Composer e Pinnacle Studio;
Progettazione: ormai quasi tutti i progetti (elettronici, meccanici, edilizi, etc.) vengono
disegnati utilizzando specifiche applicazioni per computer, i Computer Aided Design
(CAD). Sono programmi che permettono di realizzare dal semplice schizzo in 2D alla
simulazione fotorealistica dell'oggetto del progetto. Ne esistono molti: dai semplici e gratuiti
cpme Sketchup di Google e freeCAD ai complessi gratuiti come Draftsight e a pagamento
Autocad.
•
•
•
App: è un'applicazione dedicata ai dispositivi di tipo mobile (smartphone e tablet), progettata per
fornire un servizio o uno strumento utile all'utente e con caratteristiche di semplicità, leggerezza e
velocità. Le apps permettono di estendere e personalizzare le funzionalità di un dispositivo mobile a
seconda dei propri gusti ed esigenze. Permettono di svolgere molte operazioni, come quelle legate
alla comunicazione (posta elettronica, navigazione, reti sociali, etc.), quelle più diffuse legate alla
multimedialità, alle applicazioni da ufficio, ai giochi e alla guida assistita da Global Positioning
System (GPS), etc..
Suite: è un software composto da diversi programmi/moduli, solitamente configurabili (installabili,
attivabili) separatamente, ma facenti parte di un'unica soluzione (Microsoft Office, LibreOffice,
alcuni antivirus, etc.).
Classificazione di software: i software si classificano anche sulla base delle loro caratteristiche:
• modalità di esecuzione:
• batch: i lavori sono impostati in modo che possano essere eseguiti fino al
completamento senza l'intervento umano;
• online (interattivi) richiedono l'intervento umano per l'immissione dati ed il controllo
del lavoro;
• funzione: (videoscrittura, foglio elettronico, database management system, grafica, sistema
5
•
•
•
•
•
operativo, browser, lettore multimediale, posta elettronica etc.);
grado di apertura della licenza: software libero o software proprietario;
sistema operativo su cui possono essere utilizzati: Windows, Mac OS,Android, Linux, Unix,
etc.;
da installare o portabile;
tipo di interfaccia utente: testuale, grafica o modalità sensibile al tocco (touchscreen);
tipo di esecuzione:
• stand alone: possono girare completamente autonomi su sistemi isolati;
• network: funzionano in un ambito di rete. Questa categoria si divide in:
• client-server: sul client può essere installato l'intero software o una sua parte
(agent) e si appoggiano ad un database installato su di un server;
• terminal-server oppure cloud (applicazioni web): il software risiede in remoto
sul server o nella cloud (web) mentre i dati possono essere in locale o in
remoto.
• Esempi di programma di rete sono il sistema gestionale di un'azienda e la posta
elettronica centralizzata.
Sistema di sviluppo software: sono programmi simili a un elaboratore di testi, progettati per la
scrittura di un software sono detti anche Integrated Development Environment (IDE). Questo viene
realizzato utilizzando uno o più linguaggi di programmazione attraverso la scrittura di codice
sorgente. Se il progetto è complesso, il programma viene diviso in sottoparti (moduli) che possono
essere modificati più semplicemente e riutilizzati in altri progetti. Alcuni esempi dei più diffusi IDE
sono Eclipse, Netbeans, Microsoft Visual Studio e Apple Xcode.
Versione: i software vengono rilasciati sotto forma di versioni e release (rilascio) successive,
ciascuna identificata da un numero intero progressivo con in aggiunta uno o più numeri decimali
che identificano la release. Ciascuna versione o release successiva rappresenta un'evoluzione delle
precedenti con miglioramenti in termini di nuove caratteristiche e funzionalità aggiunte e/o bug
(errori) corretti.
Estensioni dei file: i file vengono riconosciuti dal sistema operativo che associa a ciascuno di essi
la corrispondente icona dell'applicazione con cui vengono aperti. L'utente può riconoscere i file
anche in base all'estensione del file ovvero alle lettere dopo il punto nel nome del file. Le estensioni
più frequenti sono:
• odt (Writer) e doc/docx (Word): elaboratori di testo;
• ods (Calc) e xls/xlsx (Excel): fogli di calcolo;
• odp (Impress) e ppt/pptx (Powerpoint): presentazioni multimediali;
• odb (Base) e mdb/accdb (Access): gestione database;
• pdf (Evince, Acrobat Reader): Portable Document Format ovvero formato del documento
portabile;
• jpg, gif, bmp, tif e altri: immagini (Gimp, Photoshop);
• wav, mp3, mid, ogg: file audio (VLC, Mediaplayer);
6
•
•
•
•
•
•
•
zip, rar, gz: file compressi (7zip, Winzip);
tmp: file temporanei;
msi, exe, com: file eseguibili in Windows;
bat: script eseguibili in Windows;
bin: file eseguibili Linux;
sh: script eseguibili in Linux;
deb, rpm: pacchetti di programmi in Linux.
Licenza o contratto d'uso: è la licenza d'uso dell'utente finale, in inglese End-User License
Agreement (EULA), ovvero è il contratto tra il produttore del software e l'utente e comprende la
concessione di licenza, le limitazioni d'uso, di garanzia e di responsabilità. Gli autori di software
sono garantiti dalla stessa legge che tutela gli autori di opere letterarie e artistiche, il copyright
(diritto di copia): infatti, i software sono stati assimilati alle opere di carattere creativo (D.L. 518
1992). Sono esclusi le idee e i principi alla base di qualsiasi elemento di un programma, compresi
quelli alla base delle sue interfacce verso i database (le banche dati). Di conseguenza, solo coloro ai
quali è concesso il diritto di copyright possono permettere la diffusione di copie del software. È
importante essere a conoscenza che qualsiasi software può essere utilizzato solo in base alla sua
licenza d'uso e che qualsiasi forma di riproduzione, acquisto, vendita o utilizzazione di copie non
autorizzate di programmi, per la legge costituisce un reato.
N.B. La principale differenza tra un prodotto software e un prodotto tradizionale è che quando sia
acquista un prodotto software viene concessa la licenza di utilizzarlo, ma non se ne entra in
possesso come per altri tipi di prodotto. L'acquirente può installare e utilizzare una copia del
software su un singolo calcolatore ed è autorizzato unicamente a farne per proprio uso una copia di
riserva, da utilizzare in caso di danneggiamento dell'originale. L'acquirente non può fare copie da
distribuire o regalare perché in questo caso violerebbe la legge che tutela il diritto d'autore relativo
al software e il contratto di licenza.
N.B. L'acquisto del programma precede l'eventuale lettura del contratto che viene presentato
all'utente in forma elettronica durante le fasi di installazione del programma. Per tale motivo,
l'accettazione del contratto da parte dell'utente è oggetto di discussioni e polemiche sulle modalità
di accettazione e di un eventuale rimborso soprattutto per il software preinstallato sui calcolatori.
Le tipologie di licenza d'uso dei software sono varie e diverse, comunque la grande distinzione è tra
software proprietario e software libero:
• Software proprietario: è un software la cui licenza impone restrizioni sul suo utilizzo, sulla
sua modifica, riproduzione o ridistribuzione. Le restrizioni sono imposte dal proprietario
mentre l'utente acquista solo il diritto d'uso, generalmente pagando una certa somma di
denaro. Il software è pubblicato soltanto in codice binario tenendone segreto il codice
sorgente per tale motivo questa categoria di software è detta anche closed source (sorgente
chiuso). Alcune categorie di software proprietario sono le seguenti:
• Versione di prova (in inglese demo): è un software limitato nel tempo o nelle
funzionalità che deve essere regolarmente acquistato per poter essere utilizzato in
modo completo;
• Shareware o trial: è simile alla precedente, è un software facilmente scaricabile dalla
rete o contenuto in CD e DVD allegati a riviste informatiche che permette di
ridistribuire copie, ma impone a chiunque continui a usarne una copia di pagarne la
licenza d'uso dopo il periodo di prova (generalmente 30 o 60 giorni). Scaduto il
periodo di prova è necessario acquistare e registrare il software presso la casa
7
•
•
8
produttrice. La versione completa è attivata attraverso l'inserimento di un codice
seriale nell'applicativo per sbloccarne le funzioni senza dover effettuare una nuova
installazione. La versione di prova può avere, in aggiunta o in alternativa alla durata
limitata, rispetto alla versione completa, limitazioni come l'impossibilità di stampare
o salvare i file, numero di utilizzi limitato, contenere al suo interno meccanismi di
protezione tali da impedire di utilizzare il software dopo la scadenza, mancanza di
supporto del produttore. Le limitazioni possono esser aggirate da alcuni programmi
specializzati come crack o keygen;
Freeware: è un software che può essere liberamente utilizzato e generalmente anche
copiato e redistribuito in modo gratuito e con nessuna o pochissime limitazioni.
Nonostante ciò è un software proprietario in quanto non è disponibile il codice
sorgente.
Software libero: è un software di cui è disponibile non solo l'eseguibile, ma anche il codice
sorgente e per tale motivo è detto open source (sorgente aperto). La licenza di un software
libero permette di usarlo, modificarlo, copiarlo e redistribuirlo a condizione che venga
mantenuta la licenza iniziale. Tale libertà permette di usare, modificare e redistribuire il
codice sia gratis sia pagamento purché sia soddisfatta la condizione essenziale di apertura
del codice sorgente. Alla base della filosofia del software libero è presente l'idea che con la
collaborazione, in generale libera e spontanea, il prodotto finale possa raggiungere una
complessità maggiore di quanto potrebbe ottenere un singolo gruppo di programmazione. Il
software libero ha tratto grande beneficio da Internet dato che la sua filosofia prevede una
comunità di sviluppatori che collaborano attraverso la rete. I software di questo tipo possono
essere scaricati liberamente e gratuitamente da Internet.
Il software libero è soggetto a licenza d'uso di tipo copyleft per differenziarlo dal software
proprietario che utilizza una licenza di tipo copyright. La maggioranza del software libero è
distribuito con licenza GNU GPL (General Public License) che è stata scritta da Richard
Stallman ed Eben Moglen per garantire a tutti gli utenti le quattro libertà fondamentali:
1. libertà di eseguire il programma per qualsiasi scopo;
2. libertà di studiare il programma e modificarlo;
3. libertà di copiare il programma in modo da aiutare il prossimo;
4. libertà di migliorare il programma e di distribuire pubblicamente i miglioramenti, in
modo tale che tutta la comunità ne tragga beneficio.
N.B. Spesso il termine open source è usato con lo stesso significato di software libero anche se nella
realtà è meno restrittivo e significativo. Un software libero è necessariamente open source mentre il
viceversa non è valido.
N.B. La licenza di tipo copyleft contiene una dichiarazione di esclusione della responsabilità circa
la garanzia, inoltre prevede che l'utente possa redistribuire il codice sorgente a patto di includere le
proprie modifiche utilizzando la stessa licenza. Tale vincolo evita che parti di codice libero possano
essere usate in programmi proprietari. Infine, diversamente da una licenza di tipo EULA, una
licenza di software libero non agisce come estensione contrattuale della legislazione esistente.
N.B. Non è necessario che un'opera sia registrata o che esponga il simbolo di copyright per godere
dei diritti d'autore. Di conseguenza, l'unico modo di essere certi che un'opera sia libera è l'espressa
dichiarazione nella licenza.
Creative Commons: sono nuove licenze per la diffusione e lo scambio di documenti e programmi
note come Creative Commons (CC). Le licenze CC si basano su quattro clausole facilmente
riconoscibili grazie a quattro simboli distintivi e si possono applicare a qualsiasi tipo di opera
d'ingegno. Dalla combinazione di queste quattro clausole si individua una condizione particolare a
cui l'utilizzatore dell'opera deve sottostare.
Attribuzione
9
Attribution (BY)
Permette la copia, distribuzione, mostra
ed esecuzione di copie dell'opera e dei
lavori derivati da questa solo se vengono
mantenute le indicazioni di chi è l'autore
dell'opera.
No opere derivate
No Derivative Works (NC)
Permette la copia, distribuzione, mostra
ed esecuzione di copie identiche
dell'opera; non sono ammessi lavori
derivati dall'opera o basati su di essa.
Condivi allo stesso modo
Share Alike (SA)
Permette la distribuzione di lavori
derivati dall'opera solo con una licenza
identica a quella dell'opera originale.
Non commerciale
Non Commercial (NC)
Permette la copia, distribuzione, mostra
ed esecuzione di copie dell'opera e dei
lavori derivati da questa solo per scopi
di natura non commerciale.
Principali concetti dei linguaggi di programmazione
Linguaggio di programmazione: è un linguaggio formale (formato da stringhe finite di simboli
presi da un alfabeto di simboli) dotato di un lessico, di una sintassi e di una semantica ben definiti
alla pari di un linguaggio naturale come una lingua. Un linguaggio di programmazione è usato per il
10
controllo del comportamento di una macchina (calcolatore) attraverso la scrittura del codice
sorgente di un programma durante la programmazione eseguita da un programmatore.
Esistono molti linguaggi di programmazione più o meno diffusi. La prima classificazione
differenzia i linguaggi in alto livello e basso livello a seconda del livello di astrazione a partire dal
linguaggio macchina (sequenze di operazioni) fino al linguaggio logico umano. I linguaggi di
programmazione possono essere classificati in linguaggi compilati e interpretati.
Sviluppo software: utilizzando uno o più linguaggi di programmazione viene scritto il codice
sorgente per realizzare il programma. Se il progetto è complesso, il programma viene diviso in
sottoparti (moduli) che possono essere modificati più semplicemente e riutilizzati in altri progetti.
Le fasi che caratterizzano la scrittura di un software sono:
1. scrittura dell'algoritmo in pseudo codice e diagramma di flusso;
2. traduzione dell'algoritmo in codice sorgente tramite uno o più linguaggi di programmazione;
3. programma:
•
Linguaggio compilato: sono programmi le cui istruzioni contenute nel codice sorgente,
scritto in linguaggio di programmazione di alto livello, vengono tradotte in codice
eseguibile, linguaggio macchina, adatto all'architettura hardware di destinazione. Ogni file
del codice sorgente viene compilato dal compilatore in un file oggetto contenente il
programma in linguaggio macchina. In seguito tutti i file oggetto sono collegati (linking) dal
linker (collegatore) per ottenere il file eseguibile. La compilazione offre numerosi vantaggi
tra i quali la possibilità di ottenere eseguibili velocissimi nella fase di esecuzione adattando
vari parametri di questa fase all'hardware a disposizione; lo svantaggio principale è la
portabilità ovvero è necessario compilare un eseguibile diverso per ogni piattaforma
(sistema operativo e hardware) sul quale si desidera rendere disponibile l'esecuzione.
Esempio programmi scritti in C/C++ devono essere ricompilati per ogni diversa architettura
e sistema operativo, ma sono molto veloci.
•
11
Il collegamento: un programma è composto da più moduli software e librerie che
devono essere “collegati” (linking) tra loro. Il linker è lo strumento che si occupa di
risolvere le interconnessioni tra i diversi moduli. Esistono due tipi di collegamento:
•
Statico: tutti i moduli del programma e le librerie vengono inclusi
nell'eseguibile che contiene tutto il necessario per l'esecuzione, ma risulta
molto grande. Nel caso di una modifica a una delle librerie, per correggere un
errore o un problema di sicurezza, tutti i programmi che le usano con
collegamento statico devono essere ricollegati con le nuove versioni delle
librerie.
•
Dinamico: le librerie utilizzate sono caricate dal sistema operativo quando
necessario (le librerie esterne sono chiamate Dynamic-link libraries (DLL) nei
sistemi Microsoft Windows e Shared Object (SO) nei sistemi Linux e Mac OS
X). L'eseguibile ottenuto è più compatto, ma richiede la presenza delle
librerie utilizzate nel sistema operativo per poter essere eseguito. I sistemi di
gestione dei pacchetti, packages management, che installano i programmi su
un sistema operativo, tengono traccia automaticamente delle librerie
necessarie (dipendenze). In questo modo, le librerie possono essere
aggiornate una sola volta a livello di sistema operativo, senza necessità di
ricollegare i programmi.
•
Linguaggio interpretato: sono programmi le cui istruzioni contenute nel codice
sorgente scritto in linguaggio di programmazione di alto livello vengono eseguite
utilizzando un software detto interprete. Questi programmi sono portabili tra le
diverse architetture poiché non hanno bisogno di essere compilati, ma sono più lenti
dei programmi compilati e occupano più memoria. La perdita di prestazioni è dovuta
al doppio lavoro compiuto dalla macchina che esegue il programma poiché, al
contrario di un programma compilato, ogni istruzione viene controllata e interpretata
ad ogni esecuzione. I linguaggi di scripting e tutti quelli orientati al Web sono quasi
sempre interpretati. Esempi tipici sono PHP, Perl, e JavaScript.
•
Linguaggio semi-interpretato: sono programmi le cui istruzioni contenute nel
codice sorgente scritto in linguaggio di programmazione di alto livello vengono
compilate, anziché in linguaggio macchina, in un codice intermedio “ibrido” che
viene interpretato o compilato “al volo” al momento dell'esecuzione. Questi
programmi utilizzano un compilatore multipiattaforma per creare un eseguibile di
livello intermedio che potrà essere eseguito su qualunque piattaforma. Questo doppio
passaggio permette di avere la portabilità dei linguaggi interpretati e allo stesso
tempo anche una fase di interpretazione più veloce grazie alla pre-compilazione.
Esempi di programmi scritti nei linguaggi Java e Python dove il codice sorgente è
trasformato in bytecode e nei linguaggi Visual Basic e .NET dove il codice sorgente è
trasformato in P-code. Per entrambi i casi sono stati sviluppati i compilatori Just In
Time (JIT) (Macchine Virtuali) che compilano al volo il codice intermedio in
linguaggio macchina al momento del lancio del programma: in questo modo
eliminano la necessità dell'interprete e ottengono esecuzioni veloci quasi quanto i
corrispondenti programmi compilati.
N.B. Durante la realizzazione di un progetto software complesso spesso alcune parti del programma
vengono realizzate come librerie dato che sono più facili da mantenere e possono essere usate in
diversi programmi dello stesso progetto.
N.B. Il collegamento dinamico è preferibile a quello statico dato che vengono creati programmi
piccoli e si riduce la memoria RAM occupata; infatti, generalmente, le librerie necessarie sono già
presenti nel sistema o vengono distribuite insieme al programma.
Istruzione: è il comando impartito ad un processore utilizzando un linguaggio che è in grado di
comprendere. Il processore elabora i dati tramite letture/scritture sui dispositivi hardware come la
memoria e i registri: ogni operazione come l'assegnazione o la lettura del valore di una variabile o la
sua modifica è una istruzione.
Blocco istruzioni o macroistruzione: è un insieme di istruzioni adiacenti autoconsistente la cui
12
esecuzione complessiva equivale all'esecuzione di una singola macroistruzione complessa. Un
blocco di istruzioni può essere considerato l'equivalente di una istruzione: ogni istruzione può
essere scomposta in istruzioni più semplici, fino ad arrivare a livello di linguaggio macchina in cui
l'istruzione non può essere ulteriormente scomposta.
Variabile: è un insieme di dati modificabili nel corso dell'esecuzione di un programma situati in
una porzione di memoria (una o più locazioni di memoria). Una variabile è caratterizzata da un
nome ovvero una sequenza di caratteri e cifre.
Costante: è un insieme di dati non modificabili nel corso dell'esecuzione di un programma situati in
una porzione di memoria (una o più locazioni di memoria). Una costante, al pari di una variabile, è
caratterizzata da un nome ovvero una sequenza di caratteri e cifre.
N.B. Nei linguaggi tipizzati ciascuna variabile è caratterizzata da un tipo di dato che specifica come
devono essere considerati i dati rappresentati e restringe i valori accettabili. Esempio una variabile
destinata a contenere un numero non potrà contenere caratteri.
Struttura di controllo: sono costrutti (elementi) sintattici di un linguaggio di programmazione la
cui semantica definisce il controllo del flusso di esecuzione di un programma: tali elementi
specificano se, quando, in quale ordine e quante volte devono essere eseguite le istruzioni che
compongono il codice sorgente in base alle specifiche di progetto del software da realizzare.
Le strutture di controllo fondamentali di un linguaggio imperativo sono:
• Sequenza: stabilisce l'ordine in cui le istruzioni presenti nel codice sorgente del programma
devono essere eseguite a tempo di esecuzione. In generale, non ha una espressione sintattica
esplicita poiché è data dalla successione delle istruzioni le quali vengono eseguite in
sequenza una dopo l'altra.
• Goto: (vai a) permette di “saltare” ovvero di far “passare” il controllo a una istruzione
specificata che può trovarsi in un punto qualsiasi del programma. Il goto presenta sempre
una forma condizionata, il cui significato è il seguente: “se è vera una condizione A, vai
all'istruzione I”.
• Nei linguaggi di basso livello: la condizione A può assumere una delle due seguenti
forme: “il contenuto della cella di memoria X è 0” o “il contenuto della cella di
memoria X è diverso da 0” mentre l'istruzione I è identificata dall'indirizzo di
memoria in cui I è memorizzata.
• Nei linguaggi di alto livello: la condizione A può essere espressa come una qualsiasi
espressione booleana come “il risultato della moltiplicazione di B per C è diverso da
D”, e l'istruzione I può essere identificata da un nome o da un codice numerico
associato dal programmatore indipendentemente dalla sua collocazione in memoria.
N.B. Dagli anni settanta, la struttura di controllo goto ha ricevuto forti critiche poiché consente lo
sviluppo di programmi molto poco leggibili e modificabili (detti spaghetti code). Il teorema di
Böhm-Jacopini dimostra che qualsiasi programma scritto usando la struttura di controllo goto può
essere riscritto usando solo strutture di controllo di tipo sequenza, iterazione e alternativa alla base
della programmazione strutturata. Sebbene il goto resti una struttura di controllo fondamentale dei
linguaggi macchina moderni, nei linguaggi di programmazione di alto livello non viene fornito
oppure viene fornito, ma se ne sconsiglia l'uso in favore delle strutture di controllo della
programmazione struttura.
Le strutture di controllo fondamentali di un linguaggio strutturato sono:
13
•
•
14
Alternativa: permette di specificare che una data istruzione o un dato blocco di istruzioni
devono essere eseguiti “(solo) se” vale una certa condizione e per tale motivo sono dette
strutture condizionali.
• Alternativa if-then e if-then-else: l'alternativa if-then (se-allora) è la più semplice
forma di alternativa e il suo significato equivale a “se vale la condizione A, esegui
l'istruzione (blocco) I”. La forma più articolata if-then-else (se-allora-altrimenti)
equivale a: “se vale la condizione A esegui l'istruzione (blocco) I1; altrimenti esegui
l'istruzione (blocco) I2”.
• Alternativa case: può essere vista come una catena di if-then-else con certe
restrizioni. In questo caso, la scelta di uno fra N istruzioni o blocchi alternativi
avviene sulla base del valore di una determinata variabile o espressione,
normalmente di tipo intero. Questa alternativa equivale a: “valuta il valore N; nel
caso in cui il suo valore sia V1, esegui I1; nel caso in cui sia V2, esegui I2 (etc.)”. Il
seguente codice pseudo C riporta il concetto:
case sceltaMenu of
1: apriFile();
2: chiudiFile();
3: salvaFile();
4: esci();
end;
Iterazione: permette di specificare che una data istruzione o un dato blocco di istruzioni
devono essere eseguiti ripetutamente e per tale motivi sono dette anche cicli. Ogni struttura
di controllo di questo tipo consente di specificare sotto quali condizioni l'iterazione
(ripetizione) di tali istruzioni deve terminare ovvero la condizione di terminazione del ciclo
oppure la condizione di permanenza nel ciclo. Le strutture di controllo più note sono:
• Ciclo for: è usato quando la condizione di permanenza in un ciclo consiste nello
specificare il numero di volte che devono essere ripetuti l'istruzione o il blocco
controllati dal ciclo. Il ciclo for può equivale a “ripeti (il codice controllato) per i che
va da un certo valore iniziale a un certo valore finale, con un certo passo”, dove i è
una variabile di tipo intero, detta contatore. Il seguente codice BASIC illustra il
concetto:
FOR I=1 TO 9 STEP 2
PRINT I
Il codice ripete l'istruzione di stampa a video della variabile contatore I in modo da
stampare la sequenza 1, 3, 5, 7, 9. L'indicazione del “passo” (STEP) specifica come
varia il valore di I da una iterazione alla successiva.
• Ciclo while: (mentre, o fino a quando) è usato quando la condizione di permanenza
in un ciclo è una generica condizione booleana che non dipende dal numero di
iterazioni eseguite. Il ciclo while equivale a “ripeti (il codice controllato) fino a
quando resta vera la condizione A”. Un esempio tipico di utilizzo di while è la lettura
di dati da un file di cui non si conosca a priori la dimensione; infatti, il ciclo potrebbe
equivalere a “leggi il prossimo dato fino a quando non incontri la fine del file”. Il
seguente codice pseudo-C mostra il concetto:
passwordUtente = leggiPassword();
while(passwordUtente <> passwordCorretta) {
segnalaErrorePassword();
passwordUtente = leggiPassword();
}
Nel while del C e di molti altri linguaggi, la condizione di permanenza nel ciclo
•
•
viene controllata prima di eseguire la prima iterazione; di conseguenza se essa risulta
immediatamente falsa, le istruzioni nel ciclo non vengono eseguite. Nell'esempio se
la password letta è corretta, il blocco di codice che segnala l'errore di immissione e
chiede di inserire nuovamente la password non viene eseguito.
Ciclo loop-until: (ripeti-fino a quando) è diverso dal while per due motivi. Il primo è
che garantisce l'esecuzione di almeno una iterazione del ciclo poiché la condizione di
controllo è verificata al termine della prima iterazione. Il secondo è che viene
espressa la condizione di terminazione anziché quella di permanenza nel ciclo. Il
seguente codice pseudo Pascal mostra il concetto:
loop
passwordUtente:= leggiPassword();
until (passwordUtente = passwordCorretta)
Ciclo do-while: (fai-fino a quando) è una variante delle precedenti poiché garantisce
un'iterazione e specifica la condizione di permanenza nel ciclo. Il seguente pseudocodice mostra un esempio:
do
passwordUtente = leggiPassword();
while(passwordUtente<>passwordCorretta);
•
Terminazione anticipata di cicli e iterazioni (break e continue): break (pausa) molti
linguaggi hanno un'istruzione specifica per la terminazione “prematura” di un ciclo ovvero
per la terminazione in modo alternativo rispetto a quello principale del ciclo. Il seguente
codice Java illustra il concetto:
// cerco un valore N in un array (vettore)
boolean trovato = false;
for(int i=0; i<100; i++) {
if(v[i]==N) {
trovato = true;
break;
}
}
Il programma deve stabilire se un dato numero N è contenuto in un vettore. Non appena N
viene trovato è inutile proseguire lo scorrimento del vettore: il break permette di terminare il
ciclo for.
N.B. L'utilizzo di meccanismi come il break, presente nei linguaggi C/C++ e Java, è spesso
sconsigliato perché riduce la leggibilità dei cicli della programmazione strutturata; infatti
l'uso di break introduce un ulteriore motivo di terminazione del ciclo alternativo alla
terminazione principale del ciclo.
Continue (continua) è un meccanismo simile, considerato meno pericoloso, che permette di
terminare anticipatamente un'iterazione di un ciclo passando immediatamente alla
successiva. Il seguente codice Java mostra il concetto:
// calcola e stampa i fattori di i
for(int i=1; i<=100; i++) {
15
if(numeroPrimo(i)) {
stampa(i);
continue;
}
}
Il programma stampa i fattori di tutti i numeri interi da 1 a 100. Se i è un numero primo, è
viene stampato; altrimenti viene scomposto. L'istruzione continue indica che l'iterazione
corrente è conclusa e permette al ciclo di passare immediatamente alla successiva.
Annidamento: tutte le strutture di controllo possono essere annidate tra loro ovvero inserite una
dentro l'altra all'interno del codice sorgente del programma rispettando la sintassi del linguaggio
usato.
// cerco un valore N in una matrice
boolean trovato = false;
for(int i=0; i<100; i++) {
for(int j=0; j<100; j++) {
if(m[i][j]==N) {
trovato = true;
break;
}
}
}
Strutture di controllo non locali: nella maggior parte dei linguaggi di programmazione di alto
livello, l'esecuzione di un programma si evolve attraverso diversi contesti in ciascuno dei quali sono
possibili alcune azioni e non altre. Le strutture di controllo non locali sono le strutture che causano
un salto del flusso di controllo tipico di un programma. Il goto è il caso estremo e come
conseguenza i linguaggi basati fortemente sul goto, come i linguaggi macchina, sono spesso
caratterizzati da nozioni di contesto molto deboli o assenti.
Nei linguaggi strutturati esistono talvolta strutture di controllo non locali che aggirano le normali
restrizioni sull'evoluzione del contesto di un programma in esecuzione, senza essere però del tutto
incoerenti con esse; queste si possono definire strutture di controllo non locali strutturate. Gli
esempi più noti di strutture di controllo non locali (sia non strutturate che strutturate) sono riportati
nel seguito e afferiscono al problema generale della gestione delle eccezioni.
Le eccezioni in C++ e linguaggi derivati: C++, D, Java, e C# gestiscono le eccezioni con una
struttura di controllo non locale specifica, detta struttura try-catch, la cui sintassi è la seguente:
try {
...
... // codice che può causare eccezioni di vari tipi
...
}
catch (UnTipoDiEccezione e) {
... // gestisce il problema
}
catch (UnAltroTipoDiEccezione e) {
16
... // gestisce il problema
}
finally {
... // codice che va eseguito comunque
}
In questo schema, il blocco di codice try (prova) contiene una o più istruzioni che possono causare
un'eccezione. Se tale eccezione si verifica, il controllo esce dal blocco (contesto) try e passa a un
blocco catch. Si possono avere più catch associate a diversi tipi di eccezioni. Il blocco catch
(prendere) gestisce l'eccezione ovvero contiene le operazioni previste dal programmatore nel caso si
verifichi quella particolare eccezione. Il blocco finally (infine), presente solo in D, Java, e C#,
contiene istruzioni che devono essere eseguite comunque sia in presenza o in assenza di eccezione.
Classificazione dei linguaggi di programmazione:
• Imperativi: nei linguaggi imperativi ogni istruzione è un comando esplicito che opera
direttamente sulla memoria della macchina. Le istruzioni vengono eseguite in un ordine
prestabilito. Il programmatore deve specificare esattamente alla macchina le operazioni da
eseguire per realizzare l'algoritmo e ottenere il risultato voluto. Le strutture di controllo
assumono la forma di istruzioni di flusso e il calcolo procede per iterazione anziché per
ricorsione. I valori delle variabili sono spesso assegnati a partire da costanti o da altre
variabili e raramente per passaggio di parametri. Alcuni esempi importanti di questa
categoria di linguaggi sono l'Assembly, il BASIC e il FORTRAN.
• Strutturati: nei linguaggi strutturati si cerca di limitare la complessità della struttura del
controllo dei programmi. Il programmatore può utilizzate solo le strutture di controllo come
la sequenza, la selezione e il ciclo e non può usare le istruzioni di salto incondizionato.
Alcuni esempi di questa categoria sono il C e il Pascal.
• A oggetti: i linguaggi orientati agli oggetti sono basati su un'evoluzione del concetto di tipo
di dato astratto caratterizzata da incapsulamento, ereditarietà, polimorfismo. Oltre a
linguaggi particolari che implementano completamente i principi di tale metodologia (Java),
molti linguaggi moderni incorporano alcuni concetti della programmazione a oggetti (C++,
C#, Objective C);
• Funzionali: i linguaggi funzionali sono basati sul concetto matematico di funzione. In un
linguaggio funzionale puro si utilizza solo il passaggio dei parametri mentre l'assegnazione
esplicita è completamente assente. Tipicamente, il controllo del calcolo è gestito dalla
ricorsione e dal pattern matching, mentre la struttura dati più diffusa è la lista, una sequenza
di elementi. Il più importante esponente di questa categoria è il LISt Processing (Lisp), il C+
+11 e C#.
Linguaggi di scripting: sono linguaggi per automatizzare compiti lunghi e ripetitivi da eseguire in
modalità batch (inglese gruppo). Infatti, i comandi per realizzare un certo compito sono salvati in
sequenza in un file ed eseguiti come un solo comando. I primi linguaggi di scripting sono stati
quelli delle shell (riga di comando) Unix; successivamente molti altri programmi interattivi hanno
cominciato a permettere il salvataggio e l'esecuzione di file contenenti liste di comandi, oppure il
salvataggio di registrazioni di comandi visuali. Per esempio le macro dei programmi di
videoscrittura o dei fogli di calcolo. Alcuni esempi di linguaggi di scripting sono il PHP, il Perl, il
Python e il Javascript. I linguaggi di scripting sono linguaggi interpretati e vengono eseguiti da
apposito interprete o da il programma madre del quale il linguaggio di scripting è una estensione.
Linguaggi di marcatura: sono linguaggi che descrivono i meccanismi di rappresentazione
17
(strutturali o semantici) di un testo che sono utilizzabili su più supporti. Un linguaggio di marcatura
è la tecnica di formattazione per mezzo di marcatori di un documento. I linguaggi di marcatura si
differenziano per il meccanismo usato per definire la rappresentazione del testo, per la struttura e
per la formattazione. I linguaggi di marcatura si dividono in:
•
Procedurali: sono linguaggi che indicano le procedure di trattamento del testo aggiungendo
le istruzioni che devono essere eseguite per visualizzare la porzione di testo referenziata
(Latex);
• Descrittivi: sono linguaggi che lasciano la scelta del tipo di rappresentazione da applicare al
testo al software di riproduzione. Esempi di questa categoria sono SGML, HTML, XML,
etc..
N.B. I linguaggi descrittivi sono più vantaggiosi perché si concentrano sui problemi strutturali di
leggibilità e non dipendono in fase di lettura dal software con cui sono stati generati. Infatti
permettono una corretta separazione tra struttura e visualizzazione.
HyperText Markup Language (HTML) è il linguaggio a marcatori per ipertesti usato per la
formattazione di documenti ipertestuali disponibili nel World Wide Web sotto forma di pagine web.
18