| 
  • If you are citizen of an European Union member nation, you may not use this service unless you are at least 16 years old.

  • Browse and search Google Drive and Gmail attachments (plus Dropbox and Slack files) with a unified tool for working with your cloud files. Try Dokkio (from the makers of PBworks) for free. Now available on the web, Mac, Windows, and as a Chrome extension!

View
 

Corso di Informatica - Il futuro - Evoluzione sistemi operativi e linguaggi

Page history last edited by Trapani Marco 12 years, 7 months ago

Evoluzione di sistemi operativi e linguaggi

 

 

Prima della crescita esplosiva della rete il modello fondamentale era quello del sistema operativo tradizionale di cui abbiamo già commentato la struttura in tre livelli: utente, nucleo e hardware. L'esplosione della disponibilità di infrastrutture di rete a livello capillare ha generato nuovi modelli con i quali il concetto di sistema operativo è diventato qualcosa di molto più generale e multiforme.

La tendenza è quella di generare dei sistemi in grado di accedere ad una grande varietà di risorse e servizi disponibili in rete esattamente come il sistema tradizionale accede alle risorse disponibili nell'ambito della propria macchina. Questo non significa che il sistema operativo convenzionale vada sparendo: ci sarà sempre un sistema che governa localmente una macchina e che è in grado di farla funzionare quando questa è sconnessa dalla rete.

 

Si stanno sviluppando tuttavia nuovi strati di software che agganciandosi al software locale peculiare di ciascun computer, sono in grado di riprodurre a loro volta funzionalità tipiche di un sistema operativo convenzionale ma utilizzando risorse distribuite; per esempio database dislocati su server appositi o potenza di calcolo su macchine adeguate. Il lettore avrà notato che non stiamo dando un nome preciso a questo nuovo tipo di sistema. La ragione consiste nel fatto che vi può essere tutta una varietà di tali sistemi, apparentemente anche molto diversi ma che realizzano in qualche forma l'idea di un sistema operativo che è in grado di utilizzare i servizi di macchine diverse o che addirittura "vive" nella rete appoggiato su tante macchine diverse, talvolta una miriade di macchine.

 

Fra tali sistemi si annoverano oggetti che possono essere noti come linguaggi di programmazione (Java per esempio), come sistemi cosiddetti P2P, comunicazione da pari pari) o come middleware. Consideriamo per l'appunto questa espressione: middleware. Sappiamo che software identifica l'insieme di programmi che possono essere fatti girare su un computer e hardware l'insieme di oggetti fisici di cui è costituito un computer. Abbiamo visto come il sistema operativo convenzionale sia quella parte di software deputata al controllo diretto dei dispositivi hardware. Ebbene, il middleware rappresenta un insieme di programmi software che girano su di un insieme di computer e che consentono di gestire tale insieme di computer come un unica risorsa: come il software di un sistema operativo serve a controllare il livello hardware di una macchina, così il middleware serve a controllare una macchina "generalizzata" i cui componenti sono un insieme di computer e di macchine diverse e dei loro rispettivi dispositivi.

 

Una disanima delle tipologie di sistemi di questo genere che esistono già o che sono in via di sviluppo ci porterebbe fuori strada. Un buon esempio può tuttavia essere quello del linguaggio di programmazione Java. Per capire la peculiarità di Java rispetto agli altri linguaggi di programmazione è necessario soffermarsi un momento sul processo di formazione di un programma eseguibile.

 

Vi sono due tipi di linguaggi di programmazione: quelli compilati e quelli interpretati.

Fra i primi si possono annoverare il Fortran, il Cobol, Ada, il C, il C++, il Pascal, tanto per citare alcuni fra i più noti.

Fra i secondi possiamo ricordare l'APL e il Basic nella sua forma originale.

 

