Estratto del documento

Introduzione

Un calcolatore digitale è una macchina che può risolvere problemi eseguendo le istruzioni che le vengono assegnate. Con il termine programma si intende una sequenza di istruzioni che descrive come portare a termine un dato compito. I circuiti elettronici di un qualsiasi computer possono riconoscere ed eseguire direttamente soltanto un insieme limitato d’istruzioni semplici in cui tutti i programmi devono essere convertiti prima di poter essere eseguiti. Raramente queste istruzioni elementari sono molto più complicate delle seguenti: sommare due numeri, controllare se un numero vale zero, copiare una porzione di dati da una parte all’altra della memoria.

L'insieme di queste istruzioni primitive forma un linguaggio, chiamato linguaggio macchina. La limitatezza del linguaggio è dovuta principalmente a due fattori:

  • Costo: realizzare l’hardware che esegua operazioni complesse è oggigiorno fattibile ma estremamente costoso.
  • Complessità: la complessità di un computer cresce in modo più che proporzionale rispetto alla complessità del suo linguaggio macchina.

Dato che quasi tutti i linguaggi macchina sono semplici ed elementari, risulta difficile e tedioso utilizzarli. Nel corso del tempo ciò ha portato a strutturare i computer come una serie di livelli di astrazione, ciascuno dei quali è costruito sulla base di quello sottostante. In questo modo la complessità è gestibile più agevolmente. Questo modo di concepire l’architettura dei computer è chiamato “approccio strutturale”.

Linguaggio e livelli di astrazione

L’insieme d’istruzioni più comodo da utilizzare rispetto alle istruzioni macchina predefinite forma un linguaggio, definito L1, nello stesso modo in cui le istruzioni macchina formavano a loro volta un linguaggio, definito L0. La definizione di una serie di linguaggi, ciascuno dei quali più pratico da utilizzare rispetto al precedente, può continuare indefinitamente finché non se ne ottenga uno sufficientemente adeguato. Ciascun linguaggio utilizza il precedente come base; un computer che usa questa tecnica può quindi essere immaginato come una serie di strati o livelli disposti l’uno sopra l’altro. Il livello, o linguaggio, che si trova più in basso è il più semplice, mentre quello più in alto è il più sofisticato.

I programmi scritti in un vero linguaggio macchina (livello 1) possono essere eseguiti direttamente dai circuiti del computer (livello 0), senza far ricorso ad alcuna traduzione o interpretazione. Questi circuiti formano, insieme alla memoria e ai dispositivi di input/output, l’hardware del computer, che consiste di oggetti tangibili. Al contrario, il software consiste di algoritmi (istruzioni dettagliate su come realizzare un determinato compito) e delle loro rappresentazioni per i computer, vale a dire i programmi. Il software richiede un apposito hardware per essere eseguito, viceversa l’hardware è pressoché inutile se non si dispone di un apposito software che ne sfrutti le potenzialità per risolvere problemi.

Ma è anche vero che ogni operazione eseguita via software può anche essere costruita direttamente in hardware e ogni istruzione eseguita dall’hardware può essere simulata via software. La scelta di collocare certe funzioni nell’hardware e altre nel software è basata su fattori quali il costo, la velocità, l’affidabilità e la frequenza di modifiche che ci si aspetta.

Firmware

Il firmware è invece un software integrato in un componente elettronico (es. chip) o dispositivo (es. smartphone), in grado (almeno) di avviare il componente stesso e di farlo interagire con altri componenti. Solo i programmi scritti nel linguaggio L0 possono essere eseguiti direttamente dalla componentistica digitale senza far ricorso alla traduzione o all’interpretazione, mentre i programmi scritti in L1, L2, ecc. devono essere interpretati da un interprete eseguito a un livello inferiore oppure devono essere tradotti in un altro linguaggio, corrispondente a un livello più basso.

Traduzione e interpretazione

Un metodo per eseguire un programma scritto in L1 consiste nel sostituire, in una fase iniziale, ogni sua istruzione con un’equivalente sequenza di istruzioni in L0. Il programma che ne risulta è costituito interamente da istruzioni di L0. Questa tecnica è chiamata traduzione ed è eseguita da un compilatore (o assemblatore).

Un’altra tecnica consiste invece nello scrivere un programma in L0 che accetta come dati d’ingresso programmi in L1; tale programma li esegue esaminando un’istruzione alla volta e sostituendola direttamente con l’equivalente sequenza di istruzioni L0. Questa tecnica è chiamata interpretazione e il programma che la esegue è detto interprete.

