Prima Lezione - Appunti corso di Programmazione in C
Contesto generale e Risorse didattiche
Benvenuto al corso di programmazione; istruttore: Fausto Sfoto.
Credenziali e accesso: provate a entrare con le vostre credenziali sul computer; login e password disponibili nella pagina Moodle del corso.
Registrazioni: la pagina Moodle contiene link alle registrazioni dell'anno scorso (equivalenti a quelle di quest'anno) per la parte teorica; le registrazioni di quest'anno saranno disponibili su Panotto (a destra nella pagina del corso).
Struttura del corso: corso annuale con due quadrimestri; l'insegnante coprirà teoria nel primo quadrimestre e parte di teoria del secondo; laboratorio del secondo quadrimestre affidato ad un altro docente.
Libro di riferimento consigliato: Steven Kochan, Programming in C (ultima edizione). Seguirlo per seguire fedelmente le lezioni.
Esame: corso annuale; esame finale all"anno; organizzazione tipica in due esami parziali (uno a febbraio e uno a giugno). Se si superano entrambi con una media ≥ 18/30, si sostiene l'esame finale; altrimenti si sostengono esami singoli a giugno, luglio, settembre e poi a febbraio 2023 (dettaglie storiche). Consiglio strategia: mirare a passare i 2 parziali a febbraio e giugno 2000.22 per avere materiale recente e programma più contenuto.
Orari di ricevimento: lunedì dalle 16:30 in poi nel studio al primo piano.
Materiali aggiuntivi: esami e compiti degli anni passati, con relative soluzioni, disponibili su Moodle; utili per esercitarsi prima dell’esame.
Esame in laboratorio: durante l’esame dovete usare le macchine del laboratorio (non potete portare il vostro computer di casa); è consentito portare libri e appunti ma non internet né telefoni/cellulari durante l’esame.
Pratica a casa: se avete un computer personale, potete installare Linux e ricreare un ambiente simile a quello del laboratorio per esercitarvi.
Concetti chiave: cosa è un computer e come si programma
Definizione sintetica: un computer è una macchina capace di eseguire calcoli e di essere programmabile tramite software.
Architettura di base (macchina di Fornoyman/von Neumann, come descritto nel testo):
CPU (unità di processo centrale): esegue i calcoli.
MEMORIA: ricorda informazioni temporanee; RAM è memoria elettronica ad accesso casuale, volatile (conserva dati fintanto che il sistema è acceso).
IO (input/output): comunica con l’esterno (tastiera, monitor, modem, stampante, ecc.).
Bus: insieme di collegamenti che permettono alle tre componenti di comunicare tra loro.
Architetture alternative (parallele, quantum) menzionate come tentativi, ma attualmente dominante è l’architettura di tipo Fornoyman (von Neumann).
RAM vs Disco:
RAM: memoria temporanea, molto veloce, perde i dati se si spegne il computer; usata per i dati dei programmi in esecuzione.
Disco: memoria permanente o a lungo termine; usato per dati stabili (foto, musica, programmi installati).
SSD (disco a stato solido): tecnologia moderna che sostituisce i dischi tradizionali; circuito elettrico che sostituisce la parte magnetica.
Informazione binaria: tutta l’informazione nel computer è ricondotta a bit; due stati fondamentali: e ; concetto chiave: informazione binaria può codificare numeri, testo, immagini, suoni, video, ecc.
Rapporto tra memoria e prestazioni: RAM è veloce per permettere un accesso rapido ai dati temporanei; disco è grande per dati permanenti, ma più lento.
Sistema operativo: programma che semplifica l’uso del computer; esempi comuni: Windows, macOS, Linux. Linux è particolarmente consigliato nel corso per lo sviluppo software e come ambiente di laboratorio; Android contiene Linux come componente di base.
Linguaggi e astrattizzazione:
Linguaggi di macchina (linguaggio macchina) sono di basso livello e molto vicini all’hardware.
Linguaggi ad alto livello permettono astrazioni (numeri interi, stringhe, variabili, ecc.). Esempi storici: Fortran, Cobol; linguaggio C (centrale nel corso) ha reso possibili sistemi operativi scritti in alto livello (es. Unix, poi Linux).
Compilatori vs interpreti:
Compilatore: trasforma l’intero programma in linguaggio macchina, eseguito successivamente come programma compilato.
Interprete: traduce ed esegue istruzione per istruzione durante l’esecuzione.
Il compilatore è uno strumento software, non un essere umano; nel corso utilizzerete compilatori C installati sul sistema.
Tipi di informazione memorizzabili (dati):
Numeri; stringhe (sequenze di caratteri); immagini (pixel); canzoni (audio); video (immagini+suoni in movimento).
Tutti questi dati, all’interno di un computer, devono essere rappresentati in forma binaria.
Linguaggi, compilatori e organi di elaborazione
Linguaggi di programmazione: sono linguaggi strutturati, semanticamente chiari e non ambigui; non si usano lingue naturali (italiano o inglese) per parlare al computer.
Linguaggio macchina: il più basso livello; comandi direttamente comprensibili dall’hardware della CPU (operazioni su zone di memoria, esecuzione di istruzioni, ecc.). Storicamente usato in sistemi di calcolo e in ambito bellico/spaziale.
Linguaggi di alto livello: permettono astrazione da dettagli hardware; esempi storici: Fortran, Cobol; linguaggio C come pietra miliare (centrale nel corso).
Unix e Linux: Unix come prima grande famiglia di sistemi operativi; Linux è derivato da Unix ed è ampiamente usato in laboratorio e in server di rete; Android contiene Linux come kernel in uso.
Traduzione dei programmi: il traduttore che trasforma dal linguaggio di alto livello al linguaggio macchina si chiama compilatore; permette di eseguire il programma tradotto sul computer.
Differenza tra compilatore e interprete (storicamente): differenze principali riguardano il punto in cui avviene la traduzione (tutto in una volta vs istruzione per istruzione). Oggi la distinzione è meno fondamentale per molti linguaggi, ma rimane didatticamente utile.
Dati, memorie e organizzazione dell’informazione
Informazione digitale: tutto è rappresentato come sequenze di bit; l’unità fondamentale è il bit: ext{bit} o ig{0,1\big}.
Tipi di dati comuni:
Numeri; stringhe (nomi, cognomi);
Immagini (pixel); canzoni (audio); video (immagini+suoni in movimento).
Dati conservati a lungo termine sul disco, dati temporanei in RAM durante l’esecuzione.
Memoria RAM vs disco: RAM è veloce ma volatile; disco è permanente o persistente ma più lento.
Struttura del disco (nella lezione si usa come esempio): vecchia tecnologia magnetica con testina di lettura/scrittura; oggi la maggior parte dei computer usa disco a stato solido (SSD).
Ambiente Linux e shell: navigazione e gestione dei file
Contesto operativo: laboratorio Linux; ambiente di sviluppo comune per i programmatori; Android ospita Linux come kernel.
Sistema di gestione file: si interagisce tipicamente tramite interfaccia grafica (esploratore file) o terminale (shell). Nell’esercizio si utilizza principalmente la shell.
Concetti di base della shell:
File vs directory (cartelle): cosa c’è dentro una directory si verifica con comandi come LS (ls).
Directory radice: "/"; dentro ci sono directory come /bin, /home, /lib, ecc.
Home directory: la directory personale dell’utente; nomi tipici: /home/spot, /home/teacher, ecc. Si può riferire a casa con la tilde: tilde = ~.
Prompt: visibile a sinistra del simbolo del dollaro ($); mostra la directory corrente.
User identity e percorsi: ls, cd, pwd, ecc. Forniti esempi con utenti come spot o teacher; su computer di rete l’organizzazione è simile ma varia a seconda della configurazione.
Comandi di base:
ls: elenca contenuti; ls -l fornisce dettagli (dimensione, data, proprietario, permessi).
cd: cambia directory; cd ~ torna alla home; cd .. torna alla directory padre; cd /path/alla/directory sposta dentro quella directory.
pwd: stampa la directory di lavoro corrente.
cat: stampa contenuto di un file; equivalente a visualizzare il contenuto del testo.
more: visualizza contenuto di file una pagina alla volta; premere Q per uscire.
grep: non menzionato esplicitamente, ma spesso presente; qui si usa principalmente cat/more/ls.
mkdir: crea nuove directory.
rm: rimuove file; rm -r rimuove directory ricorsivamente (non vuota richiede prima di svuotarla).
rmdir: rimuove solo directory vuote.
cp: copia file o directory.
mv: sposta o rinomina file o directory.
Esempi pratici mostrati:
Creare una directory dentro la home personale: mkdir Toto-Cutugno.
Creare una sottodirectory per un album: mkdir Toto-Cutugno/musica-Mediterraneo (rispettare l’uso di nomi senza spazi o utilizzare trattini).
Creare un file di testo con GEdit: gedit nomefile.txt; scrivere contenuto; salvare; chiudere.
Contenuti di una directory: ls Toto-Cutugno contiene due album; ls -l mostra dettagli come dimensione in byte, data di creazione, proprietario (es. teacher).
Apertura di file di testo: cat Pippo.txt mostra il contenuto; more Pippo.txt permette scorrimento.
Editor in uso: GEdit è un editor di testo grafico; è possibile aprire GEdit con un percorso file (es. GEdit bello.txt) o aprire una nuova finestra; usare Tab per autocompletamento quando si scrive i comandi.
Dettagli sull’uso di GEdit: quando si esegue GEdit, la shell resta disponibile; per riacquisire controllo e riprendere comandi, si aggiunge la E commerciale (&) alla fine del comando, ad es. GEdit bello.txt &, in modo da sganciare l’editor e liberare la shell.
Suggerimenti utili:
La freccia su / giù ricorda i comandi precedenti; premendo su o giù si riapre una riga di comando già usata.
Autocompletamento via Tab: digitare l’inizio di un comando o di un file e premere Tab per completare; se c’è ambiguità, premere Tab due volte per scegliere tra alternative.
Quando si crea nomi di file o directory con spazi, è consigliabile evitarli; se necessario, utilizzare doppi apici ("…") per includere spazi e slash nel nome.
Esempio pratico di esercizio guidato:
Creare una struttura Toto-Cutugno/Lamiamusica/Mediterraneo con due canzoni inside per ogni album, copiando contenuti da internet se necessario, incollandoli in GEdit, salvando, e organizzando con ls per verifiche; utilizzare TAB per autocompletamento e la freccia per richiamare comandi precedenti.
Note sulle operazioni di gestione file:
Per eliminare un file: rm nomefile.
Per eliminare una directory vuota: rmdir nome_dir.
Per eliminare una directory non vuota: prima svuotarla rimuovendo i file al suo interno (rm nomefile) e/o mv/cp come necessario, poi eseguire rm -r nomedir (attenzione: operazione pericolosa e irreversibile).
Manuali e aiuti:
Il comando man fornisce i manuali di uso dei comandi; esempio: man, poi digitare il comando (es. man ls); per uscire, premere Q.
Riferimenti utili sui nomi e referenze:
La directory di lavoro e la home sono spesso indicate come tilde (~); la cartella home è la "home" dell’utente e viene spesso usata come punto di partenza per i file personali.
La directory padre è denotata da ".."; la directory corrente è denotata da ".".
Per tornare rapidamente alla home si usa cd ~ oppure cd (senza path specifico).
Esercizio finale proposto dall’istruttore
Creare una struttura di directory come segue nella vostra home:
Toto-Cutugno/ (directory principale)
Dentro Toto-Cutugno, creare due album: musica e Mediterraneo (si può usare nomi con trattini al posto degli spazi).
Dentro ciascun album, creare due file che rappresentano canzoni (es. canzone1.txt, canzone2.txt).
Cercare due canzoni reali in internet, copiare/incollare il testo in GEdit e salvare come file dentro i rispettivi album.
Verificare con ls che la struttura sia stata creata correttamente: ls Toto-Cutugno; ls Toto-Cutugno/musica; ls Toto-Cutugno/Mediterraneo.
Esempio di file testo: dentro ciascun album creare file di canzone (es. canzone1.txt, canzone2.txt).
Nota pratica: l’esercizio è pensato per farvi praticare comandi base (mkdir, cd, ls, gedit, cp/mv, ecc.) e per farvi prendere confidenza con la gestione di percorsi, nomi di file e struttura a directory.
Note finali sull’utilità pratica
Il corso mira a fornire le basi per scrivere programmi in C, comprendere l’architettura informatica di base (CPU, RAM, IO, bus), apprendere a manipolare file e directory tramite la shell, utilizzare un compilatore, e comprendere l’interazione tra linguaggi di alto livello e linguaggio macchina.
Le abilità presentate sono trasferibili sia all’ambiente di laboratorio che a casa, grazie all’uso di Linux e di strumenti comuni.