In ogni caso, il programmatore scrive quello che si chiama la sorgente che è un file in formato ASCII. Si tratta quindi di un file che può essere letto e modificato con qualsiasi editore di testo (Notepad, Edit, Emacs, Pico fra i tantissimi in circolazione). Poiché sappiamo che l'unità di controllo è in grado di decodificare esclusivamente istruzioni macchina, cioè istruzioni costituite da sequenze di 0 ed 1, deve per forza aver luogo un processo di traduzione dei file sorgenti in linguaggio macchina. È nel modo in cui viene eseguita tale traduzione che i linguaggi compilati si differenziano da quelli interpretati.

 

 

 

Linguaggi compilati e linguaggi interpretati

 

 

  • Linguaggi compilati

    Per tradurre le istruzioni si usa uno specifico programma che si chiama compilatore. Il compilatore si aspetta di ricevere un file sorgente scritto in caratteri ASCII e fornisce un file, detto file oggetto, che contiene la traduzione delle istruzioni in linguaggio macchina. Il compilatore è specifico del linguaggio e del computer. Questo significa che esiste un compilatore per ogni linguaggio ma anche per ogni specifica macchina. Non sarebbe infatti possibile utilizzare i file oggetto prodotti per un certo computer, per esempio un PC con processore Pentium, su di un altro tipo di macchina, per esempio un Macintosh. Di conseguenza, se si desidera che un certo programma funzioni su macchine di tipo diverso, è necessario essere in possesso di un compilatore per ognuna delle macchine. Esiste anche il concetto di cross-compilatore con il quale si intende un compilatore che gira su di un certo computer ma che, mediante opportuni comandi, è anche in grado di produrre file oggetto validi per altri tipi di computer.

    È opportuno rilevare che il file oggetto non coincide con il vero e proprio programma eseguibile. Ciò è dovuto al fatto che, scrivendo un programma, il programmatore si occupa di esprimere le operazioni che realizzano l'obiettivo che si è prefisso senza tuttavia entrare nel merito di una varietà di servizi necessari per il funzionamento. Ci riferiamo a servizi tipo la stampa di risultati, la memorizzazione o la lettura di dati su file localizzati su disco rigido od altri supporti di memoria, la visualizzazione di immagini, il controllo di dispositivi vari e via dicendo. Sono i tipici servizi che il sitema operativo è in grado di fornire e che per essere utilizzati da un programma necessitano di particolari istruzioni che fanno da tramite fra il programma ed il sistema operativo. Tali istruzioni sono tipicamente raccolte in file che si chiamano librerie, del tutto assimilabili a quelli che abbiamo chiamato file oggetto. La differenza fra file oggetto e librerie sta nel fatto che quest'ultime sono preconfezionate e vengono acquisite all'atto dell'acquisto del software di compilazione per un certo linguaggio ed una certa macchina. Se per esempio dobbiamo scrivere programmi in linguaggio C per computer PC con il sistema operativo Linux, dovremo avere il compilatore C per PC e sistema Linux corredato dalle corrispondenti librerie.

    Per produrre il programma eseguibile è necessario realizzare un processo di "collegamento" fra uno o spesso più (anche moltissimi nel caso di programmi complessi) file oggetto e le opportune librerie, processo che prende il nome di link. Il processo di link è realizzato da un apposito programma che si chiama linker e che richiede in ingresso tutti i file oggetto e le librerie necessarie. In uscita il linker produce un file, che si chiama file eseguibile e che contiene il programma in linguaggio macchina che il computer è in grado di eseguire. Eseguire un programma significa leggere dal disco rigido il file eseguibile che lo contiene, caricarlo nella memoria RAM e leggere ed eseguire le istruzioni del programma a partire dalla prima istruzione, esattamente come abbiamo descritto nell'esempio di un programma assembler.

 

  • Linguaggi interpretati

    Anche con i linguaggi interpretati deve avere luogo il processo di traduzione. Tuttavia in questo caso le istruzioni della sorgente non vengono tradotte tutte insieme per produrre un file oggetto come avviene con il compilatore, bensì ogni istruzione viene letta dal file sorgente, tradotta in linguaggio macchina ed eseguita subito. In questo caso quindi i processi di traduzione e di esecuzione sono mescolati e non distinti come nel caso dei linguaggi compilati.

    In tale descrizione manca evidentemente il concetto di libreria che avevamo introdotto a proposito della compilazione. Nei linguaggi interpretati invece del compilatore abbiamo l'interprete che provvede a leggere le istruzioni, a tradurle e ad eseguirle. È l'inteprete che esaudisce le richieste di servizi esterni richiesti dal programma. Si può descrivere questa situazione immaginando l'interprete come uno strato di software che avvolge il programma. Di fatto è l'interprete ad essere eseguito e come tale esso ingloba tutte le librerie necessarie all'esecuzione dei programmi. Per essere eseguito, l'interprete richiede un file sorgente da eseguire.

 