In entrambi i metodi il computer può trattare istruzioni in L1 eseguendo le equivalenti sequenze di istruzioni L0. La differenza è che, nel caso della traduzione, il programma L1 viene, all’inizio, convertito interamente in un programma L0. Il programma L1 può quindi essere gettato via, mentre il programma L0 viene caricato nella memoria del computer per essere eseguito. Nell’interpretazione ciascuna istruzione L1 viene esaminata e decodificata, e quindi eseguita direttamente senza generare alcun programma tradotto. Entrambi i metodi, oltre a una sempre più frequente combinazione dei due, sono ampiamente utilizzati.

Il traduttore è detto compilatore quando il linguaggio sorgente è un linguaggio di alto livello. È detto assemblatore (assembler) quando il linguaggio sorgente è il linguaggio assembly. Nel primo caso il rapporto tra istruzione sorgente e istruzione macchina è 1 a molti, nel secondo è 1 a 1 infatti l’assembly è una rappresentazione simbolica del linguaggio macchina (usa istruzioni simboliche invece che codici numerici per facilitare la programmazione).

Livelli dei moderni computer

La maggior parte dei moderni computer consiste di cinque livelli, ma esistono anche macchine costituite da sei livelli. Il livello 0, che si trova alla base, rappresenta il vero e proprio hardware della macchina, i cui circuiti eseguono i programmi scritti nel linguaggio macchina. Esiste un ulteriore livello inferiore, chiamato livello dei dispositivi, che ricade nel campo dell’ingegneria elettronica. A questo livello i progettisti hanno a che fare con i singoli transistor, gli elementi primitivi nella progettazione dei computer.

Gli oggetti del livello logico digitale sono le porte. Queste, pur essendo costruite utilizzando componenti analogici come i transistor, possono essere correttamente modellate come dispositivi digitali. Ciascuna porta, costituita al più da una manciata di transistor, è dotata di uno o più input digitali (segnali corrispondenti ai valori 0 o 1) e calcola in output una semplice funzione dei valori d’ingresso, per esempio AND o OR. È possibile combinare un piccolo numero di porte per formare una memoria a 1 bit, che può memorizzare i valori 0 e 1. Combinando le memorie a 1 bit in gruppi, per esempio di 16, 32 o 64, è possibile formare quelli che vengono chiamati registri. Ciascun registro può contenere un numero il cui valore può variare fino a un certo limite.

Subito dopo c’è il livello di microarchitettura. Qui vi è una memoria locale, formata da un gruppo di registri (in genere da 8 a 32), e un circuito chiamato ALU (unità aritmetico-logica), capace di effettuare semplici operazioni aritmetiche. I registri sono connessi alla ALU per formare un percorso dati lungo il quale questi ultimi si spostano. L’operazione base del percorso dati consiste nel selezionare uno o due registri, per mettere alla ALU di operare su di loro (per esempio sommandoli) e memorizzare infine il risultato in uno dei registri. In alcune macchine le operazioni del percorso dati sono controllate da un programma chiamato microprogramma, mentre su altre il percorso dati è controllato direttamente dall’hardware.

Il livello 2 è costituito da quello che è definito il livello ISA (Instruction Set Architecture Level). Ogni produttore di computer pubblica un manuale per ciascuno dei propri modelli, un “Manuale di riferimento del linguaggio macchina”. Il livello successivo è generalmente un livello ibrido. Alcune delle istruzioni del livello 3 sono interpretate dal sistema operativo, mentre altre sono interpretate in modo diretto dal microprogramma; per questo motivo tale livello viene detto “ibrido” o “livello macchina del sistema operativo”.

Tra i livelli 3 e 4 vi è una spaccatura fondamentale: i tre livelli inferiori non sono progettati per essere utilizzati dal programmatore medio, ma concepiti principalmente per eseguire interpreti e traduttori necessari come supporto per i livelli più alti. Questi interpreti e traduttori sono scritti da professionisti chiamati programmatori di sistema, specializzati nella progettazione e nell’implementazione di nuove macchine virtuali. Il livello 4 e quelli superiori sono invece pensati per i programmatori che devono risolvere problemi applicativi.

Un altro cambiamento che si riscontra a partire dal livello 4 è il modo in cui vengono supportati i livelli superiori. Mentre i livelli 2 e 3 sono sempre interpretati, i livelli 4, 5 e quelli superiori sono generalmente supportati mediante traduzione. Un’ulteriore differenza tra i primi tre livelli e gli altri riguarda la natura del linguaggio corrispondente. I linguaggi macchina dei livelli 1, 2 e 3 sono numerici; i loro programmi consistono quindi in lunghe serie di numeri. A partire dal livello 4 i linguaggi contengono invece parole e abbreviazioni umanamente comprensibili.

