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