Si può affermare che la tecnologia basata sulla compilazione è dominante. Tutti i linguaggi principali utilizzati per la produzione di software di ogni tipo sono compilati. La compilazione si presta a produrre programmi ottimizzati (l'ottimizzazione di un programma consiste in tutta una serie di accorgimenti che, senza alterare la funzionalità di base, consentono di migliorarne le prestazioni e le dimensioni) e che debbano essere distribuiti come pacchetti software indipendenti. Così sono stati prodotti tutti i pacchetti che siete abituati ad utilizzare per scrittura di testi, disegno, ritocco fotografico, video giochi e via dicendo.

La tecnologia basata sull'interpretazione è nata per la realizzazione di linguaggi adatti all'uso didattico, idonei cioè all'apprendimento della programmazione. Nacque così il Basic che nella sua forma originale era un interprete: si faceva partire il programma basic (una versione molto diffusa è stata a lungo il QuickBasic) che offriva un prompt al quale si potevano scrivere le singole istruzioni che venivano eseguite immediatamente. Questo sistema si presta particolarmente per sperimentare in modo immediato gli effetti delle varie istruzioni o di brevi sequenze di istruzioni. Successivamente il Basic si è evoluto in un linguaggio compilato e completo come molti altri (VisualBasic).

La tecnologia basata sull'interpretazione ha avuto tuttavia alcune importanti applicazioni. Una di queste concerne i cosiddetti ambienti di analisi di dati scientifici. Si tratta di programmi che offrono un ambiente con molti comandi che facilitano molto la lettura, manipolazione e visualizzazione di dati. Quasi sempre i vari comandi offerti da tali ambienti possono essere raggruppati in sequenze (si parla in tal caso di script che possono essere successivamente eseguite come fossero dei programmi). In questo modo l'utente può estendere moltissimo la funzionalità dell'ambiente in funzione delle proprie specifiche necessità. Alcuni di questi ambienti consentono anche di tradurre gli script prodotti in veri e propri programmi scritti in un linguaggio da compilare (per esempio C) per produrre dei programmi distribuibili convenzionalmente.

Un'altra evoluzione importantissima della tecnologia d'interpretazione è quella che ha condotto a linguaggi tipo Java.

 

 

 

Il linguaggio Java

 

Java è un linguaggio che è stato introdotto dalla Sun Microsystem non tanto con l'obiettivo di creare un nuovo linguaggio quanto per dare vita ad un nuovo modo di utilizzare i computer. L'idea centrale che sta alla base di questa visione è quella di concepire il software come un qualcosa che funzioni su insiemi di computer connessi in rete anziché su di un singolo computer. Per poter iniziare un progetto del genere era necessario disporre di un linguaggio che consentisse di scrivere programmi liberando i programmatori dagli oneri e spesso dall'incubo di produrre versioni diverse per sistemi diversi.

La soluzione proposta con Java impiega sia la tecnologia dei compilatori che quella degli interpreti. I programmi vengono scritti in file sorgenti in caratteri ASCII come usuale. Successivamente vengono compilati in modo tradizionale per produrre dei file oggetto esattamente come avviene per i linguaggi convenzionali. Tuttavia i file oggetto prodotti dal compilatore Java non sono utilizzabili su nessun tipo di computer. La cosa può sembrare strana perché abbiamo descritto i file oggetto come quei file che contengono la traduzione in linguaggio macchina del programma. In effetti il compilatore Java produce file oggetto contenenti istruzioni macchina ma si tratta di istruzioni valide per una generica macchina che è stata chiamata JVM e che non corrisponde a nessun computer esistente.

 

Questo spiega evidentemente come possa essere possibile scrivere software senza preoccuparsi del computer su cui questo dovrà girare. Rimane da capire come i file oggetto buoni per la JVM possano essere trasformati in programmi validi per uno specifico computer reale. È qui che entra in gioco l'interprete. I programmi scritti in Java, ancorché tradotti in linguaggio macchina (per la JVM), non possono essere tradotti in un file eseguibile ma hanno bisogno di un "ambiente", l'interprete Java per l'appunto. È l'interprete Java che si incarica di leggere le istruzioni in linguaggio macchina valida per la JVM e di tradurle in istruzioni nel linguaggio macchina del computer reale su cui si sta lavorando. Infatti per girare un programma Java si deve in realtà far girare il programma java aggiungendo sulla riga di comando il nome del file oggetto che rappresenta il nostro programma. Supponiamo per esempio che il programma che vogliamo far girare si chiami "pippo". Mentre con i linguaggi convenzionali noi avremmo prodotto un file eseguibile di nome "pippo" da lanciare al prompt con il comando "pippo", con Java noi dovremo lanciare un comando del tipo "java pippo". Con tale comando si fa partire in realtà l'interprete Java il quale va a leggersi le istruzioni macchina per la JVM contenute nel file "pippo", tradurle nel linguaggio macchina del computer ed eseguirle.

È evidente che, affinché si possano girare programmi scritti in Java su di un certo computer, dovrà essere disponibile l'interprete Java adatto per quel computer e per il sistema operativo con cui esso è equipaggiato. Gli interpreti Java per i vari tipi di computer e sistemi operativi sono gratuitamente disponibili e scaricabili dalla rete. Una volta che l'interprete è stato scaricato ed installato su di un certo sistema su quel sistema può essere fatto girare qualsiasi programma Java senza che i programmatori che hanno prodotto quel programma abbiano dovuto preoccuparsi delle particolari specifiche del sistema.

Una prima applicazione della tecnologia Java è quella con la quale si producono le cosiddette applet. Le applet sono dei programmi (inizialmente erano molto piccoli ma ora possono anche essere piuttosto grossi) che possono essere associati alle pagine web per funzionare sul computer di chi ha invocato quelle pagine. Sono prodotti usualmente così gli effetti animati più o meno complessi che corredano spesso le pagine web. Quello che succede quando si invoca mediante un click sul link corrispondente ad una pagina del genere, è che insieme alle informazioni che appaiono sulla pagina stessa viene scaricato nella RAM del proprio computer anche un programma che viene eseguito localmente. Questo tipo di programma, chiamato applet, è scritto in Java e il browser (per esempio Netscape o Mozilla o Internet Explorer) che state utilizzando per visualizzare le pagine web fa partire automaticamente l'interprete java per trasformare al volo le istruzioni valide per la JVM nelle istruzioni del vostro computer.

Con il tempo il linguaggio Java è stato arricchito con una quantità enorme di possibili richieste alla JVM consentendo ai programmatori di scrivere software anche molto complessi per una grande varietà di macchine. Moltissime delle funzionalità cher siete ormai abituati a vedere "navigando" nella rete sono state ottenute con questo tipo di tecnologie. Un esempio molto interessante è costituito dal programma di elaborazione di immagini mediche ImageJ. Altre informazioni sul programma ImageJ le trovate nella sezione "Relax". Un esempio più semplice è quello che abbiamo proposto nella sezione sulla codifica delle informazioni a proposito della rappresentazione delle immagini mediche.

 

Potete trovare ulteriori informazioni sul linguaggio Java nelle pagine spiritose scritte da un vostro compagno.

 

Comments (0)

You don't have permission to comment on this page.