Esercitazioni del corso di Laboratorio di Calcolo (II)
     n. 2
    uso di emacs, del preprocessore e del compilatore gcc


  1. create un sottodirettorio ex2 (usando il comando mkdir)
  2. spostatevi in ex2 (usando il comando cd)
  3. usate emacs per creare il file temperature.c  contenente il programma illustrato a lezione (Barone et al. pagina 77, listato 3.7) : emacs temperature.c &, inserite il codice , salvate con Save Buffer dal menu File oppure  con C-x C-s).

  4. NB: le tastiere italiane (che prevedono caratteri speciali come le lettere accentate) non prevedono caratteri quali { } e ~ che vi serviranno spesso. Chi dovesse avere una tastiera italiana utilizzi
                    AltGr insieme al tasto 7 per {
                    AltGr insieme al tasto 0 per }
                    AltGr insieme al tasto  ^ per ~

  5. invocate il precompilatore, ovvero date il comando gcc    -E    temperature.c : come potete vedere l'uscita di questo comando e` inviata direttamente allo schermo, per poter visualizzare il codice precompilato avete bisogno di ridirigere questa informazione su un file. Questa operazione si effettua in UNIX mediante il comando > . Provate quindi a dare il comando gcc   -E     temperature.c   > precompilato1.c . Modificate temperature.c rimuovendo la direttiva #define TF2TC e  ripetete la precompilazione ridirigendo l'uscita su un altro file mediante il comando gcc   -E     temperature.c   > precompilato2.c
  6. Visualizzate il contenuto dei files precompilato1.c e precompilato2.c con il comando more seguito dal nome del file. Potete osservare che il precompilatore ha inserito, oltre a molte righe vuote, tantissimo codice in cima al vostro programma: si tratta di una copia del file stdio.h che definisce le funzioni che gestiscono l'Input/Output (ed in particolare printf e scanf). Potete verificarlo andando ad aprire, sempre con more, il file /usr/include/stdio.h.
  7. Potete inoltre verificare che, come illustrato a lezione, il codice che appare nel main in fondo ai due file precompilati e' differente a causa delle direttive #ifdef TF2TC etc...
  8. Potete anche verificare che la direttiva #define TF2TC inserita nel codice sorgente puo' anche essere fornita esternamente  mediante l'opzione -D del compilatore gcc   -DTF2TC -E     temperature.c   > precompilato3.c e confrontando tra di loro precompilato1.c e precompilato3.c (potete confrontare due file con il comando unix diff    file1    file2 : se non ottenete risposta vuol dire che non ci sono differenze, le righe diverse sono indicate con > e < )
  9. a questo punto, ora che sapete come agisce il precompilatore, potete passare al compilatore vero e proprio. Potete invocarlo sia partendo dal file da precompilare che partendo dal file precompilato con i comandi gcc -S temperature.c  (senza #define TF2TC) e gcc -S precompilato2.c  e potete verificare che si ottiene lo stesso file assembly in uscita (lo potete guardare con more e potete confrontare due file con il comando unix diff    file1    file2 ).
  10. dopo la compilazione avete bisogno dell'assembler, che si invoca col comando gcc   -c    nomefile   e che puo` agire su uno qualunque dei files che avete creato fino ad ora (temperature.c,precompilato1.c,temperature.s,precompilato1.s ...) e che produce nomefile.o. Il comando more vi consente di sbirciare anche dentro a questo file senza far danni, ma come potete vedere e` scritto in un formato non visualizzabile. Per visualizzarne il contenuto il formato esadecimale potete usare il comando od -x nomefile.o.
  11. per ottenere un eseguibile invece dovete invocare gcc, di nuovo su uno qualunque dei files precedenti, senza opzioni (o solo con l'opzione -o nomeeseguibile posta alla fine della riga di comando se volete dare un nome diverso da a.out al vostro eseguibile: gcc temperature.c -o temperature).
  12. per eseguire il programma e` sufficiente scrivere il nome dell'eseguibile, eventualmente preceduto da ./ per indicare che l'eseguibile si trova nel direttorio corrente (.) qualora il sistema vi rispondesse "command not found" (vuol dire che la vostra SHELL non e' ben definita e il direttorio corrente non e' nella lista, detta PATH, di quelli tra i quali cercare gli eseguibili).