










































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Riassunti stilati sulla base di studi effettuati su libri di testo, appunti e lezioni frontali. Le seguenti pagine in formato pdf ripropongono gli argomenti principali affrontati dalla materia.
Tipologia: Sintesi del corso
1 / 50
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!











































Informatica PROGRAMMA: INFORMATICA ED ALGORITMI RAPPRESENTAZIONE DELL’INFORMAZIONE ALGORITMI E PROGRAMMI LE INFRASTRUTTURE HARDWARE: ARCHITETTURA DEI CALCOLATORI LE INFRASTRUTTURE SOFTWARE: SISTEMA OPERATIVO, SISTEMA APPLICATIVO. LE INFRASTRUTTURE DI RETE: RETI DI CALCOLATORI, INTERNET E WORLD WIDE WEB. LE APPLICAZIONI: FOGLIO ELETTRONICO: definizione di una dieta. LE APPLICAZIONI: LE BASI DI DATI: definizione e gestione di una cartella clinica. USO DEI MOTORI DI RICERCA GOOGLE E PUBMED.
EVOLUZIONE DEI CALCOLATORI
1623-1662 La Pascalina , dispositivo meccanico utile all’esecuzione di somme e sottrazioni. 1792-1871 BABBAGE, different engine , attraverso l’uso di schede perforate.
Quella di Babbage era la prima macchina programmabile, formata da 4 parti:
Il periodo bellico aprì la strada alla tecnologia informatica elementare, negli anni ’40, le valvole termoioniche rendono obsoleti i relè elettromagnetici. Venne realizzato il primo calcolatore digitale elettronico: COLOSSUS , ma la vera svolta fu la realizzazione dell’ ENIAC , composto da 18000 valvole e 1500 relè, con un peso complessivo di 30 tonnellate e un consumo di 140Kw.
John Von Neumann, partecipò al progetto ENIAC ed ebbe un’intuizione geniale, semplificare e allo stesso tempo velocizzare il progetto ENIAC. Propose di memorizzare i programmi in forma digitale nella stessa memoria di dati, eliminando l’utilizzo di cavi e interruttori precedentemente usati. E propose l’utilizzo dell’aritmetica BINARIA, invece di quella decimale. In questo modo, venivano usate 2 valvole per bit e non 10 per cifra. Il suo progetto, la macchina di Von Neumann , è ancora oggi alla base di quasi tutti i calcolatori digitali.
Un calcolatore dev’essere in grado di: Eseguire istruzioni sui dati. Controllare il flusso dell’esecuzione. Memorizzare dati. Memorizzare successioni di istruzioni. Interagire con utenti ed eventuali altri sistemi. Essenzialmente, lo schema che segue oggi la maggior parte dei calcolatori è il seguente:
Inventato ai Bell Labs , nel 1948, rese obsoleti i calcolatori a valvole. I transistor sono delle unità che trasformano l’informazione binaria. È possibile controllare la corrente che vi fluisce attraverso grazie all’uso di una tensione applicata. Ulteriore novità fu il fatto che il transistor può essere reso piccolissimo. VERY LARGE SCALE INTEGRATION – VLSI Numero maggiore di transistor ricavati da fette di silicio. 105-107 transistor integrati per chip. Si passò dai minicalcolatori, alle work station, agli odierni PC.
DEFINIZIONE DI INFORMATICA La definizione definitiva si ha nel 1993, Fellows and Parberry: Calcolatori: informatica = telescopi: astronomia. Il concetto centrale nell’informatica è il concetto di ALGORITMO , una procedura per risolvere un problema matematico in un numero finito di passi. Un metodo passo-passo per eseguire un dato compito. Formalmente, un algoritmo è un insieme ben ordinato di operazioni non ambigue, ed effettivamente calcolabili, che eseguito, produce un risultato e termina in un lasso di tempo definito. Quando viene eseguito da un calcolatore, un algoritmo diventa un programma.
L’informatica è “lo studio sistematico degli algoritmi che descrivono e trasformano l’informazione: la loro teoria, analisi progetto, efficienza, realizzazione e applicazione”. Secondo un’altra definizione, più sintetica, ma Altrettando diffusa, l’informatica è la scienza della rappresentazione e dell’elaborazione dell’informazione”.
L’informatica è lo studio sistematico degli algoritmi che descrivono e trasformano l’informazione. Un SUPPORTO è un oggetto fisico che porta l’informazione. Questa informazione può essere spostata, trasferita o memorizzata; allo stesso tempo, l’informazione può essere scritta su supporti differenti. Distinguere tra info e supporto fisico, significa distinguere tra entità logiche ed entità fisiche. L’informazione può essere creata e distrutta. In sostanza un SUPPORTO contiene e memorizza l’informazione e non coincide con l’informazione stessa. Ogni supporto ha poi le sue caratteristiche in quanto mezzo su cui può essere scritta l’informazione.
Ad esempio, alcuni supporti sono particolarmente adatti alla trasmissione di informazione, ma non alla sua memorizzazione.
comunica con utenti o con altri dispositivi
memorizza dati ed istruzioni
Generalmente si adottano supporti fisici le cui configurazioni sono costituite da insieme ordinati di configurazioni piu semplici,o “configurazioni elementari”. Si applica dunque un principio di composizionalità: come la configurazione del supporto è ottenuta dall’insime ordinato delle configurazioni elementari di cui esso è costituito, cosi l’informazione complessivamente portata dal supporto, chiamata messaggio, si ricava dall’insieme ordinato dei simboli, cioè dalle entità di informazione che corrispondono alle singole configurazioni elementar
Introdotto il concetto di informazione, è ora possibile esaminare la modalità di codifica dell’informazione. L’unità di elaborazione deve essere in grado di manipolare i dati e di eseguire le istruzioni contenute nell’unità di memorizzazione. Per questo motivo è necessario che le istruzioni e i dati siano rappresentati in un formato adatto alla memorizzazione e alla manipolazione da parte di un esecutore automatico. Per esempio, anche la nostra lingua italiana è un codice, che definisce un insieme di regole da seguire, al fine di formare delle successioni ben formate. Tipicamente, un codice necessita di un alfabeto di simboli e di una regola di composizione. Il nostro sistema di numerazione decimale, utilizza 10 simboli (0-1-2-3-4-5-6-7-8-9), più il separatore delle cifre decimali, la virgola, il separatore delle migliaia, il punto e il segno + o – per distinguere tra numero positivo e negativo. Il CODICE mi permette di risalire al significato della sequenza numerica espressa. Ma quali sono le ‘’regole’’ che mi permettono di decifrare la sequenza? Le unità vengono moltiplicate per la base elevata a 0, le decine per 101 , le migliaia per 102 e così via. I calcolatori tuttavia non utilizzano il sistema di numerazione decimale, ma il sistema di numerazione binario.
L’alfabeto più semplice che si può adottare per la codifica di dati e istruzioni è costituito di due soli simboli, di solito indicati convenzionalmente come “0” e”1”. Gli attuali calcolatori impiegano per la memorizzazione dei dati e delle istruzioni proprio dei dispositivi, detti bistabili, in grado di assumere una configurazione scelta tra due differenti: un alfabeto di questo genere, chiamato binario, si può considerare alla base dell’elaborazione automatica dell’informazione. I dispositivi bistabili vengono usualmente chiamati bit, da binary digit (cifra binaria): i bit sono dunque gli elementi dei codici utilizzati dai calcolatori.
Nel sistema binario, la base di riferimento non è più 10, ma 2. Un bit, il cui valore può essere 0 o 1, mi rappresenta due possibili entità di informazione diverse. Per poter accrescere il potere rappresentativo di queste configurazioni, si ha la necessità di mettere più cifre insieme: quindi, con 2 bit, riesco ad ottenere 4 possibili combinazioni [00, 11, 10, 01], mentre se ho 3 bit, posso ottenere fino ad un massimo di 6 possibili configurazioni.
Esempio di codifica binaria: Assegnare un codice binario univoco a tutti i giorni della settimana. Giorni della settimana = 7. N = 7 K ≥ log 27 K= Con 3 bit possiamo ottenere 8 diverse configurazioni.
Codifica binaria dei caratteri: 26 lettere maiuscole + 26 lettere minuscole = 52 52 + 10 cifre + 30 segni di interpunzione + 30 caratteri di controllo (come TAB).
In totale abbiamo 120 oggetti Complessivi da codificare in bit.
K ≥ log 2 120 = 7
REGOLA: una volta definito il codice, la lunghezza e la frequenza di bit da utilizzare, tutti gli oggetti devono avere un codice della stessa lunghezza. Quindi, se sono 3 oggetti, allora tutti devono avere 3bit, se sono 4 oggetti, tutti devono avere 4 bit e così via.
Nella gran parte delle applicazioni informatiche è necessario trattare con dati non numerici, come singoli caratteri alfanumerici (a,b..,Y,Z,;,..) e loro successioni, che vengono generalmente denominate stringhe. Per esempio la scritta “fare” è composta dai caratteri f-a-r-e. Il sistema di codifica più diffuso nelle rappresentazione di caratteri alfanumerici è il cosiddetto codice ASCII , che nella sua versione originaria prevede successioni di lunghezza k=7(esistono versioni estese del codice ASCII, basate su successioni di 8 bit, che consentono di rappresentare 256 caratteri e quindi anche caratteri previsti nella lingua inglese come, per esempio, le lettere accentate). È stato definito un ulteriore standard, UNICODE, basato su successioni di 16 bit quindi in grado di codificare 2^16=65535 diversi caratteri. Per facilitare il passaggio da ASCII a UNICODE, i primi 128 caratteri del codice UNICODE sono gli stessi del codice ASCII. Purtroppo anche UNICODE non riesce a coprire tutti i simboli utilizzati da tutte le lingue del mondo. Il codice ASCII su 7 bit è universalmente riconosciuto ed utilizza 7 bit, può quindi rappresentare al massimo 27 = 128 caratteri.
Tuttavia il codice ASCII odierno, utilizza 8 bit, anziché 7, e prende il nome di codice ASCII esteso. Il codice ASCII esteso, assegna 8 bit ad ogni carattere. Gli 8 bit sono comunemente conosciuti come byte. ASCII ESTESO 28 CARATTERI 256 elementi. ASCII sta per American Standard for Character Information Interchange, quindi è uno standard utile allo scambio di caratteri, e permette ad un documento scritto negli Stati Uniti di essere visualizzato, o meglio, decifrato per esempio in Italia.
NON STAMPABILI, perché non visibili né sullo schermo, né sul foglio stampato.
I numeri naturali espressi in forma binaria si possono sommare. L’operazione da eseguire è esattamente uguale alla somma dei numeri decimali; quando la somma è maggiore o uguale alla base, si fa il riporto:
Anche il segno è rappresentato da 0 e 1. 0 = POSITIVO 1 = NEGATIVO Quindi, se abbiamo 1110: SENZA SEGNO: 23 +2^2 +2^1 = CON SEGNO: - 2^2 +2^1 = -
Per rendere possibile l’esecuzione di programmi da parte di un calcolatore è necessario che questi siano codificati mediante un linguaggio, chiamato linguaggio macchina , che l’unità di elaborazione del calcolatore è in grado di interpretare. La codifica delle istruzioni segue allora lo schema presentato sopra per i caratteri alfanumerici: stabilite quante e quali sono le istruzioni da codificare, si determina la lunghezza delle successioni di bit e si procede a stabilire una corrispondenza tra istruzioni e successioni di bit. A ogni istruzione è assegnato un codice univoco (definito codice operativo e abbreviato OPCODE ), che l’esecutore deve decodificare per identificare quali operazioni effettuare. Oltre un codice operativo, un’istruzione deve anche contenere gli eventuali riferimenti ai dati necessari per completare l’esecuzione.
La codifica è stata definita come l’operazione con cui l’informazione viene scritta su un supporto fisico. Abbiamo visto come spesso tale operazione venga compiuta in due fasi: Prima l’informazione viene convertita in una seconda entità di informazioni (ad esempio un numero decimale che viene convertito in numero binario.) Quindi l’entità di informazione così ottenuta viene finalmente scritta sul supporto fisico Al supporto è richiesto di essere in grado di mantenere distinte le configurazioni che identificano entità di informazione diverse (per esempio, nel caso delle cifre binarie 0 e 1, il supporto deve essere in grado di distinguere in modo univoco tra le due cifre). Un cosiddetta meta-informazione , è un’informazione che contiene una metrica, stabilisce insomma un ordine per tutto l’insieme delle altre informazioni. Le configurazioni del supporto, allora, non portano solo informazioni, ma anche meta-informazioni, quindi non solo informazioni di identificazione , ma anche di ordine, metrica. Ma come inserire la meta-informazione all’interno di un supporto?? È possibile utilizzare un supporto in grado
di contenere esplicitamente la meta-informazione ( codifica di tipo analogico ), oppure inserire la meta- informazione in modo implicito all’interno della regola di codifica ( codifica di tipo digitale ).
Il processo di quantizzazione, consiste nella suddivisione dell’insieme di valori in un numero finito i sottoinsiemi, ognuno poi rappresentato mediante una codifica digitale. Ad esempio, una suddivisione su otto livelli, permette di impiegare una codifica a 3 bit 23 = 8𝑏𝑖𝑡. Ovviamente tutti i valori compresi nello stesso sottoinsieme sono codificati nello stesso modo e risultano pertanto indistinguibili. Questa perdita di informazione può essere limitata riducendo la dimensione dei sottoinsiemi, e quindi aumentando corrispondentemente il numero di sottoinsiemi individuati. Questa scelta ha come effetto collaterale l’aumento della lunghezza delle successioni necessarie per la codifica: se per otto livelli bastano 3 bit, per codificare cento livelli servono 7 bit e, in generale, per codificare n livelli servono (log2n) bit. La strategie di digitalizzazione diventa ancora più complessa quando occorre codificare grandezze fisiche che variano nel tempo, oppure nello spazio, oppure sia nel tempo sia nello spazio. Si consideri, per esempio, il problema di codificare in forma digitale una grandezza che varia nel tempo. L’operazione di quantizzazione deve essere in tal caso ripetuta per tutti gli istanti di tempo durante i quali si vuole rappresentare la grandezza. Occorre perciò effettuare un’operazione di campionamento della grandezza: si suddivide l’intervallo di tempo considerato in sotto intervalli e per ciascuno di essi si sceglie un istante di riferimento; il valore che la grandezza assume in quell’istante viene considerato come rappresentativo del valore di tutto l’intervallo. Se con la quantizzazione si discretizza il valore di una grandezza, con il campionamento si discretizza il tempo in cui la grandezza viene osservata; e come accade per la quantizzazione, anche nel caso del campionamento la discretizzazione provoca, in generale, una perdita di informazione, dovuta al fatto che si considera un campione come rappresentativo di tutti i valori che la grandezza assume in un intervallo di tempo. Per ridurre la perdita di informazione dovuta al campionamento è perciò possibile aumentare la frequenza, e quindi ridurre l’intervallo di tempo che separa due campioni successivi.
Il procedimento di soluzione di un problema dovrebbe essere realizzato in fasi distinte e successive: Analisi del problema e identificazione di una soluzione, da parte del primo soggetto. Descrizione della soluzione da parte ancora del primo soggetto, in termini comprensibili al secondo soggetto. Eliminando, quindi, tutte le possibili ambiguità, esponendo in modo chiaro e univoco le regole da rispettare, i vincoli e i dati da calcolare. È importante, in questa circostanza, la formulazione, da parte del primo soggetto, di un modello matematico che permette la risoluzione del problema. È pratica comune scomporre il singolo problema in n sotto-problemi più semplici. Interpretazione della soluzione, da parte del secondo soggetto, sulla base della descrizione fornitagli dal primo. Attuazione della soluzione, da parte del secondo soggetto.
Il linguaggio che l’esecutore è in grado di interpretare deve essere definito in modo completo e ambiguo: è questa una caratterizzazione sintattica dell’esecutore. L’insieme delle azioni che l’esecutore è in grado di compiere deve essere definito, e tali azioni devono essere elementari per l’esecutore: è questa una caratterizzazione pragmatica dell’esecutore. L’insieme delle regole di associazione tra costrutti del linguaggio e azioni deve essere definito in modo completo e non ambiguo: è questa una caratterizzazione semantica dell’esecutore. Il processo di sviluppo di un programma è dunque usualmente organizzato in una sequenza di fasi:
1. Analisi del problema e identificazione di una soluzione. 2. Formalizzazione della soluzione e identificazione dell’algoritmo risolutivo. 3. Programmazione del problema del linguaggio che il calcolatore è in grado di riconoscere detto “ linguaggio macchina ” (Questa fase viene svolta automaticamente, dato che sia il linguaggio di programmazione di alto livello sia il linguaggio macchina sono linguaggi formali e quindi la traduzione può essere effettuata da opportuni strumenti software, chiamati compilatori e
l’intero programma da linguaggio ad alto livello, a linguaggio macchina, gli interpreti, traducono istruzione per istruzione.
Essenzialmente, un ESECUTORE , è definito da 3 elementi:
Il calcolatore ‘’capisce’’ le istruzioni che fanno parte del LINGUAGGIO MACCHINA , ovvero istruzioni semplici ed efficienti.
La soluzione, non è altro che l’ algoritmo , soluzione intesa come descrizione della soluzione del problema. Due principali proprietà di un algoritmo:
progettato.
possibile di risorse fisiche: MEMORIA TEMPO DI ESECUZIONE Paradossalmente, però, l’algoritmo più efficiente, per quanto riguarda la velocità dell’esecuzione, è anche quello che utilizza più memoria. Un PROGAMMA , non è altro che l’algoritmo scritto in modo da poter essere eseguito da un calcolatore e il LINGUAGGIO MACCHINA , è il linguaggio che effettivamente viene compreso dal calcolatore, ed espresso in sequenze di bit. L’algoritmo formulato per essere eseguito automaticamente, viene codificato per essere compreso dal calcolatore. Gli algoritmi sono basati su specifici parametri e per questo motivo sono detti PARAMETRICI. Invece, le istruzioni dell’algoritmo, lavorano su delle variabili , il cui valore non è fissato a priori, ma varia a seconda della situazione elaborativa in cui l’esecutore si trova. Le variabili si trovano all’interno di particolari espressioni logiche: Ad esempio, 3,14 è caricato nella variabile P.I. che indica π. Alcuni valori, come P.I. sono delle costanti, quindi non possono subire delle modifiche all’interno del programma.
Quindi abbiamo detto che il soggetto (programmatore) interagisce col calcolatore attraverso l’uso di un linguaggio comprensibile all’esecutore stesso, un linguaggio macchina composto da sequenze di bit. Tuttavia per la programmazione si usano dei LINGUAGGI AD ALTO LIVELLO , quali il linguaggio C++ o il Basic. Questi linguaggi ad alto livello, utilizzano dei costrutti della lingua parlata inglese, che poi vengono convertiti in modo del tutto automatico da software che abbiamo identificato prima come compilatori e interpreti, in un linguaggio di basso livello comprensibile all’esecutore (linguaggio macchina). Con l’obbiettivo di rendere più efficiente, perché più rapido e semplice, lo sviluppo delle applicazioni informatiche, sono stati creati dei linguaggi di programmazione ad alto livello. Un programma è una successione di tali istruzioni (in molti linguaggi di programmazione queste istruzioni sono chiamate statement ), che mediante un opportuno programma di traduzione possono essere trasformate in istruzioni scritte in linguaggio macchina, che sono direttamente eseguibili dal calcolatore. Un programma è dunque un algoritmo scritto in modo da poter essere eseguito da un calcolatore.
RAPPRESENTAZIONE DEGLI ALGORITMI Gli algoritmi vengono rappresentati attraverso:
1)I blocchi vengono connessi tramite delle frecce che indicano la successione di esecuzione delle azioni. Due trapezi speculari rappresentano l’inizio e la fine di un diagramma di flusso e sono gli unici due blocchi ad essere collegati sempre con una sola freccia. Il rombo rappresenta le decisioni; la condizione da analizzare viene descritta all’interno della figura geometrica e da essa partono due freccie, una per ogni possibile risultato. Le azioni o le successioni di azioni, sono rappresentate dal rettangolo. Le azioni corrispondenti a problemi non elementari, sono indicate con un rettangolo con i lati raddoppiati.
In questo esempio, relativo al prodotto di 2 numeri in un calcolatore in cui l’operazione prodotto è assente. Alfa e Beta sono i 2 numeri da moltiplicare.
L’elaborazione dei dati viene effettuata attraverso l’esecuzione delle successioni di istruzioni che compone il corpo del programma. Nei linguaggi di programmazione si distinguono tre categorie di istruzioni:
**1. Istruzioni di ingresso /uscita
LE STRUTTURE DI CONTROLLO. Istruzioni condizionate SE (condizione) blocco istruzioni 1 Altrimenti blocco istruzioni 2 Ripetizione ciclica di istruzioni Finchè (condizione) blocco istruzioni.
Nella selezione semplice if-then, letteralmente tradotto dall’inglese: se-allora, si indica: se l’istruzione è vera, blocco istruzioni 1, se è falsa, allora procedi. Nella selezione a 2 vie (if-then-else) , letteralmente (se-allora-altrimenti), se l’istruzione è vera, allora blocco di istruzioni 1, altrimenti (else), fai il blocco di istruzioni 2. Altre strutture di controllo sono: WHILE-DO , (mentre-fai): mentre una condizione è vera, fai il blocco di istruzioni 1. CICLO FOR , ciclo ripetuto un numero n di volte, specificato nel linguaggio di programmazione. I linguaggi di programmazione di alto livello mettono a disposizione le cosiddette strutture iterative, o cicli (loop), la cui funzione è appunto di controllare la ripetizione di un blocco di istruzioni. Ogni linguaggio di programmazione dispone di particolari “ Keywords ”, parole chiave, che in questo caso sono: FOR – DO – WHILE – REPEAT. Tra linguaggio macchina e linguaggio ad alto livello si pone il linguaggio assembler. Una particolare sequenza di bit, per esempio quella deputata all’addizione, viene ‘’etichettata’’ con le lettere ADD. Quindi, io programmatore, produco una serie di istruzioni: ADD, TAB, LOAD, STORE, che poi vengono tradotte nelle corrispondenti sequenze di bit da un particolare traduttore, chiamato ASSEMBLATORE.
Ogni variabile è caratterizzata non solo dal nome e dal valore che assume, ma anche dal suo tipo. Alcuni tipi sono di uso cosi comune che i linguaggi di programmazione già prevedono la loro definizione (e perciò questi tipi sono detti predefiniti). Uno stesso operatore può assumere significati alternativi, a seconda della variabile cui è applicato. Il tipico operatore che viene sovraccaricato è il +: Applicato a variabili numeriche, ne somma i valori. Applicato a variabili di tipo stringa, ne giustappone i valori. Applicato a una variabile di tipo data e a una variabile numerica, aggiorna la data in funzione del numero di giorni specificato.
Si presentano però situazioni in cui la gestione dei dati basata solo su variabili singole è inadeguata o inefficiente. Per risolvere problemi di questo genere, i linguaggi di programmazione ad alto livello mettono a disposizione la possibilità di definire delle variabili strutturate, che consentono di riferirsi a più valori reciprocamente correlati. Ad esempio: I vettori (array) ogni vettore è caratterizzato da un nome e da un tipo, proprio come un valore predefinito, ma può contenere n elementi, ognuno dei quali viene identificato da un numero che varia tra 1 ed n. Quindi se il nome del vettore è vett , i suoi elementi sono identificati come: vett [1], vett [2] ecc. Le matrici sono array multidimensionali, i cui elementi sono identificati da più indici contemporaneamente, ognuno corrispondente a una dimensione della matrice. Ad esempio vett [1,5]. Il limite principale di vettori e matrici è che i loro elementi devono essere tutti dello stesso tipo. I linguaggi di programmazione più evoluti prevedono la possibilità di definire, a partire da quelli disponibili, dei nuovi tipi di dati (detti tipi definiti dall’utente, user-defined , o anche custom ). Queste strutture vengono definite record, e le loro componenti campi e permettono un ‘’accesso diretto’’ al contenuto del record.
Se la quantità dei dati da elaborare e archiviare è talmente grande da rendere l’accesso diretto di fatto inapplicabile perché inefficiente, si impiegano strumenti software specificamente dedicati alla gestione dei dati in forma tabellare, chiamati sistemi per la gestione di basi di dati ( database, DB ). Tra i modelli di organizzazione ed elaborazione dei dati in DB, si è diffuso particolarmente il modello relazionale. Un DB relazionale è costituito da un insieme di tabelle chiamate relazioni. Nella prima tabella, le righe ( record o tuple ), contengono i dati relativi ad ogni specifico studente, mentre le colonne ( campi ), definiscono le informazioni che è necessario memorizzare per ognuno degli studenti. Si definisce schema di una tabella l’insieme dei campi di cui è costituita. Un campo di una tabella può essere inteso come una variabile: ogni campo è perciò caratterizzato dal suo tipo, dunque dall’insieme dei valori possibili, che nella terminologia dei DB è chiamato dominio del campo.
sottoproblema, le si definisce una sola volta in un sottoprogramma, che viene quindi richiamato ove necessario nel programma principale. Un programma che include se stesso nella propria definizione si dice ricorsivo. In certi casi un programma ricorsivo può essere scritto in forma iterativa, dunque mediante una semplice struttura di controllo condizionale. È il caso della funzione matematica chiamata fattoriale, indicata con n!. Nella situazione di un problema in sotto-problemi, e quindi di un programma in sottoprogrammi, si presentano dunque dei problemi la cui unica soluzione efficiente è di tipo ricorsivo. Spesso, inoltre, le strutture di dati che meglio si adattano alla soluzione di un problema ben si prestano a essere gestite tramite procedure ricorsive, che quindi, in questi casi, sono molto utili per migliorare l’efficienza dei programmi.
La necessità di creare programmi sempre più complessi ha reso sempre più importante la necessità di rendere standard le procedure di realizzazione dei sottoprogrammi, in modo da renderli versatili e quindi utilizzabili in programmi diversi. La programmazione a oggetti deve il suo successo proprio all’efficienza con cui permette al programmatore di sviluppare software per sistemi complessi a partire da componenti esistenti. Un oggetto è tale in quanto dispone anche di un proprio comportamento, cioè di un modo di operare in risposta ad eventi ai quali è sensibile. E cosi i pulsanti sono sensibili per esempio all’evento “click del mouse”, per cui a ogni singolo pulsante può essere associato uno specifico programma, detto metodo di gestione dell’evento, che caratterizza appunto quell’aspetto del comportamento dell’oggetto relativo all’evento in questione. La programmazione a oggetti si fonda dunque sulla distinzione tra l’attività di creazioni di classi e l’attività di uso di classi esistenti, attraverso la generazione di loro istanze, cioè di oggetti.
Ad un’organizzazione lineare del supporto fisico, non corrisponde un’organizzazione dei contenuti altrettanto lineare. Ad esempio, le enciclopedie, non sono scritte in modo lineare, quindi per essere lette dalla prima all’ultima pagina, ma per essere consultate tramite rimandi successivi. Allo stesso modo, il file system di un calcolatore è gestito in modo analogo: le directory sono gli indici, mentre i file contengono i dati memorizzati sempre in forma sequenziale. Questa organizzazione ad albero delle directory, serve a rendere più semplici le operazioni di ricerca. Un IPERTESTO è un documento la cui struttura di consultazione non è lineare, ma molto più complicata. Ogni parte dell’intero documento (chiamata nodo ), contiene delle anchor point , punti di aggancio per delle relazioni ( link ), che rimandano ad altre parti di documento. Grande attenzione è stata dedicata poi al concetto di multimedialità, termine con cui si indica quell’insieme di tecnologie finalizzate alla gestione integrata di dati basata appunto su media differenti. I dati che si possono integrare in un documento multimediale comprendono almeno 5 categorie:
Un file in formato HTML contiene sia del testo, che deve essere visualizzato come tale, sia le istruzioni (dette markup o tag) per la formattazione e l’impaginazione del testo stesso e per l’inclusione di immagini e altri oggetti multimediali. Ogni tag HTML è identificato da un nome, che viene scritto tra parentesi angolari: . Tra i tag HTML più comuni, e indicano rispettivamente ‘’a capo’’ e ‘’a capo con salto di linea’’. Quindi, questoè un
esempio diventa: Questo È un
Esempio. Il tag consente di visualizzare un’immagine. I tag e servono per sottolineare il testo (underline) o scriverlo in corsivo (italic) e sono tag di formattazione.
Anch’esso basato su TAG, ma a differenza di HTML, che dispone di un insieme predefinito di tag, XML fornisce le specifiche formali per la definizione di nuovi tag.
Un calcolatore è un sistema composto da un numero elevato di componenti, ma il suo funzionamento può essere descritto semplicemente se lo si considera come un sistema strutturato in forma gerarchica, cioè come un insieme di elementi che interagiscono l’uno con l’altro, ognuno dei quali è a sua volta costituito di componenti più semplici, che possono ulteriormente scomposti, e cosi via, fino a raggiungere il livello di dettaglio richiesto. Le funzioni svolte da un calcolatore sono classificabili in 4 categorie:
Un calcolatore basato sull’architettura di Van Neumann segue un programma sulla base dei seguenti principi: Dati e istruzioni sono memorizzati in una memoria unica che permette sia la scrittura che la lettura I contenuti della memoria sono indirizzati in base alla loro posizione, indipendentemente dal tipo di dato o istruzione contenuto Le istruzioni vengono eseguite in modo sequenziale. Il linguaggio per cui la CPU si comporta da esecutore è detto linguaggio macchina. Le istruzioni scritte in linguaggio macchina sono piuttosto rudimentali. Ogni istruzione (per esempio somma, sottrazione, confronto) è identificata da un codice operativo. Ogni CPU è caratterizzata funzionalmente dal suo linguaggio macchina, cioè dall’insieme delle istruzioni che è in grado di eseguire e dalle modalità di rappresentazione degli operandi.
Nell’esecuzione di un programma, una volta che sia le istruzioni del programma che i dati di elaborazione sono residenti in memoria, la CPU può essere intesa come un dispositivo che opera in modo ciclico, ripetendo le seguenti tre fasi:
All’interno di un processore possiamo distinguere diverse parti:
L’unità di controllo coordina le operazioni di tutto il processore. Uno dei compiti principali dell’unità di controllo è di provvedere al prelievo dalla memoria (fetch) delle istruzioni da eseguire. Un’architettura semplice, in cui non possono essere effettuate operazioni aritmetiche-logiche su dati che non siano stati precedentemente caricati nei registri; è un’architettura chiamata load/store a indicare rispettivamente le operazioni di caricamento dei dati dalla memoria nei registri (load) e di archiviazione dei risultati dai registri nella memoria (store). Per completare il funzionamento del processore ed identificare gli elementi necessari alla sua realizzazione, è utile analizzare il processo di esecuzione di un’istruzione.
Un’istruzione aritmetico-logica, viene eseguita in 4 passi:
Si può descrivere in modo analogo anche la sequenza necessaria a completare un’esecuzione di un’istruzione di trasferimento di un dato dalla memoria a uno dei registri della CPU. In questo caso sono necessari 5 passi:
Il tempo di esecuzione di ogni istruzione è quindi stabilito dal numero di operazioni richieste. Molte delle operazioni che devono essere effettuate per completare l’esecuzione di un’istruzione non dipendono dall’istruzione stessa, ma sono uguali per tutte le istruzioni. In particolare i primi due passi dell’esecuzione sono sempre i seguenti:
Dopo questi due passi tutte le istruzioni, dopo aver letto i registri, usano l’ALU. Dopo aver utilizzato l’ALU le azioni richieste per completare le varie istruzioni si differenziano: un’istruzione aritmetico-logica deve accedere ai registri per scrivere il risultato dall’ALU; per un’istruzione di salto potrebbe essere necessario cambiare l’indirizzo dell’istruzione successiva sulla base dell’esito di confronto.
Per definire l’architettura complessiva del processore, partiamo dai componenti che servono per completare l’esecuzione delle diverse fasi di ciascuna istruzione. Innanzi tutto si consideri la fase di fetch, comune a tutte le categorie di istruzioni, che consiste nel prelievo dell’istruzione corrente e nel suo caricamento nell’IR. Oltre ai due registri coinvolti è necessario disporre di una memoria per le istruzioni e di un sommatore capace di incrementare il pc senza richiedere l’intervento dell’ALU. (Due memorie distinte una per i dati e una per le istruzioni). Prendiamo ora in esame le istruzioni aritmetico-logiche: leggono due registri, effettuano un’operazione che coinvolge l’ALU e quindi scrivono il risultato in un registro. Ogni lettura richiede un ingresso e un’uscita,