



































































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
Dispensa per l'esame di Informatica Generale, corso Comunicazione e società 2009/2010
Tipologia: Dispense
1 / 75
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!




































































Prof. Gianfranco Prini CES – 2° anno
Alfabeto : un insieme finito di oggetti (detti simboli). Stringa (su un alfabeto A dato): una sequenza ordinata e finita di simboli di A. o Lo stesso simbolo può occorrere (ingl. to occur , occurrence ) più volte in una stringa. o Esiste una stringa particolare, detta stringa vuota (una sequenza di zero simboli), normalmente indicata con la lettera greca "lambda". I simboli sono stati introdotti nella cultura umana per rappresentare "qualcosa". Ricerchina : trovare uno o più siti in cui si parli di:
Prof. Gianfranco Prini CES – 2° anno Gli alfabeti in informatica vengono utilizzati per rappresentare informazioni né più né meno come fanno gli alfabeti su cui sono costruite le lingue naturali. Differenza principale essendo che il modo di comporre le stringhe è assai meglio precisato :
Prof. Gianfranco Prini CES – 2° anno
Domanda : quante sono le stringhe binarie (i.e. composte di soli simboli dell'alfabeto delle cifre binarie) di lunghezza 3? Proviamo a elencarle: 000, 100, 010, 001, 111, 011, 101, 110 Visto che le cifre ottali sono in numero di 8, esiste ovviamente una corrispondenza biunivoca tra stringhe binarie di lunghezza 3 e cifre binarie. Anzi, ne esistono molte: Esempio 1: 000-0, 100-1, 010-2, 001-3, 111-4, 011-5, 101-6, 110- Esempio 2: 000-0, 001-1, 010-2, 011-3, 100-4, 101-5, 110-6, 111- Chiameremo canonica la corrispondenza dell'esempio 2. Domanda : esiste una corrispondenza simile per l'alfabeto esadecimale? Proviamo a elencare tutte le stringhe binarie di lunghezza 4. Esempio 1: 0000, 1000, 0100, 0010, 1110, 0110, 1010, 1100, 0001, 1001, 0101, 0011, 1111, 0111, 1011, 1101 Esempio 2: 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 Chiameremo canonica la elencazione di cui all'esempio 2, che dà luogo alla corrispondenza canonica: 0000-0, 0001-1, 0010-2, 0011-3, 0100-4, 0101-5, 0110-6, 0111-7, 1000-8, 1001-9, 1010- A, 1011-B, 1100-C, 1101-D, 1110-E, 1111-F Abbiamo detto che in informatica (nel senso hardware del termine) si fa un largo (quasi esclusivo) uso di componenti bistato , per rappresentarne lo stato dei quali utilizziamo cifre binarie. Ipotizzando di avere una catena p.es. di 8 elementi bistato, lo stato complessivo della catena si può rappresentare con una stringa di otto cifre binarie 0/1. Esempio: in piedi, seduto, in piedi, in piedi, seduto, seduto, seduto, in piedi Se decidiamo di rappresentare con 0 lo stato "seduto" e con 1 lo stato "in piedi", quanto sopra può essere rappresentato con la stringa 10110001.
Prof. Gianfranco Prini CES – 2° anno Problema: quando le stringhe diventano troppo lunghe, l'occhio si confonde. Esempio: in 01110011010100100001110000111010 è difficile cogliere al volo il valore della 17-esima posizione. Per rendere più facilmente manipolabili queste lunghe sequenze, le si spezzettano in parti di lunghezza uguale (p.es. di lunghezza 4) e si rappresentano i singoli frammenti non mediante cifre binarie, ma con i simboli di un alfabeto più ricco (p.es quello delle cifre esadecimali) utilizzando una corrispondenza biunivoca (p.es. quella canonica) tra i due. 0111 0011 0101 0010 0001 1100 0011 1010 7 3 5 2 1 C 3 A Quindi la stringa 01110011010100100001110000111010 può essere compattamente rappresentata dalla stringa esadecimale 73521C3A. Domanda : perché mai abbiamo parlato di alfabeti di cifre ottali ed esadecimali e non p.es. di alfabeti tetrali (di 4 simboli) o trentaduali (di 32 simboli) o altro ancora? La ragione è puramente storica : in informatica si sono affermate "architetture di sistema" (hardware) in cui venivano privilegiate sequenze di componenti bistato di lunghezza pari dapprima a multipli di 6 (p.es. 12, 18, 24, 36), e poi a multipli di 8 (p.es. 8, 16, 32). Terminologicamente, le sequenze di componenti di lunghezza 6 oppure 8 vennero chiamate byte (mentre i singoli componenti vennero chiamati bit ). Divenne naturale rappresentare le sequenze di bit di un byte-di-6-bit con due cifre ottali e le sequenze di bit di un byte-di-8-bit con due cifre esadecimali. Esempio 1: in una macchina "a 12 bit" (come si dice in gergo per indicare una macchina che privilegia le sequenze di 12 bit) la sequenza 001100101110 viene considerata come composta di due byte (di 6 bit ciascuno) 001100 e 101110 i quali sono rappresentabili in notazione ottale come 14 e 56 dando luogo alla rappresentazione complessiva 1456 per l'intera stringa. Esempio 2: in una macchina "a 16 bit" (come si dice in gergo) la sequenza 0011001011100011 viene considerata come composta di due byte (di 8 bit ciascuno) 00110010 e 11100011 i quali sono rappresentabili in notazione esadecimale come 32 e E3 dando luogo alla rappresentazione complessiva 32E3 per l'intera stringa. Nel passaggio da architetture prevalentemente "a 6N bit" ad architetture prevalentemente "a 8N bit" non si è passati subito da notazione ottale a notazione esadecimale, ma per lungo tempo si utilizzò la notazione ottale (e talora si usa ancora oggi) per rappresentare anche le sequenze di lunghezza 8*N. A tal fine, per le architetture le cui sequenze non fossero di lunghezza divisibile sia per 6 che per 8, si "penalizzarono" le cifre all'inizio della sequenza, tollerando in tale posizione sequenze binarie più corte di 3.
Prof. Gianfranco Prini CES – 2° anno
Nelle tabelle che si trovano in Wikipedia (http://en.wikipedia.org) alla voce "ASCII" si parla di glifi. Un glifo è una delle (tante) possibili maniere di "scrivere" un carattere (p.es. in una font piuttosto che in un'altra, in un certo corpo tipografico piuttosto che in un altro, etc.). Il concetto di carattere in quanto tale (p.es. "la lettera A") prescinde dal fatto che esso possa essere rappresentato da un glifo piuttosto che da un altro: trattasi di "una astrazione di livello superiore" rispetto a quella che definisce il concetto di glifo. La versione di ASCII vista finora si chiama anche (in gergo) ASCII-7 o ASCII a 7 bit. L'alfabeto latino rappresentato in ASCII-7 è privo di diacritici (p.es. accenti gravi e acuti, umlaut, cedille, etc.). Lo standard ISO/IEC 8859 (vedere la corrispondente voce di Wikipedia), detto gergalmente (e assai impropriamente) ASCII-8, o ASCII a 8 bit , affronta sia il problema dei diacritici, sia quello della codifica di alcuni alfabeti non latini (p.es. greco, cirillico, etc.). Lo standard Unicode (vedere, oltre alla voce "Unicode" di Wikipedia, il sito "ufficiale" http://www.unicode.org) introduce una codifica unica e universale (potenzialmente) per tutti gli alfabeti usati nel mondo, nel presente e nel passato. Unicode utilizza per i caratteri una codifica a 16 bit (con estensioni che per ora non approfondiremo). Per molti caratteri Unicode, oltre alla codifica a 16 bit, viene fornito un nome "ufficiale": p.es. nella tabella che riporta la codifica dell'alfabeto latino (http://www.unicode.org/charts/PDF/U0000.pdf), al carattere di codice Unicode 0041 viene assegnato il nome "LATIN CAPITAL LETTER A". Un carattere dotato di un diacritico ammette in Unicode sia una codifica monolitica (p.es. "LATIN CAPITAL LETTER A WITH ACUTE", codice Unicode 00C1), sia una codifica data dalla giustapposizione di due codici distinti: un codice per rappresentare il carattere (p.es. "LATIN CAPITAL LETTER A", codice Unicode 0041) accompagnato da un secondo codice per rappresentare il relativo diacritico (p.es. "ACUTE ACCENT", codice Unicode 00B4). Un carattere con diacritico, anche se rappresentato (in modalità non monolitica) con due distinti codici, deve essere sempre e comunque visualizzato mediante un glifo unico "diacriticizzato" (p.es. come lettera "A" accentata) e non mediante due glifi distinti. Analogamente, un carattere con diacritico rappresentato in modalità non monolitica deve essere trattato come se fosse un carattere unico "diacriticizzato" (rappresentato monoliticamente) ai fini p.es. della disposizione in ordine lessicografico (o alfabetico) dei termini di una lingua (p.es. la "LATIN CAPITAL LETTER A WITH RING ABOVE", codice Unicode 00C5, presente in alcune lingue scandinave, è considerata come una lettera
Prof. Gianfranco Prini CES – 2° anno diversa dalla "LATIN CAPITAL LETTER A", e segue la "LATIN CAPITAL LETTER Z" nell'ordine alfabetico di quelle lingue; anche se rappresentata non monoliticamente dal codice Unicode 0041 della "LATIN CAPITAL LETTER A" seguito dal codice Unicode 02DA del "RING ABOVE", essa deve comunque essere considerata come il carattere monolitico "LATIN CAPITAL LETTER A WITH RING ABOVE" che segue la "LATIN CAPITAL LETTER Z" ai fini dell'ordinamento lessicografico). Nelle tabelle che definiscono la codifica Unicode, i glifi che definiscono l'aspetto grafico dei diacritici vengono visualizzati unitamente alla posizione che essi devono occupare rispetto alla (meglio: al glifo della) lettera di cui essi costituiscono diacritico (vedasi p.es. la colonna di codice 065 in http://www.unicode.org/charts/PDF/U0600.pdf).
Prof. Gianfranco Prini CES – 2° anno Esempio : T = { 0 , 1 }, N = { S }, simbolo iniziale S e produzioni: S => 0 S => 1 S => 0S S => 1S Il linguaggio generato da una grammatica è l'insieme delle stringhe composte di soli caratteri terminali (i.e. stringhe di T) ottenibili, a partire dal simbolo iniziale, mediante un processo di trascrizione successiva di simboli non terminali secondo quanto specificato dalle produzioni : un simbolo non terminale che si trova alla sinistra della freccia di una produzione viene trascritto con la corrispondente stringa che si trova alla destra della freccia nella medesima produzione. [Nota: quelli così definiti si chiamano più propriamente linguaggi liberi da contesto , o context-free .] Esempio : continuando l'esempio precedente, le seguenti sono derivazioni valide (di stringhe appartenenti al linguaggio generato dalla grammatica data): S --> 1 S --> 0S --> 00S --> 001S --> 0010 Esercizio : convincersi che la grammatica dell'esempio precedente genera il linguaggio costituito di tutte e sole le stringhe binarie di lunghezza non nulla, cercando di dare una dimostrazione di questo fatto. In particolare, esso è un sottoinsieme proprio di T, non contenendo esso la stringa vuota. Esempio : T = { ( , ) }, ossia T è l'alfabeto composto dei soli due simboli "parentesi tonda aperta" e "parentesi tonda chiusa", N = { S }, simbolo iniziale S e produzioni: S => () S => SS S => (S) Le seguenti sono derivazioni valide: S --> () S--> (S) --> ((S)) --> ((())) S --> SS --> (S)SS --> (())(S)() --> (())(())()
Prof. Gianfranco Prini CES – 2° anno Esercizio : convincersi che il linguaggio generato da questa grammatica è l'insieme di tutte e sole le stringhe di parentesi aperte e chiuse che "bilanciano" nel senso delle espressioni algebriche (per cui p.es. la stringa "(()))(" non è parte del linguaggio, in quanto p.es. il suo quinto carattere è una "parentesi tonda chiusa", la quale non "chiude" alcuna parentesi aperta che la precede -- convincersi che detta stringa non è generabile dalla grammatica data). Cercare di fornire una dimostrazione di questo fatto. Esercizio : dato T = { 0 , 1 } si definisca una grammatica che sia in grado di generare il linguaggio su T costituito di tutte e sole le stringhe (binarie) di lunghezza non nulla che contengano un numero pari (eventualmente nullo) di occorrenze del simbolo "1".
Prof. Gianfranco Prini CES – 2° anno
Prof. Gianfranco Prini CES – 2° anno
Che cosa intendiamo dire quando scriviamo: 27+31=58? Per numerale si intende una "scrittura" (ossia una stringa in un linguaggio dato) atta a rappresentare un numero. Quello di numerale è un concetto puramente sintattico. Quello di numero è invece semantico. [Sintassi e semantica sono due delle tre caratteristiche importanti di un linguaggio secondo Wittgenstein. La terza è la pragmatica, ossia la disciplina che studia il linguaggi in relazione ai loro utenti .] Sintassi e semantica vengono discusse in relazione a ciò che scriviamo (in un particolare linguaggio) e alla maniera di mettere in relazione le due cose. Che cosa intendiamo per "27"? Quando scriviamo "27" intendiamo parlare di due decine e di sette unità , dove i concetti di decina e di unità sono due concetti "astratti" (nel senso latino- anglosassone del termine) così come i concetti di due e di sette, dove il concetto di due viene espresso mediante la cifra/numerale "2" e quello di sette mediante la cifra/numerale "7". Ma il concetto di decina e di unità dove sta esplicitamente scritto nella stringa "27"? Non sta esplicitamente scritto da nessuna parte, ma sta implicitamente scritto nella posizione delle cifre (quella più a destra rappresenta la quantità di unità, quella immediatamente alla sinistra rappresenta la quantità di decine, quella ancora più a sinistra la quantità di centinaia, etc.). Per questo motivo la notazione si chiama posizionale in quanto è la posizione che dà un significato o peso alle cifre. *Curiosità : un tempo e in alcune culture il significato delle cifre veniva espresso in altro modo , p.es.: in maniera esplicita (come si faceva talora nei libri contabili del medioevo europeo): 2 d e 7 u ; oppure in maniera implicita utilizzando simboli diversi per le varie posizioni (vd. p.es. i Greci). *Leggenda metropolitana : “le notazioni posizionali sono state inventate dagli arabi”.
Prof. Gianfranco Prini CES – 2° anno
Torniamo all'esempio di ieri: 27 + 31 = 58. In questa espressione "27" è un numerale (concetto sintattico) che rappresenta il numero ventisette (concetto semantico) in cui usa una notazione posizionale in base 10. Ossia, si fa uso di dieci cifre incluso lo "0" (che rappresenta il numero zero , entità astratta che può essere vista come la quantità di elementi presenti nell'insieme vuoto ), e si attribuisce a ogni cifra un peso diverso in funzione della sua posizione. I pesi rappresentano (a partire dalla cifra di destra) unità, decine, centinaia, migliaia, etc. In altre parole detto X il peso di una cifra, il peso della cifra alla sua immediata sinistra è 10X. Quindi, nell'esempio, il peso della cifra "7" all'estrema destra è uno, mentre quello della cifra "2" è dieci. In un esempio maggiormento complesso, il numerale: "3268071" rappresenta il numero: 310^6 + 210^5 + 610^4 + 810^3 + 010^2 + 710^1 + 110^ In quanto sopra, si abusa leggermente del linguaggio, perché in realtà utilizziamo cifre per discutere di numeri: sarebbe stato più appropriato scrivere: tre moltiplicato dieci alla sesta, più due moltiplicato dieci alla quinta, etc. Domanda : questa tecnica funziona solo per la base 10? Neanche per sogno: funziona per qualunque base. Esempio: se noi considerassimo l'alfabeto delle cifre ottali, il numerale: "673201" rappresenterebbe il numero (ipotizzando di attribuire alle cifre ottali il valore canonico che si evince dalla sequenza canonica , nella quale alla cifra "0" corrisponde il valore zero, alla cifra "1" corrisponde il valore uno, etc.): sei per otto alla quinta, più sette per otto alla quarta, più sei per otto alla terza, etc. oppure con abuso di linguaggio, in notazione decimale , scriveremmo come: 68^5 + 78^4 + 38^3 + 28^2 + 08^1 + 18^
Prof. Gianfranco Prini CES – 2° anno Esempio : utilizzando invece l'alfabeto esadecimale, il numerale: "ABCDEF" rappresenta (ipotizzando la corrispondenza canonica tra numeri e cifre esadecimali ordinate secondo la sequenza canonica) il numero che, in notazione decimale , scriveremmo come: 1016^5 + 1116^4 + 1216^3 + 1316^2 + 1416^1 + 1516^ Esempio : utilizzando invece l'alfabeto binario, il numerale (sempre ipotizzando che i numeri zero e uno siano in corrispondenza canonica con le cifre "0" e "1", per cui il numero zero viene associato alla cifra "0" e il numero uno viene associato alla cifra "1" - ma sarebbe perfettamente lecita la convenzione opposta -): "110010" rappresenta invece: 12^5 + 12^4 + 02^3 + 02^2 + 12^1 * 02^ che altro non è che il numero che in notazione decimale esprimeremmo con il numerale "50". Terminologicamente , gli informatici esprimono sinteticamente quanto sopra scrivendo: 1100102 = 50 10 che si "dovrebbe" leggere: il numerale binario "110010" rappresenta lo stesso numero del numerale decimale "50". Esercizio : con riferimento a esempi precedenti, completare le seguenti uguaglianze: 6732018 = ...... 10 ABCDEF 16 = ...... 10 326807110 = ...... 10 D'ora in poi assumeremo implicitamente che tutte le corrispondenze tra cifre e numeri rispettino le sequenze canoniche laddove esistono.
Prof. Gianfranco Prini CES – 2° anno Esiste un metodo rapido per passare da una base che sia una potenza di due (p.es. base otto e base sedici) a base due e viceversa. La sequenza canonica che associa: alle cifre ottali gruppetti di tre cifre binarie, alle cifre esadecimali gruppetti di quattro cifre binarie ci viene in aiuto: dato un numerale in notazione ottale [risp. esadecimale] basta sostituire ciascuna cifra ottale [risp. esadecimale] con la corrispondente stringa di tre [risp. quattro] cifre binarie. La sequenza canonica che associa a cifre ottali [risp. esadecimali] stringhe di tre [risp. quattro] cifre binarie è coerente con l'aritmetica delle notazioni posizionali: 016 = 0000 2 116 = 0001 2 ... F 16 = 1111 2 Giustificazione di questo fatto ("convinsor", e non una dimostrazione vera e propria): 658 = 68^1 + 58^0 = cinquantatre = (^5310) = x2^5 + y2^4 + z2^3 + t2^2 + u2^1 + v2^0 = = 12^5 + 12^4 + 02^3 + 12^2 + 02^1 + 12^0 = = 1101012 {notare che 1102 = 68 e 1012 = 58 nella sequenza canonica} = (12^5 + 12^4 + 02^3) + (12^2 + 02^1 + 12^0) = = (12^2 + 12^1 + 02^0 ) * 2^3 + (12^2 + 02^1 + 12^0)* 2^0 = = (12^2 + 12^1 + 02^0)8^1 + (12^2 + 02^1 + 12^0)8^0 = = 68^1 + 58^0 = 65 8
Prof. Gianfranco Prini CES – 2° anno Esercizio : completare le seguenti uguaglianze sfruttando il trucco delle sequenze canoniche: 1372658 = 4A67FE852 16 = 4A67FE852 16 = 4A67FE852 16 = L'articolo di Leibniz di cui alla lezione di ieri discute in maniera leggermente più formale quanto sopra detto. Approfondimento : andarsi a cercare online quell' articolo di Leibniz e leggerselo; andarsi a cercare chi era il gesuita Bouvet e che cosa riguardasse la sua corrispondenza con Leibniz a proposito del libro I-Ching (quello dei trigrammi e degli esagrammi).