Il livello 4, detto ‘livello applicativo’ consiste generalmente di linguaggi, spesso chiamati linguaggi ad alto livello, definiti per essere utilizzati dai programmatori di applicazioni. I programmi scritti in questi linguaggi sono generalmente tradotti al livello 3 o al livello 4 da un traduttore detto compilatore; in casi meno frequenti è anche possibile che essi siano interpretati. I programmi in Java, per esempio, di solito sono tradotti inizialmente in un linguaggio di tipo ISA chiamato Java byte code, che viene successivamente interpretato.

I primi computer digitali, risalenti agli anni ‘40, avevano solamente due livelli: il livello ISA, in cui erano realizzati tutti i programmi, e il livello logico digitale, che li eseguiva.

La microprogrammazione

Nel 1951 Maurice Wilkes, un ricercatore della Cambridge University, propose di progettare un computer a tre livelli, al fine di semplificare drasticamente l’hardware. Questa macchina avrebbe dovuto avere un interprete predefinito e non modificabile (il microprogramma), la cui funzione sarebbe stata quella di eseguire programmi al livello ISA mediante interpretazione. Sarebbe stato necessario un minor numero di circuiti elettronici, dato che l’hardware avrebbe dovuto eseguire microprogrammi costituiti da un insieme limitato di istruzioni invece di programmi a livello ISA.

A partire dal 1970 l’idea di avere un livello ISA interpretato da un microprogramma divenne dominante e tutte le principali macchine dell’epoca la implementarono. Quando la microprogrammazione divenne una pratica comune (a partire dal 1970), i progettisti capirono che avrebbero potuto aggiungere nuove istruzioni semplicemente estendendo il microprogramma. In altre parole avrebbero potuto aggiungere “hardware” (nuove istruzioni macchina) per mezzo della programmazione. Questa scoperta portò a una virtuale esplosione dell’insieme delle istruzioni macchina.

Durante gli anni d’oro della microprogrammazione (gli anni ‘60 e ‘70) le dimensioni dei microprogrammi aumentarono così tanto che cominciarono a divenire via via più lenti. A un certo punto alcuni ricercatori compresero che le macchine potevano essere accelerate eliminando il microprogramma, riducendo considerevolmente l’insieme delle istruzioni e facendo in modo che quelle rimanenti venissero eseguite direttamente (cioè attraverso un controllo hardware del percorso dati). Sotto un certo punto di vista la progettazione di computer ha compiuto un cerchio completo, ritornando alla situazione precedente al momento in cui Wilkes introdusse la microprogrammazione. Nelle moderne architetture i microprogrammi sono praticamente assenti.

I primi sistemi operativi

Nei primi anni la maggior parte dei computer era di tipo “fai da te”, il che significava che il programmatore doveva far funzionare la macchina personalmente. Intorno al 1960 si cercò di ridurre la quantità di tempo sprecato, automatizzando il lavoro dell’operatore: un programma chiamato sistema operativo era tenuto costantemente nel computer. Il programmatore forniva, insieme al proprio programma, alcune schede di controllo che venivano lette ed eseguite dal sistema operativo. Al livello ISA vennero aggiunte nuove istruzioni, nuovi servizi e nuove caratteristiche, finché non cominciò ad assumere l’aspetto di un nuovo livello.

I primi sistemi operativi leggevano i pacchi di schede e stampavano l’output attraverso la stampante; questa organizzazione era conosciuta come sistema batch (“a lotti”). Generalmente vi era un’attesa di varie ore tra il momento in cui un programma veniva assegnato alla macchina e quello in cui il risultato era pronto; in tali circostanze lo sviluppo del software risultava difficile. Nei primi anni '60 furono sviluppati sistemi operativi che permettevano a più programmatori di comunicare direttamente con il computer. In questi sistemi una serie di terminali remoti erano connessi attraverso linee telefoniche al computer centrale, che veniva così condiviso da diversi utenti. Un programmatore poteva digitare un programma e ottenere il risultato quasi immediatamente, nel proprio ufficio, nel garage di casa o ovunque si trovasse il terminale. Questi sistemi erano chiamati sistemi a condivisione di tempo (time sharing systems).

