Esercitazioni del
corso
di Laboratorio di Calcolo (II)
n. 2
uso di emacs, del preprocessore e del compilatore
gcc
- create un sottodirettorio ex2
(usando il comando mkdir)
-
spostatevi in ex2 (usando il comando cd)
-
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).
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 ~
- 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
-
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.
- 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...
-
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 < )
-
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 ).
-
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.
-
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).
-
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).