Informatica (programmazione)
Lezione 1: 11-03-2020
Esame: prova scritta su carta con programmazione più una domanda teorica. 24 punti per la parte del linguaggio e 6 per la parte teorica. Chi non supera ma è >12 si possono fare le successive prove (l'appello dopo). Poi c'è l'orale, breve, per le competenze. Python è molto rigido e se sbaglio anche solo una maiuscola o una punteggiatura errata e sbaglio lettera un punto in meno e anche se non metto la punteggiatura.
Definizione di informatica
Informatica: in inglese era computer science ed era la combinazione di informazione e automatica. Da qui si è passato alla information technology: con tutto ciò che sta attorno all'informazione, non solo come calcolo ma anche conservazione. Poi information and comunication technology: dall'elaborazione alla conformazione e alla comunicazione. Questi sono i tre aspetti che ci aspettiamo da un calcolatore. Il calcolatore trasmette info in tempo reale.
L'elaboratore è una macchina per risolvere problemi generici, e ha tre funzioni principali:
- Elaborazione: da input a output. Trattamento di dati;
- Archiviazione: rappresentazione dei dati;
- Trasmissione: invio di segnali.
Con le macchine serve un linguaggio: usa dei simboli al posto di oggetti e concetti: il linguaggio naturale: alfabeto (italiano e greco), ha difetti però allora si usano dei linguaggi formali, sono convenzioni che hanno il pregio di non avere ambiguità (come il linguaggio matematico, o Morse, o le luci del semaforo...).
L'elaboratore usa la numerazione binaria, vengono riconosciuti solo due stadi: 0,1. È in evoluzione un modo di organizzazione diversa e più organizzata negli elaboratori quantistici, sono solo prototipi. La più piccola unità di formazione o elaborabile da un calcolatore è il bit, corrisponde a uno dei due stati di un dispositivo fisico. Vengono usati anche i Byte, un ottetto di Bit.
Architettura dei calcolatori
Un calcolatore è molto complesso e si può dividere tra:
- Hardware: parte fisica che si può toccare. I processori, i dispositivi di memoria, le periferiche (componenti aggiuntive per altre funzionalità, come la comunicazione) e il bus (strumento di connessione in tutti questi dispositivi). Possono essere meccaniche o elettroniche;
- Middleware: semi hardware per dare le funzioni di avviamento;
- Software: è la parte logica e non tangibile che ci permette di usare l'hardware: sistema operativo e file system;
Classificazione dei calcolatori
- Microcomputer;
- Workstation: per collegarsi in rete con altre postazioni (ha spinto allo sviluppo di internet);
- Mini computer: calcolatori con una decina di calcolatori attaccati (ora inesistenti);
- Mainframe: grosse capacità di calcolo e collega molti terminali;
- Elaboratori per il calcolo parallelo: per poter elaborare su processori distinti le parti e poi raccogliere tutto in un'unica soluzione.
L'architettura in un calcolatore è stata studiata da Von Neumann e tutto è ancora usato ora. Lui aveva distinto delle componenti del calcolatore:
- CPU: parte centrale di elaborazione. È un processore, acquisisce un'istruzione, interpreta le istruzioni che compongono i programmi ed esegue le istruzioni dei programmi: coordina la macchina. Tutte le istruzioni provengono dalla memoria centrale (RAM). La CPU è composta da tante parti:
- ALU: elaborazione dei dati, effettua le operazioni aritmetiche e logiche;
- CU: interpreta le singole istruzioni e coordina tutta la CPU;
- Tutto questo è trasmesso dal bus interno, che mette in collegamento le componenti della CPU;
- Clock: mi da la frequenza con cui posso trasmettere una parte di informazione, e permette di usare tutti gli altri registri evidenziati dopo;
I registri sono elementi di memoria, sempre in binario, ad altissima velocità (molto più della RAM):
- Registri A e B: contengono i nostri dati e lavorano con l'ALU che elabora le info da A,B;
- Registro SR: è un trucco per avere certi stati già noti senza doverli poi elaborare ancora, contiene i "confronti" o overflow, A>B, A=B...
- Registro PC: mi fa sapere qual è l'indirizzo della prossima istruzione da seguire;
- Registro CIR: contiene l'istruzione attualmente in esecuzione;
- Registro AR e DR: servono per comunicare con la RAM, indirizzo e dati da inviare alla RAM o che vengono ricevuti dalla RAM;
- Registro CDR: mi dice se devo fare una lettura o una scrittura della RAM;
- Registro INTR: gestisce i segnali di pronto (interrupt) inviati dalle periferiche;
Memoria centrale (RAM): Supporto per prendere appunti dei risultati. Si chiama anche Random Access Memory. È una tabella con indirizzi in verticale e byte in orizzontale. Serve per memorizzare i dati, i programmi, però questa è volatile, se manca la corrente la memoria viene persa. Distingue i nostri dati in indirizzi per poter raggiungere l'informazione richiesta, e sono i byte (B) fatti da 8 bits (b). In base a quanti bit usiamo distinguiamo diverse macchine:
- 32b: 232 e ha 4 GB
- 64b: 264 ha 16GB2
Tastiera: è una periferica locale, come il mouse, video, touch screen, dischi, USB drive, stampante, foto/videocamera. Invece le periferiche di remoto sono il RJ45, Wi-Fi, bluetooth.
Scheda video: per rappresentare i risultati sullo schermo. Anche questa è una periferica;
Controller dischi: con le cose di memorizzazione dei dati. È un meccanismo di memoria. Il collegamento tra tutto viene effettuato dal bus di sistema, non possono comunicare contemporaneamente ma in modo ordinato nel bus. I bus sono:
- Bus dati, trasmette dati da e a CPU
- Bus indirizzi: trasmissione indirizzi a RAM;
- Bus controlli: trasmissione ordini da CPU a periferiche.
La memoria di massa è fatta da dischi magnetici, ottici ecc... alte USB drive o altri più obsoleti. La memoria, spenta la corrente, non si perde. È più lenta rispetto alla RAM ma è più capiente.
Il software
È un insieme di programmi che servono per svolgere una funzione. Ci serve un:
- Sistema operativo, il software di base: consente all'utente di interagire con l'hardware, di accedere alle operazioni di base per utilizzare le risorse del sistema di elaborazione. L'utente si interfaccia al sistema operativo in due modi:
- UI, Use Interface: quella dove scrivo i comandi. Poi si è passati alla GUI, si interagisce con il sistema operativo guardando i file come li vediamo ora nelle finestre. Dal sistema operativo si usano anche i software applicativi che esplicano la funzione del calcolatore. Il software applicativo va sopra al sistema operativo, non lo sostituisce.
- API: interfaccia programmabile del sistema, per interfacciare i file, cioè per farmi scegliere che programma aprire.
Tutto ciò che riguarda l'informatica si interfaccia con la modularità, definita dalle componenti distinte, posso cambiare le componenti con altre simili e sistemare un solo apparecchio. Posso quindi migliorare un intero sistema senza cambiare il totale, ma solo un modulo. Nei sistemi operativi si possono distinguere 5 strati per distinguere le diverse funzionalità, così che se non funziona una parte non devo modificare tutto.
Il nucleo (kernel) deve interfacciarsi con l'hardware. Sopra ho moduli specifici per l'hardware, il gestore della memoria (nessuno deve disturbare l'altro), il gestore delle periferiche (ogni programma gestisce cose diverse, periferiche diverse), file system (si occupa dell'archiviazione dei dati, è molto variabile. Aveva 8 caratteri e massimo 3 estensioni (.odt, .ddt, .pdf...), anche se ora sono molte di più. Poi c'è l'interprete dei comandi, arrivano ordini e l'hardware deve interpretarli e si può darli con interfaccia utente o grafica (GUI) o con un programma che da ordini (API).
- Software applicativo: è un insieme di programmi non necessari al computer ma lo rendono specializzato. Si parla di programma/codice/applicazione/app/software applicativo come sinonimi. Ma il programma può far riferimento ad uno Programma sorgente: un testo scritto in un linguaggio normale (Python, semplice)
- Programma eseguibili: il linguaggio macchina, i bit. È quello che mi esce con dei simboli strani che non sono alfabeto, ma bit. Noi non sappiamo scrivere in quel modo.
Licenze
Limiti legali per usare i software. La licenza all'uso è vendibili con l'acquisto, divieto di copia o rivendita. Esistono i freeware che possono essere provati gratuitamente, settimane o mesi, o a vita con funzionalità limitate. Esistono poi gli open-source (sorgente), che ci permettono di utilizzarlo liberamente. Questi hanno tanti tipi di licenze, e si può rivendere o modificare. Poi c'è il codice proprio, fatto da noi.
Linguaggio di alto livello
È artificiale, usato per programmazione degli elaboratori, solitamente nato dalla formalizzazione e semplificazione del linguaggio naturale. Diversamente dal linguaggio macchina necessita di una traduzione nel linguaggio compreso dall'elaboratore. La traduzione non la facciamo noi, ma verrà fatta da un altro software. Esistono 2 modi di tradurre:
- Compilato: interamente tradotti in linguaggio macchina e memorizzati in un file. Solo una volta ma è lento come processo. Una volta tradotti sono in linguaggio macchina;
- Interpretato: tradotti ed eseguiti un'istruzione alla volta e avviene ogni volta che viene utilizzato. I compilati più veloci dimostrano che non sempre è vero. A volte Python è più veloce di un compilato. Un vantaggio è che se c'è un errore, possiamo modificare il codice e proseguire velocemente nell'esecuzione (nell'interpretato).
Linguaggi di programmazione
Nel 1960 nasceva l'esigenza di memorizzare dati business, del governo federale. Nel 1964 con ogni tipo di necessità, specifico per costruire ogni tipo di software. Il linguaggio C ha preso piede anche in scuole a differenza del Pascal, complicato. Il Python era simile agli altri non prese molto piede se non che il modo in cui è concepito è molto efficiente. Java è il più diffuso ed usato in questi ultimi anni.
Compilato vs interpretato
Analisi per vedere cosa eseguire. Con un'analisi trovo un algoritmo, un modo di risolvere in modo automatico un problema. Poi dopo c'è la supplementazione, il modo in cui andiamo a scrivere l'algoritmo in un linguaggio di alto livello, si passa da quello che è il concetto di risoluzione al linguaggio vero e proprio per creare il codice sorgente. Poi con il software possiamo eseguire tutto.
Tra compilato e interpretato, nel passaggio tra source code e executable code, da codice sorgente a codice eseguibile, possiamo usare il compilatore (fortran, pascal, basic, python) che prende dei file con solo testo (.for, .c, .py), il testo viene compilato e tradotto in una fase, poi assemblato con altri codici già preparati che si fondono nell'.exe per fare l'esecuzione. Nel linguaggio interpretato (Python) c'è il codice sorgente e si dice interpreta ed esegui.
Lezione 2: 18-03-2020
Sistemi di numerazione
Si parte dal sistema decimale, composto da 10 cifre e la loro combinazione ci da delle parole. Es: 387.52, il punto si chiama separatore digitale nel sistema anglosassone (noi usiamo la virgola). Questo numero lo possiamo scomporre nelle sue parti, nelle sue posizioni e vediamo che le unità sono in posizione 0, le decine in posizione 1 e così via. Se do un peso, le unità sono 100, e così via con gli esponenti.
Prendo le cifre, le moltiplico per il loro peso e sommo, ottengo il numero di partenza scomposto. Si possono definire altri sistemi, a noi interessa il sistema binario, composto solo da 0 e da 1, un numero possibile è 110.11 e qui si parla di posizione 2, 1, 0... Ora le cifre sono due quindi come peso avrò potenze di 2 non più di 10. Quello che mi esce mi da 6,75 in base dieci, ed era 110.11 in base 2. Ecco come si trasforma un numero binario in decimale.
Suppongo di partire da 0. Passa da 0000 a 0001, ma ora ho terminato le cifre del sistema quindi devo modificare qualcosa. Come nel decimale che dopo il nove aumenta di una decina e si aggiunge una cifra in più e il 9 torna a zero. Così anche da 19 a 20 incrementa di una unità la decina. Passa aumentando le cifre, ma che finisce sempre col crescere con 0, 1, 10, 11. Per convertire da binario a decimale, trovo le posizioni e moltiplico la base per la posizione e sommo. Es: (0110’0111) = 26 + 25 + 22 + 21 + 20 = (103)10
Domanda d'esame: massimo numero rappresentabile
Nelle macchine non ho infiniti numeri, c'è un massimo numero rappresentabile. Con quattro bit avrò:
- 0000=0
- 0001=1 e così via
- 1110= 14 (controllo con la conversione in base 10)
- 1111= 15 (da qui mi ritorna tutto a zero con un overflow, alcuni riescono a usarlo altri no). Questo con quattro bit sarà il massimo numero rappresentabile, quindi da 0 a 15 sono 16 le possibili rappresentazioni. Il 16 non è rappresentabile, basta prendere il successivo e togliere 1: 1111= 24-1.
Con tre bit invece vado da 000 a massimo 111 e quindi il massimo numero è 1000 (il successivo) -1 che è 23-1. Con 1 byte, quindi otto bit, il massimo è 11111111, ma prendo il successivo 100000000= 28 e avrò l'ultimo numero= 28-1.
Ora passo dal decimale al binario: si prende il numero decimale e lo si divide per due, e avrò un eventuale resto. A sua volta divido per due e così via.
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.