Fondamenti di informatica
Informatica
Scienza che studia l’elaborazione delle informazioni e le sue applicazioni; più precisamente l’informatica si occupa della rappresentazione, dell’organizzazione e del trattamento automatico delle informazioni, per mezzo di algoritmi e software.
Si occupa di due aspetti: tecnologico, ovvero lo studio dei calcolatori e dei sistemi che lo utilizzano, e metodologico, che studia i metodi per la soluzione di problemi e la gestione delle informazioni.
Informazione
Aggregato di uno o più dati (descrizioni elementari e non interpretate della realtà) ai quali si aggiunge un significato, ovvero vengono interpretati; utile per scambiare la conoscenza.
Rappresentazione
Modo in cui le differenti tipologie di informazioni vengono memorizzate nei calcolatori. A noi appaiono sotto molteplici aspetti (numeri, caratteri, suoni, programmi, ecc.), ma il calcolatore codifica tutti i tipi di informazione come sequenze di 1 e 0 (grazie al teorema del campionamento). Ciascuna delle due cifre costituisce un bit. La scelta del sistema binario è dovuta al fatto che distinguere solo tra due valori di impulso elettrico è più semplice: l’assenza di corrente sarà associata allo 0, la sua presenza all’1.
Organizzazione
Le informazioni sono aggregate in unità complesse che l’elaboratore considera come entità atomiche, che utilizza per organizzare le informazioni in entità via via più complesse per modellare la realtà che vuole simulare. A livelli superiori di organizzazione delle informazioni troviamo, nell’ordine, i file e i DBMS (Data Base Management System).
Trattamento automatico
È responsabile effettivo del ruolo dell’informatica, ovvero del problem solving. Dopo aver raccolto le informazioni strettamente necessarie a modellizzare un problema, è necessario tradurle in un linguaggio di programmazione “comprensibile” da un computer, il quale, seguendo automaticamente (senza l’intervento diretto dell’uomo) una determinata sequenza di passi (algoritmo), giunge alla soluzione del problema.
Algoritmo
Sequenza di passi (step) mediante i quali da informazioni di ingresso si giunge a informazioni di uscita. Deve avere le seguenti caratteristiche:
- Atomicità: i passi devono essere elementari, ovvero non scomponibili in ulteriori sottopassi.
- Non ambiguità: i passi costituenti devono essere interpretabili in modo univoco dall’esecutore.
- Finitezza: l’algoritmo deve essere composto da un numero finito di passi e richiedere una quantità finita di dati di ingresso.
- Terminazione: l’esecuzione deve avere termine in un tempo finito.
- Effettività: l’esecuzione deve portare a un risultato univoco.
Viene schematizzato formalmente da un diagramma di flusso, il quale rappresenta graficamente le sei tipologie di istruzioni fondamentali più una di “inizio” che il linguaggio di programmazione imperativo (come MatLab) è in grado di dare:
- Assegna: assegna ad una variabile (una locazione di memoria) il valore di un’espressione.
- Inizia: il programma inizia l’esecuzione.
- Fermati: termina l’esecuzione del programma.
- Leggi: legge in input dall’esterno un valore e lo memorizza in una variabile (locazione di memoria).
- Scrivi: scrive in output il valore di un’espressione o di una variabile (locazione di memoria).
- Se… allora… altrimenti…: modifica il “flusso” del programma sulla base del valore di un’espressione logica.
- Vai al passo…: modifica il “flusso” del programma incondizionatamente.
Elaboratore
Elaboratore: o calcolatore o più comunemente computer; strumento programmabile per rappresentare, memorizzare ed elaborare informazioni.
Hardware
Insieme dei componenti fisici che costituiscono l’elaboratore: la memoria (HDD, SSD, RAM, ecc.), la logica di calcolo (processore, scheda grafica, ecc.), periferiche in ingresso (mouse, tastiera, ecc.) e in uscita (stampanti, monitor, ecc.).
Software (applicativo)
Programmi che permettono all’hardware di svolgere compiti utili.
Sistema operativo (OS)
“Software di base” che fa da tramite tra l’hardware e il software applicativo. Caratterizzato da: Multitasking (eseguire più processi in parallelo), Multi Threading (eseguire più sottoprocessi contemporaneamente), interfacce potenti, possibilità di essere utilizzati su dispositivi miniaturizzati (es. DSP, microcontrollori, Arduino).
Interfaccia utente
Interfaccia che permette l’interazione tra uomo e sistema operativo. Esempi: GUI (Graphical User Interface, interfaccia a finestre); DOS (interfaccia a caratteri, riga di comando); Z/OS (interfaccia a caratteri, riga di comando).
Architettura di Von Neumann e funzionamento dell’elaboratore
Il software viene scritto per automatizzare gli algoritmi ed è costituito da una sequenza di istruzioni che vengono dati alla macchina, ovvero all’hardware, il quale ha una specifica architettura.
Architettura di un sistema informatico: descrive come interagiscono hardware e il software.
Architettura di Von Neumann: l’input (tastiera, mouse, pennetta usb, ecc.) arriva alla memoria (RAM), la quale comunica con l’unità centrale di elaborazione o processore (CPU) che poi rilascia l’output (monitor, file, ecc.).
Input
Dati in ingresso che arrivano dalle periferiche come la tastiera, il mouse, il microfono, il touchscreen, i sensori ecc. Un tempo gli input erano le schede perforate: cartoncini con dei fori che, in base alla loro disposizione, rappresentavano appunto i bit e dunque i dati di ingresso.
Memoria centrale (RAM = Random Access Memory)
Memorizza dati e istruzioni dei programmi in esecuzione. È formata da un insieme di celle (locazioni) di memoria che contengono uno o più byte, ciascuna delle quali ha uno specifico indirizzo nel range [0, 1, …, M-1] (con M la dimensione della memoria). È una memoria volatile, ovvero perde i dati in mancanza di alimentazione: questo permette una maggiore velocità ma porta a una capacità limitata e a un maggior costo. È detta ad accesso casuale (random access) perché il tempo di accesso ad un dato è uguale per tutti i bit presenti nella RAM indipendentemente dal loro posizionamento. Ha una struttura gerarchica.
Processore (CPU = Central Processing Unit)
Effettua fisicamente elaborazioni algebriche e logiche. Si divide in unità di controllo (coordina il flusso di dati con gli altri componenti del computer, legge ed esegue le istruzioni nella memoria centrale) e unità di logica-aritmetica (preposta all'esecuzione di operazioni aritmetiche o logiche). La CPU comunica con la memoria RAM, dalla quale riceve gli algoritmi da eseguire: il processore legge/scrive il contenuto delle celle, utilizzando gli specifici indirizzi per individuarle. L’esecuzione è costituita da tre passi:
- Fetch: prelievo di un’operazione dalla RAM.
- Decode: decodifica un’istruzione.
- Execute: esecuzione dell’istruzione.
Ogni CPU è caratterizzata da un suo insieme di istruzioni (linguaggio macchina) che il programmatore può utilizzare per scrivere un programma e fare in modo che questo venga “letto” dal processore.
Output
Dati di uscita che giungono al display, agli altoparlanti, agli attuatori, ecc. sono il risultato dell’esecuzione dell’algoritmo da parte del processore.
Memoria di massa o secondaria (Hard Disk HDD)
Fornisce una grande capacità di memoria rispetto alla RAM, ma è enormemente più lenta, anche se a stato solido (SSD). È una memoria non volatile, ovvero conserva i dati anche in mancanza di alimentazione: questo permette la sua grande capacità e un minor costo ma porta a una trasmissione dei dati più lenta.
Codifica e decodifica delle informazioni
8 bit costituiscono un byte. Il computer è “unimediale” ovvero comprende solo numeri, perciò per permettere di trattare informazioni differenti e più complesse si utilizza la codifica stratificata su più livelli: ad esempio il codice ASCII associa ad ogni numero un carattere, oppure un numero può essere interpretato come piccolissima parte di un suono, oppure indicare un colore, ecc.
In questo modo, però, uno stesso numero può essere interpretato in maniere differenti ed è perciò compito del software e dell’hardware individuare l’interpretazione corretta. Per esempio, per leggere un file il software sceglie il criterio di interpretazione che gli viene indicato dall’estensione del file (.jpg, ad esempio, indica che le sequenze di numeri rappresentano la disposizione e il colore di punti luminosi, quali i pixel); oppure una distinzione a livello hardware avviene quando una sequenza di numeri viene inviata alla scheda video che quindi li interpreta come disposizione e colore di punti luminosi.
Strutture dati
Permettono di organizzare i bit in maniera tale da rappresentare i dati desiderati e contribuiscono alla corretta interpretazione delle informazioni. Livelli di astrazione: sono il risultato dei diversi strati di codifica e permettono al computer di avere un “linguaggio” sempre più vicino al nostro. Noi, infatti, non abbiamo una visione a basso livello di un computer, costituito dal linguaggio macchina (ovvero sequenze di bit), ma ad alto livello, che consiste nella possibilità di rappresentare funzioni matematiche, elaborare testi, riprodurre contenuti audiovisivi (operazioni ad alto livello).
Memoria ad alto livello
L’organizzazione dei file avviene mediante cartelle, denominazione dei file, ecc. questo grazie agli strati gerarchici del software (layers).
Linguaggi di programmazione
Linguaggi di programmazione: permettono di tradurre l’algoritmo in una sequenza di istruzioni che lo renderanno eseguibile automaticamente su una macchina. Sono di diversi tipi:
- Prima generazione (I): linguaggi macchina. Sequenze di istruzioni binarie eseguibili direttamente dalla CPU.
- Seconda generazione (II): linguaggio assembly. Istruzioni in corrispondenza diretta con le istruzioni binarie ma espresse in formato simbolico. Aggiunge un livello di astrazione.
- Terza generazione (III): linguaggio di alto livello (C; C++; Fortran; Basic). È machine independent cioè non è legato al tipo di hardware e sistema operativo. Aggiungono un livello di astrazione.
- Quarta generazione (IV): linguaggio di alto livello (Java; Matlab). Aggiungono un livello di astrazione.
Tutti i linguaggi di programmazione vengono sempre tradotti in linguaggio macchina per essere poi eseguiti. Ogni linguaggio di programmazione ha un proprio alfabeto, una propria grammatica (vocabolario: keywords e variables), una propria sintassi (sequenze), e una propria semantica (significato).
La realizzazione di un programma
Un processo che include cinque fasi:
- Codice sorgente: stesura e progettazione del programma in un determinato linguaggio di programmazione.
- Compilazione: il linguaggio ad alto livello viene trasformato in linguaggio macchina.
- Link: nel caso di programmi complessi e divisi in moduli, questi vanno collegati tra loro mediante un linker.
- Load: il programma viene caricato sulla RAM.
- Execute: la CPU esegue il programma e invia l’output al dispositivo di destinazione.
Linguaggio Matlab
Commento: precede una nota o commento (Matlab ignora tutto ciò che viene scritto dopo il simbolo percentuale).
Assegnazione di un valore: nome_variabile = espressione. Il simbolo “=” è l’operatore di assegnazione, che non va confuso col simbolo algebrico: la variabile deve essere esplicita (es. NO 2*y = 3*x; SÌ y = 3x/2); z = z+1 ha senso e indica che la nuova variabile z sarà data dal valore che aveva prima + 1.
Nome della variabile
Deve essere sempre alla sinistra e l’espressione sulla destra; può essere una combinazione di lettere maiuscole e minuscole, di numeri e dei caratteri speciali “_” e “$” (lo spazio non è permesso); deve iniziare con una lettera dell’alfabeto; le keywords non possono essere usate come nomi di variabili; MYNUM, mynum e Mynum sono variabili differenti (MatLab è “case sensitive”).
Alcuni nomi di variabili sono riservati (pi) ma possono essere sovrascritti (il che può portare ad errori).
Non fa l’eco nell’assegnazione della variabile; indica la lunghezza massima che può avere il nome di una variabile.
Comandi utili in MatLab
- who: elenca tutte le variabili presenti nel workspace.
- whos: elenca tutte le variabili presenti nel workspace, specificando il loro ordine (in quanto MatLab le considera come matrici: per gli scalari è 1×1), i byte che occupa e il tipo di variabile.
- clear: cancella tutte le variabili presenti nel workspace.
- clear variablename1 variablename2: cancella le variabili specificate.
Script
Sequenza di comandi salvata come un file con estensione “.m” e può essere usato come un comando predefinito di Matlab, chiamandolo da linea di comando. Questo permette un alleggerimento della programmazione.
Tipo di dati
Un linguaggio di programmazione tratta i dati memorizzati in una variabile come appartenenti ad una determinata categoria (es. numeri interi, numeri reali, carattere alfabetico, ecc.), detta tipo, che (il linguaggio) utilizza per “capire” che valori può assumere (la variabile) e che operazioni possono essere fatte su di essa.
Le variabili dunque possono essere tipizzate o non tipizzate. Le variabili tipizzate possono assumere valori solo di quel tipo che gli è stato assegnato, al contrario le non tipizzate non hanno questa limitazione. I compilatori possono essere a tipizzazione forte, e quindi reagire ad un uso improprio di una variabile di un certo tipo e dare errore, oppure a tipizzazione debole (come MatLab), e quindi ridefinire il tipo della variabile a seconda del tipo implicitamente utilizzato.
La tipizzazione forte permette, ad esempio, di evitare operazioni che sono logicamente prive di senso, come la somma tra valori dimensionalmente diversi (es. secondi + metri) e quindi garantire la congruenza tra le unità di misura; d’altra parte però comporta un aumento dell’utilizzo della memoria. Se non si tipizza una variabile, MatLab le assegna automaticamente il tipo double (ovvero lo classifica come numero reale a doppia precisione).
Caratteri
Sono ordinati secondo la codifica ASCII (American Standard Code for Information Interchange). In questo modo la variabile x è A ed è di tipo character (carattere).
x = ‘A’: in questo modo y è l’equivalente numerico di A nella codifica ASCII.
y = double(‘A’)
Dati numerici
Possono essere tipizzati come interi o reali.
Interi
Per tipizzare un numero come intero si utilizzano appositi comandi dipendentemente dal numero di cifre e quindi dal numero di byte necessari per memorizzarli.
- a = int8(a): in questo modo a è tipizzato come intero a 8 bit. Per numeri interi da -27 a 27-1.
- a = int16(a): in questo modo a è tipizzato come intero a 16 bit. Per numeri interi da -215 a 215-1.
- a = int32(a): in questo modo a è tipizzato come intero a 32 bit. Per numeri interi da -231 a 231-1.
- a = int64(a): in questo modo a è tipizzato come intero a 64 bit. Per numeri interi da -263 a 263-1.
- a = uint8(a): in questo modo a è tipizzato come intero a 8 bit. Per numeri interi da 0 a 28-1.
- a = uint16(a): in questo modo a è tipizzato come intero a 16 bit.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Fondamenti cpp
-
Fondamenti di informatica
-
Appunti Fondamenti di informatica
-
Fondamenti di informatica