Non lasciate l unica copia del programma sul PC in cui lavorate, non è detto che lo possiate riutilizzare durante la lezione successiva. Il sistema operativo / Linux Create una directory (ad es. chiamandola con il vostro cognome) e salvate al suo interno i file che preparerete. Non chiamate i file dei programmi tutti con lo stesso nome (pippo.c / test.c / prova.c / ) I computer potrebbero bloccarsi: salvate SPESSO il file con il codice C. Alla fine della lezione COPIATE i file che avete preparato su di un floppy o su una memoria USB (oppure spediteveli per posta elettronica) Come faccio a spostare i documenti che ho creato su floppy/memoria USB? 1 Dal desktop del PC individuo la cartella che contiene il file, lo seleziono e lo copio all interno della cartella che si trova nel floppy o nella memoria USB (dopo averla montata)
Il sistema operativo / Linux 2 Utilizzando il comando df individuo quali siano i dispositivi di memorizzazione attualmente disponibili e capisco quale sia la directory in cui sia disponibile il loro contenuto. Di norma, il contenuto del floppy è disponibile all interno della directory /mnt/floppy mentre il contenuto della memoria USB è disponibile all interno della directory /mnt/usb oppure, nel caso ci siano più porte USB disponibili, nella directory /mnt/usb/1!! Per chi ha scelto il metodo 1, utilizzare l opzione smonta prima di scollegare il dispositivo Per chi ha scelto il metodo 2, dare il comando umount /mnt/floppy nel caso si stia usando il dischetto umount /mnt/usb nel caso si stia usando la memoria USB
Perché devo montare/smontare la chiavetta USB ed i floppy? Il sistema operativo / Linux memorizzazione di dati da parte dell utente / software / alto livello? periferica di archiviazione / hardware / basso livello I dispositivi hardware non sono direttamente accessibili all utente, il sistema operativo ne permette l accesso all utente mediante dei collegamenti ai dispositivi hardware che vengono visti dall utente come dei file. -> diamo un occhiata alla directory /dev (ove dev sta per device) utente dispositivo software (file) buffer di MEMORIA dispositivo hardware (ad es. memoria USB) rientrano nella categoria block devices supportano RA
Il compilatore, gcc (GNU C Compiler) http://gcc.gnu.org/ Perché ci serve un compilatore? Il compilatore serve in quanto il C è un linguaggio compilato e non interpretato; il C inoltre è un linguaggio imperativo. Ci serviamo del compilatore per passare dal file di testo (linguaggio C / comprensibile all utente) a programma eseguibile (linguaggio macchina/comprensibile al processore). Ci sono livelli di linguaggio intermedi? Sì! Codice C, linguaggio comprensibile con un lessico, sintassi e semantica int i = 5; i = i + 3; Assembly (linguaggio mnemonico a basso livello) compilatore Linguaggio macchina (codice binario) 0101011000101001001010
Quali sono le operazioni svolte dal compilatore per tradurre il codice in un file eseguibile? Riconduciamoci prima ad un esempio semplice: vogliamo un programma che funzioni sulla macchina cuoco e che ricevendo in input degli ingredienti ci produca come output una torta. Listato del codice Pasta al forno - 5 hg di pasta corta - 300 g di sugo al ragù - 200 g di besciamella - parmigiano - burro Cuocere la pasta in acqua salata (tenendola al dente); scolare e condire con il sugo. Disporre poi in una teglia precedentemente imburrata e ricoprire con la besciamella e parmigiano a piacere. Passare in forno a 180 o C fino a raggiungere la doratura desiderata. Come variante, al posto del ragù usare il sugo con i funghi. Cosa dovrà poi fare il programma? allocazione delle risorse salare l acqua e farla bollire cuocere la pasta condire la pasta accendere il forno / T = 180 o C prendere la teglia e imburrarla riempirla di pasta ricoprire con besciamella aggiungere parmigiano infornare il tutto controllare il livello di cottura estrarre a cottura ultimata commento (ovvero testo non funzionale alla produzione di questo specifico output)
Cosa dovrà poi fare il programma? Cosa sa fare la macchina? allocazione delle risorse salare l acqua farla bollire e cuocere la pasta condire la pasta prendere la teglia e imburrarla riempirla di pasta ricoprire con besciamella aggiungere parmigiano infornare il tutto controllare il livello di cottura estrarre a cottura ultimata NO -> il cuoco rimane in cucina NO -> serve libreria esterna per uso di pentole e fornello NO -> serve libreria esterna per uso del forno e cottura Il programma finale (che è in grado di produrre come output la pasta al forno) risulta quindi l insieme di: allocazione delle risorse, operazioni svolgibili direttamente dalla macchina che lo dovrà eseguire, operazioni svolgibili dalla macchina mediante l ausilio di funzionalità esterne alla macchina stessa.
Il compilatore deve rendere possibile l esecuzione del programma, ovvero deve: 1. eliminare i commenti (sono superflui per le operazioni da svolgere) 2. sostituire le etichette; ovvero parmigiano deve diventare 100 gr di parmigiano della marca ACME, pasta deve diventare 500 gr di fusilli della marca ACME 3. generare il codice eseguibile dalla macchina (prendi la scatola di pasta, aprila, togli la pasta dalla scatola, pesala,...) 4. collegare il codice legato all interazione con dispositivi o funzionalità esterne (accendi il forno, imposta la temperatura,...) 5. includere nel programma una parte in cui si richieda l allocazione delle risorse utili al funzionamento del programma (ovvero richiedere quanti e quali ingredienti debbano essere tutti disponibili nel momento in cui il programma verrà mandato in esecuzione) 6. unire il tutto e fare in modo che le varie istruzioni vengano concatenate in modo corretto (non devo mettere in forno la pasta prima di averla cotta...) Il sistema operativo deve rendere attuabile l esecuzione del programma, ovvero deve: 1. fare in modo che le risorse richieste vengano rese disponibili al momento dell inizio del programma (se manca la pasta, il programma non parte) 2. fare in modo che i dispositivi esterni e le funzionalità siano disponibili al momento dell esecuzione del programma (se manca il gas, il forno non si accende)
Il compilatore, gcc (GNU C Compiler) http://gcc.gnu.org/ 1. salviamo il programma in un file di testo avente estensione.c, ad esempio esempio.c 2. serviamoci del compilatore per passare dal file di testo (linguaggio C / comprensibile all utente) al programma eseguibile (linguaggio macchina/comprensibile al processore). gcc -o esempio -Wall esempio.c -o dopo questa opzione va indicato il nome del file (sta per output) in cui il compilatore salverà il file da lui prodotto (in questo caso esempio) -Wall W sta per warning, l opzione serve per attivare tutti (all) gli avvisi possibili NOTA! il file può avere un nome qualsiasi, non serve abbia un estensione particolare 3. mandiamo in esecuzione il file eseguibile./esempio Come mai dobbiamo anteporre./ al nome del file eseguibile? Per motivi di sicurezza il sistema operativo manda in esecuzione in modo automatico solo i file eseguibili che si trovano in un elenco prestabilito di directory. Tutti gli altri file si possono mandare in esecuzione a patto di specificarne esattamente la posizione.
4. controlliamo che il file eseguibile abbia i privilegi per poter essere mandato in esecuzione utilizziamo il comando ls -al dovremmo vedere che, mentre il file esempio.c possiede i privilegi rw-, il file esempio possiede tutti e tre i privilegi, rwx
Prima di iniziare a scrivere un programma Ordine! abituatevi a progettare il codice su un foglio di carta, anche se si tratta di poche righe o di qualcosa che ritenete essere banale. Fate in modo che l indentazione del codice rispecchi la sua struttura. Aggiungete dei commenti (con moderazione...) Una sintassi corretta ma priva di significato non produce un buon algoritmo (anzi, spesso si ottengono dei danni!). Il compilatore controlla la sintassi ed il lessico, purtroppo/per fortuna non controlla la semantica. Imparate dagli sbagli; se il compilatore genera un errore o un warning (la lingua del compilatore è l inglese!), ricordiamocene ed impariamo a riconoscerlo Fate dei test man mano che scrivete il codice, non aspettate di verificarne la funzionalità dopo aver scritto pagine e pagine. Ragionate!! Divertitevi!!
Cominciamo con un esempio semplice, cercando di seguire i passi della compilazione. Supponiamo che il codice venga salvato in un file che si chiama primo_test.c Prima di tutto verifichiamo la correttezza del codice mediante il compilatore gcc o primo_test Wall primo_test.c Se non vengono osservati errori, cerchiamo di analizzare quali sono i passaggi che ci portano dal codice C al file scritto in linguaggio binario. Verifichiamo il primo passo: l azione del preprocessore (punti 1 e 2 della ricetta della pasta al forno) gcc E primo_test.c Con questo comando mandiamo a video il risultato dell azione del preprocessore; con l operatore di redirezione possiamo anche mandare su file tale output gcc E primo_test.c > risultato_preprocessore Ora vediamo come è fatto un file scritto in assembly (punto 3 (in parte) della ricetta della pasta al forno) gcc S primo_test.c Otteniamo un file che si chiama primo_test.s -> visualizziamone il contenuto con un editor di testo Proviamo ora a dare un occhiata al file primo_test