Informatica: introduzione alla programmazione
L'informatica (Computer Science) è la scienza che si occupa dello studio della rappresentazione e manipolazione dell'informazione. Un computer è una macchina che immagazzina dati, interagisce con dispositivi ed esegue programmi. I programmi descrivono a un computer la sequenza di passi che devono essere eseguiti per portare a compimento un'attività o risolvere un problema.
Componenti di un computer
In un computer, distinguiamo i componenti hardware, la parte fisica di un calcolatore e i suoi dispositivi periferici, da quelli software, costituiti dai programmi che vengono eseguiti dall'hardware e da dati, le informazioni su cui lavorano i programmi. Microsoft Word, i giochi elettronici, i sistemi operativi e i driver dei dispositivi sono tutti software.
Il software è una sequenza di istruzioni e decisioni implementati in qualche linguaggio e tradotta in forma che possa essere eseguita nel computer. Il software gestisce i dati utilizzati nelle varie istruzioni. Un programma per computer indica al computer la sequenza di passi necessaria a completare un determinato compito. I computer possono eseguire un ampio spettro di compiti perché possono eseguire diversi programmi. Le istruzioni di un programma ed i relativi dati (come testi, numeri, audio o video) sono memorizzati in formato digitale. La programmazione è l'arte di progettare e realizzare programmi per i computer.
La CPU e la memoria
La CPU è l'unità centrale di elaborazione ed è costituita da centinaia di milioni di elementi strutturali, detti transistor. La CPU esegue le istruzioni (istruzioni macchina) di controllo del programma una per volta e ne elabora i dati, cioè: individua ed esegue le istruzioni del programma; effettua le operazioni aritmetiche, reperisce dati dalla memoria esterna o dai dispositivi periferici, oppure ve li memorizza.
Per eseguire un programma, questo deve essere portato in memoria, dove la CPU lo possa leggere. Esistono due tipi di memoria:
- Memoria principale (o primaria o interna o RAM) è costituita da chip di memoria, circuiti elettronici che, quando alimentati da energia elettrica, sono in grado di memorizzare dati; è volatile.
- Memoria secondaria, che generalmente è un disco rigido (hard disk), consente una registrazione dei dati più lenta ma meno costosa, che perdura anche in assenza di alimentazione elettrica. Un disco rigido è formato da piatti rotanti, rivestiti da materiale magnetico, e da testine di lettura/scrittura, in grado di leggere e di modificare il flusso magnetico sui piatti.
Un computer memorizza dati e programmi. Entrambi si trovano nella memoria secondaria e vengono caricati nella memoria principale nel momento in cui inizia l'esecuzione di uno specifico programma, il quale, poi, aggiorna i dati nella memoria principale e li archivia, così modificati, nella memoria secondaria, mentre alcune istruzioni del programma indurranno la CPU a interagire con lo schermo. La CPU è collegata con la memoria attraverso il BUS.
Istruzioni del linguaggio di programmazione
Le istruzioni sono operazioni supportate dal linguaggio di programmazione, che saranno eseguite traducendole in codice macchina (file eseguibile):
- Pseudo-istruzioni: direttive all'interprete o compilatore del linguaggio, non corrispondono ad effettivo codice eseguibile.
- Istruzioni elementari (o primitive): operazioni che corrispondono direttamente ad operazioni hardware (es. interazioni con dispositivi di I/O, accesso ai dati, modifica dei dati).
- Istruzioni di controllo del flusso: permettono l'esecuzione di operazioni complesse, controllando l'esecuzione di sequenze di istruzioni elementari.
Differenze tra file eseguibile e file sorgente
Un file eseguibile è un tipo di file contenente istruzioni e comandi in codice macchina, direttamente eseguibile sul sistema operativo del computer. Un file eseguibile è un oggetto e non ha bisogno di interprete per essere eseguito. Un file eseguibile si distingue dal file sorgente che, invece, contiene il codice del programma informatico scritto in un linguaggio di programmazione. Per essere eseguito quest'ultimo deve essere prima trasformato in un oggetto eseguibile tramite l'operazione di interpretazione da parte di un software interprete.
Interazione con l'utente e rete
Per interagire con un utente umano, un computer ha bisogno di dispositivi periferici: trasmette le informazioni (in uscita, output) mediante uno schermo di visualizzazione, gli altoparlanti e le stampanti. L'utente può fornire informazioni (in ingresso, input) al computer tramite una tastiera o un dispositivo di puntamento, quale mouse. Le istruzioni e gli input dell'utente determinano l'esecuzione del programma. Alcuni computer sono unità autosufficienti, mentre altri sono connessi tra loro tramite reti. Attraverso la connessione alla rete, il computer può leggere dati e programmi da un dispositivo di archiviazione centralizzato oppure inviare dati ad altri computer.
Data center = centri di elaborazione dei dati
Ubiquitous computing = elaborazione diffusa
La programmazione e i linguaggi
La programmazione consiste nello scrivere un «documento» (file sorgente) che descrive la soluzione al problema considerato. Linguaggi di programmazione di alto livello = linguaggio di programmazione caratterizzato da una significativa astrazione dai dettagli del funzionamento di un calcolatore e dalle caratteristiche del linguaggio macchina. Il livello di astrazione definisce quanto sia di "alto livello" un linguaggio di programmazione. Le istruzioni ad alto livello vengono poi tradotte in modo automatico nelle più dettagliate istruzioni che sono necessarie alla CPU.
Un assembler è un software che trasforma le istruzioni mnemoniche dell'assembly in linguaggio macchina. Si tratta dunque di un compilatore (traduttore) per un particolare linguaggio assembly. Gli elementi del linguaggio sono istruzioni microarchitetturali fortemente dipendenti dall'hardware; es. linguaggio Assembler del microprocessore Intel Core. Un pacchetto (o modulo) contiene codice dedicato a risolvere problemi in un dominio specifico.
Il linguaggio Python
All'inizio degli anni ’90 Guido van Rossum progettò ciò che sarebbe diventato il linguaggio di programmazione Python. Van Rossum non era soddisfatto dei linguaggi esistenti: erano ottimizzati per scrivere grandi programmi, eseguibili in modo efficiente, ma lui voleva un linguaggio che permettesse di creare rapidamente i programmi, ma anche modificarli in modo semplice.
- Python è progettato per avere una sintassi più semplice e pulita degli altri linguaggi come Java, C and C++ (più facile da apprendere).
- L'ambiente Python aveva un approccio "batterie comprese", offrendo subito la disponibilità di molte funzioni utili in modo standard.
- Python è interpretato, rendendo più facile lo sviluppo ed il test di brevi programmi.
- I programmi Python sono eseguiti dall'interprete Python: l'interprete legge il programma e lo esegue.
Molti computer mettono a disposizione un ambiente di sviluppo integrato (IDE, Integrated Development Environment), nel quale scrivere e collaudare i programmi. In altri occorre per prima cosa mettere in esecuzione un editor di testo, cioè un programma che funziona in modo analogo a un word processor (“elaboratore di testi”), dove si scrivono le istruzioni in linguaggio Python, per poi aprire una finestra di terminale, in cui scrivere i comandi che eseguono il programma. PyCharm è un IDE.
L'interprete Python legge i programmi Python e ne esegue le istruzioni (enunciati). La fase di lettura e interpretazione delle istruzioni, che richiede tempo, viene eseguita una volta sola, da un componente detto compilatore. Il compilatore legge il file contenente il codice sorgente e traduce le istruzioni in byte code, un insieme di istruzioni estremamente elementari che possono essere comprese da una macchina virtuale, un altro programma che ha un comportamento analogo a quello della CPU di un computer.
Compilazione = processo di trasformazione delle istruzioni in una forma eseguibile. Dopo che il compilatore ha tradotto il programma in istruzioni per la macchina virtuale, queste vengono eseguite da essa ogni volta che lo desideriamo. Un errore di compilazione è una violazione delle regole del linguaggio di programmazione identificata durante la traduzione in formato eseguibile. Si verifica un'eccezione quando un'istruzione è sintatticamente corretta, ma non può essere eseguita. Un errore di esecuzione (o logico) è un errore che avviene durante l'esecuzione del programma, che produce risultati inattesi. Il codice sorgente non contiene tutte le informazioni di cui ha bisogno la macchina virtuale, per cui la macchina virtuale recupera tali funzioni da moduli di libreria. Python è case sensitive.
Lo pseudocodice è una descrizione informale di una sequenza di passi che portano alla soluzione di un problema. Un algoritmo che risolve un problema è una sequenza di passi non ambigua, eseguibile e che termina in un tempo finito. L'esistenza di un algoritmo è prerequisito essenziale per la programmazione.
Da soluzione formale a soluzione informale
- Determinare i dati disponibili (ingressi) e i risultati da produrre (uscite)
- Scomporre il problema in compiti più semplici
- Descrivere ciascun sotto-problema mediante pseudocodice
- Collaudare lo pseudocodice in casi specifici
Data science = analisi dei dati. Data mining = scoperta di schemi (pattern) ricorrenti e relazioni all'interno di enormi quantità di dati. Usando strumenti matematici si possono identificare gruppi di dati tra loro correlati (cluster) e metodi statistici consentono di classificarli, raggruppandoli in diverse categorie. Le azioni di data mining sono utili anche per individuare comportamenti anomali. Machine learning = apprendimento automatico, un settore che progetta sistemi che tentano di riprodurre i meccanismi di elaborazione del cervello umano → reti neurali.
Architettura degli elaboratori
Elaboratore = sistema in grado di acquisire informazioni, eseguire e produrre risultati.
I blocchi fondamentali dell'elaboratore
Sistema di elaborazione = Unità I/O + Unità centrale (CPU) + Memoria. L'elaboratore ha due componenti:
-
Digitale: in cui i dati sono espressi mediante sistema binario. Le operazioni sono scandite dal tempo, cioè seguono delle fasi temporali; e il tempo è scandito da un segnale che si chiama clock. Fa quindi funzionare i circuiti attraverso modifiche di segnale che dipendono da un sincronismo.
- Circuiti elettronici: svolgono funzioni che lavorano su segnali che hanno un certo valore elettrico (livelli di tensione) che viene tradotto e convertito in valore logico 0/1;
- Unità di elaborazione ("microprocessore"): contiene i circuiti per l'esecuzione di tutte le istruzioni.
- Memoria: memorizza in modo permanente dati e programmi. Necessaria per l'elaborazione per motivi di efficienza.
-
Analogico: Unità I/O svolgono il ruolo di interfaccia tra l'utente/ambiente e il calcolatore. Le principali periferiche di I/O di un calcolatore sono:
- Unità di input, forniscono dei dati al calcolatore: mouse, tastiera, microfono, videocamera;
- Unità di output, ricevono dei dati da un calcolatore: monitor, stampante, casse audio.
- Sensori: dispositivi input, cioè acquisiscono dati e le trasmettono all'elaboratore.
- Attuatori: dispositivi input, fa attuare un comando.
Il microprocessore
La CPU esegue un'istruzione alla volta. Alcuni microprocessori hanno tante CPU = multiprocessori, che riescono a svolgere più di un'istruzione contemporaneamente. Istruzione = unità elementare di operazione che svolge un microprocessore. Ogni microprocessore svolge diversi tipi di istruzioni, cioè un determinato insieme di istruzioni ("instruction set"). Ogni microprocessore ha un instruction set specifico. Contiene quindi:
- Tutti i circuiti per eseguire le operazioni di base su numeri interi, reali e operazioni logiche.
- Opportuni circuiti per il 'coordinamento' dell'esecuzione delle istruzioni (per es. il loro sequenziamento, controllo degli errori)
- Interfacce per spostare dati da/verso la memoria: la CPU prende i dati dalla memoria, lavora con essi e scrive i risultati sulla memoria.
- Interfacce per spostare dati da/verso unità di I/O.
Anche i programmi scritti in un linguaggio di alto livello, sono trattati attraverso la traduzione da linguaggio di alto a un linguaggio che un unico processore può capire, cioè quello delle istruzioni. Ad alto livello l'istruzione corrisponde es. ad un ciclo for. Il microprocessore ha limitate capacità di memorizzare dati e/o istruzioni:
- Lo stretto necessario per eseguire le operazioni.
- Ma per motivi di efficienza una parte della memoria è ospitata nel microprocessore.
La memoria locale ("cache") memorizza dati e istruzioni recentemente e frequentemente utilizzati. Rispetta il principio di località dei riferimenti, che è alla base del funzionamento dei programmi:
- Temporale: se un certo programma accede ad un certo indirizzo in un certo tempo, è molto probabile che in un tempo ravvicinato acceda allo stesso indirizzo.
- Spaziale: se in un tempo t accedo ad un certo indirizzo, è molto probabile che immediatamente dopo accedo ad un indirizzo molto vicino a quello.
La cache salva quindi la "linea di cache", ovvero salva i dati e i suoi vicini (un blocco di dati), per migliorare le prestazioni di accesso ai dati. Dunque, se un dato è memorizzato nella cache, non c'è bisogno di uscire dalla CPU e andare nella memoria per recuperarlo.
La CPU
Si divide in:
-
Unità operativa: svolge tutte le elaborazioni/istruzioni richieste (aritmetiche, logiche, grafiche…)
- Registri: componente di memorizzazione locale (la più efficiente che c'è, perché si trova dentro la CPU) usata per conservare temporaneamente dei dati sui cui lavorano i programmi (es. risultati parziali o variabili, istruzioni). Ogni trasferimento da processore a memoria e viceversa avviene tra registri e memoria. Ogni CPU ha un certo numero limitato di registri (da 8 a 128).
- Il compilatore è quello che si occupa di mettere nei registri i dati. Prende il programma sorgente, lo traduce in programma eseguibile, cioè con le istruzioni di basso livello, tra cui c'è quella che prende la variabile e la mette in un registro così quando bisogna riusarlo lo si prende dai registri interni. (Il trasferimento da memoria a registro, da registro a registro, da processore a memoria e viceversa è sempre specificato nelle istruzioni).
- Alcuni computer utilizzano i registri in sostituzione della memoria per es per il passaggio di parametri, per le funzioni. Sono alla base di tutte le operazioni aritmetiche.
- Registro dei flag: registro che contiene un insieme di bit ("flag") che segnalano determinati stati dell'insieme delle unità di calcolo e alcune informazioni sul risultato dell'ultima operazione eseguita (memorizza lo stato del processore). Ogni volta che si esegue un'istruzione aritmetico logica la CPU aggiorna questi bit; ogni bit dice l'esito di una certa istruzione.
- Zero: segnala se il risultato dell'operazione è o no zero (se sì = 1).
- Segno: indica il segno del risultato dell'operazione precedente (-=1, +=0).
- Overflow: indica se il risultato dell'operazione precedente eccede i limiti della rappresentazione.
- ALU (Arithmetic Logic Unit): svolge tutti i calcoli (aritmetici, logici, confronto) su due numeri interi in ingresso. È formata da due rami (registri).
- FPU (Floating Point Unit): svolge i calcoli su numeri reali, quindi legata a istruzioni che lavorano su numeri con virgola mobile, i quali hanno una complessità maggiore. Negli instruction set dei primi processori non c'erano istruzioni che facevano operazioni in virgola mobile. Poi sono stati aggiunti i coprocessori matematici e in seguito è stato integrato tutto dentro un singolo processore. N.B. Un'operazione FPU è tipicamente più lenta di 5-50 volte di un'operazione ALU.
-
Unità di controllo: è il cuore dell'elaboratore; governa l'esecuzione delle istruzioni (che legge dalla memoria). In base alle istruzioni contenute nel programma che esegue ed allo stato di tutte le unità decide l'operazione da eseguire ed emette gli ordini relativi.
- PC (Program Counter): registro che fa da contatore, cioè che indica sempre l'indirizzo della cella di memoria che contiene la prossima istruzione da eseguire. N.B. La prima volta l'istruzione è presa dalla memoria, poi la cache ha bufferizzato un insieme di istruzioni, quindi non c'è bisogno di accedere alla memoria principale.
- IR (Instruction Register): registro che memorizza temporaneamente l'operazione (istruzione) corrente da eseguire.
- Logica di controllo: interpreta il codice macchina in IR per decidere ed emette gli ordini che le varie unità devono eseguire.
Esecuzione di un'istruzione
-
FETCH
- ←IR M [PC]: preleva dalla memoria principale l'istruzione nella posizione indicata da PC e lo salva nell'IR.
- ←PC PC + 1: incrementa il valore di PC (al passo successivo conterrà la prossima istruzione da eseguire). N.B. Il PC punta sempre l'istruzione successiva a quella che si sta eseguendo.
- DECODE: ←ordini decode(IR): decodifica l'istruzione.
- EXECUTE: attiva i blocchi interessati dall'istruzione (la cui velocità è dipendente all'istruzione).
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Appunti Informatica medica
-
Appunti Algoritmica
-
Appelli d'esame Analisi matematica II
-
Appunti e formulario per teoria di Fondamenti di informatica