Le funzioni del SO sono aumentate nel tempo, arrivando a comprendere:

  • Gestione della CPU: più processi possono essere eseguiti contemporaneamente sullo stesso sistema. È il SO che gestisce questa concorrenza (time sharing) in base alla priorità dei processi e al loro stato.
  • Gestione della memoria: permette ai diversi processi di utilizzarla in modo dinamico.
  • Gestione delle periferiche: permette ai diversi processi di utilizzare le risorse per l’I/O dei dati.

Storia del computer

Generazione zero - Computer meccanici (1642-1940)

La prima persona che costruì una macchina calcolatrice funzionante fu lo scienziato francese Blaise Pascal. Egli progettò e costruì questo dispositivo nel 1642 per aiutare suo padre, un esattore delle tasse del governo francese. La macchina era interamente meccanica, costituita da ingranaggi e veniva azionata a mano con una manovella. La macchina di Pascal era in grado di compiere solamente somme e sottrazioni, ma trent’anni dopo un importante matematico tedesco, Leibniz, costruì un’altra macchina meccanica capace di eseguire anche moltiplicazioni e divisioni. Di fatto costruì, già tre secoli fa, l’equivalente di una piccola calcolatrice tascabile.

Per 150 anni non successe niente di significativo finché un professore di matematica della Cambridge University, Charles Babbage, progettò e costruì una macchina chiamata difference engine (“macchina differenziale”). Questo dispositivo meccanico, capace come quello di Pascal soltanto di sommare e sottrarre, fu progettato per calcolare tabelle di numeri utili per la navigazione. L’intera costruzione della macchina fu pensata per eseguire un solo algoritmo, il metodo matematico delle differenze finite. L'aspetto più interessante della difference engine fu però la sua forma di output: i risultati venivano incisi mediante una punta d’acciaio su una lastra di rame, anticipando quindi i futuri supporti a singola scrittura quali le schede perforate e i CD-ROM.

Babbage progettò poi la analytical engine; essa era composta da quattro componenti: il magazzino (la memoria), il mulino (l’unità computazionale), il dispositivo di input (le schede perforare) e il dispositivo di output (output stampato e perforato). Il magazzino era utilizzato per memorizzare dati e risultati. Il mulino poteva prelevare gli operandi dal magazzino per sommarli, sottrarli, moltiplicarli o dividerli e infine memorizzarne nuovamente il risultato nel magazzino. Anche questa macchina, al pari della difference engine, era interamente meccanica. Il grande avanzamento rappresentato dall’analytical engine consisteva nel fatto di essere di uso generale. Leggeva le istruzioni dalle schede perforate e le eseguiva. Perforando un diverso programma sulle schede di input era quindi possibile far eseguire all’analytical engine diverse computazioni, cosa che era invece impossibile con la difference engine.

Dato che la analytical engine era programmabile mediante un semplice linguaggio assemblativo, era necessario produrre il software. A tal fine, Babbage assunse Ada Augusta Lovelace, la giovane figlia del famoso poeta inglese, Lord Byron. Ada Lovelace fu quindi la prima programmatrice della storia. Sfortunatamente Babbage non riuscì mai a ottenere un hardware completamente privo di errori. Il problema nasceva dalla necessità di avere migliaia e migliaia di rotelle e ingranaggi per ottenere un grado di precisione che la tecnologia del diciannovesimo secolo non era ancora in grado di fornire.

Il successivo e significativo avanzamento avvenne verso la fine degli anni ‘30, quando uno studente tedesco di ingegneria, Konrad Zuse, costruì una serie di macchine calcolatrici automatiche utilizzando dei relè elettromagnetici. Zuse non conosceva il lavoro di Babbage e le sue macchine furono distrutte nel 1944 durante un bombardamento degli Alleati su Berlino. Anche se per questi motivi il suo lavoro non poté influenzare lo sviluppo delle macchine successive, non molto tempo dopo, negli Stati Uniti, altri due ricercatori, John Atanasoff e George Stibbitz, si dedicarono alla progettazione.

Anteprima
Vedrai una selezione di 16 pagine su 72
Architetture degli elaboratori - appunti Pag. 1 Architetture degli elaboratori - appunti Pag. 2
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 6
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 11
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 16
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 21
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 26
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 31
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 36
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 41
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 46
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 51
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 56
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 61
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 66
Anteprima di 16 pagg. su 72.
Scarica il documento per vederlo tutto.
Architetture degli elaboratori - appunti Pag. 71
1 su 72
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Nobody_scuola_1990 di informazioni apprese con la frequenza delle lezioni di Architetture degli elaboratori e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Bologna o del prof Maltoni Davide.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community