Informatica. AA 2009/10.
Lezione di laboratorio n. 1

Scopo di questa lezione è di familiarizzarsi con le manipolazioni di base di files e directories, con l' interfaccia di linea, con il programma gnuplot per il tracciamento di grafici e con il meccanismo di scrittura, compilazione ed esecuzione  di semplici programmi. I programmi si limitano a leggere un input e mostrarlo in output, eventualmente dopo pochi calcoli numerici.

  1. La prima cosa da imparare a fare è l' operazione di "lanciare" un programma, ovvero richiederne l' esecuzione al sistema operativo attraverso l' interprete di comandi. Il funzionamento dell' interprete di comandi UNIX è  il seguente:  in genere l ' interprete di comandi segnala di essere in attesa di un comando  visualizzando sullo schermo una scritta (il prompt) dopo la quale appare qualsiasi carattere venga digitato sulla tastiera.
    Il prompt varia da sistema a sistema e da utente a utente (eventualmente è riconfigurabile dall' utente).
    Se digito qualcosa da tastiera e premo il tasto "invio" (o "enter" o  "return"  a seconda della testiera) l' interprete decomporrà in parole la sequenza di caratteri dell' input, utilizzando uno o più spazi, eventualmente presenti, come separatori. La prima parola così ottenuta sarà considerata un possibile nome di file contenente istruzioni macchina oppure istruzioni per l' interprete. Se il file viene indicato mediante il nome corto verrà  ricercato solo all' interno di un insieme di directory predefinito (il cosiddetto path). Posso sempre indicare in modo compatto il nome lungo di un file nella directory corrente premettendo ./ al suo nome corto.  Il punto davanti allo slash (./)  rappresenta la directory corrente.

    Un comando utilissimo nell' ambito della visualizzazione di dati scientifici, disponibile quasi universalmente nei sistemi linux (ma ne esistono versioni per Windows e per MacOsX), è gnuplot.  Questo permette di ottenere facilmente grafici di dati o funzioni  di una o due variabili.
    Lanciare l' applicazione gnuplot e dare il comando seguente per avere  informazioni  sul  comando "plot"

    help plot

    Provare poi a dare il comando

    plot  [0:4*pi]  sin(x)

    o la sequenza

    set isosampl 40,40

    set hidden

    splot [-2.5:2.5][-2.5:2.5] exp(-(x**2+y**2))*sin(x*y)

    Provare con altre funzioni e, nei prossimi giorni, prima della prossima lezione, provare a seguire qualcuno degli esempi dell' help.

  2. Dall' interprete di comandi, verificare qual è  la directory corrente mediante il comando pwd.  Esaminare quali file sono contenuti nella directory corrente mediante il comando ls.   Creare una directory di nome es1. (Il comando è  mkdir  es1.  Verificarne la modalità  di utilizzo mediante il comando  man mkdir ). Una volta creata la directory es1, si potrà far diventare questa la directory di default col comando   cd es1. In questo modo tutti i nomi "corti" dei files saranno completati dal sistema con la gerarchia di directory che termina in es1:  p.es     il file   pippo   sarà interpretato come corrispondente al nome lungo /home/user/es1/pippo.

  3.  
  4. Creare mediante l' editor  (dove mai sarà  l' icona dell' editor di testi ?)   un file di testo di nome primo.f90 contenente il seguente programma Fortran che legge l' input dalla tastiera e lo mostra su schermo.
  5. program echo
       character(len=30) :: input
       read*,input
       print*,input
    end program echo
     
  6. Il programma Fortran (codice sorgente) non è direttamente eseguibile o interpretabile da parte del computer. Occorre procedere ad un passo intermedio che è  la compilazione del programma. Questo significa usare il codice sorgente come input di un programma del sistema (il compilatore) che è in grado di tradurre le istruzioni simboliche del Fortran (o di altro linguaggio di programmazione) in istruzioni macchina rappresentate mediante la codifica binariaappropriata per il  processore con cui si sta lavorando. Il compilatore genera un file in output che contiene tali istruzioni binarie. In pratica si può procedere così:
    1. assicurarsi che la directory di default  contenga il file  primo.f90   (p.es. col comando ls) ;
    2. quindi compilare il programma mediante l' istruzione
  7. g95 primo.f90

  8. Verificare mediante il comando ls quali files sono presenti nella directory corrente.     Usare il comando
    ls -l
    ( attenzione: l' opzione -l corrisponde ad una  elle minuscola)  per avere un' informazione più dettagliata sulle proprietà dei files presenti.

  9.  
  10. Cambiare il nome del file a.out in primo.x. (con il comando  "mv a.out  primo.x".  Verificare prima e dopo col comando ls la situazione dei files nella directory corrente).

  11.  
  12. Eseguire il file primo.x digitandone il nome (quasi sicuramente, ma dipende dalla configurazione del sistema, il nome del file  va preceduto da ./  ,  Es:  ./primo.x ) e premendo "invio". Attenzione, quando il programma viene eseguito, la prima istruzione "aspetta" silenziosamente un input da tastiera. L' input termina quando si preme il tasto "invio". L' esigenza o meno di dover premettere la directory corrente ( ./ ) al nome del file eseguibile dipende da come è  configurato il "path"  ovvero l' insieme di directory  in cui il sistema cerca un file col nome del comando.  Se la directory corrente ( indicata da   . )  non figura tra le componenti del path (visualizzabile mediante il comando echo $PATH)  può  sempre essere aggiunta mediante il comando (da dare all' interprete di  comandi):   export  PATH=.:$PATH.

  13. Modificare il programma precedente in modo che scriva su schermo  che è in attesa di input.  Per un' informazione sul fatto far scrivere un testo su schermo è sufficiente aggiungere  l' istruzione  print*,"qui tra i doppi apici quello che voglio scrivere  su schermo" prima della linea contenete l'  istruzione read. Ricompilare ed eseguire.
  14.  
  15. Creare mediante l' editor un file di testo contenente il seguente programma Fortran che risolve l' equazione generica di secondo grado a coefficienti reali. Compilare ed eseguire il programma con input diversi e verificare i risultati ottenuti. Che succede se i valori dei coefficienti corrispondono ad un discriminante negativo ? Provare.
  16. program secondo_grado

           
          implicit none              
    ! l' istruzione precedente obbliga a definire esplicitamente il tipo di ogni variabile

         
          real    :: a,b,c            ! i coefficienti reali dell' equazione
                                      ! a x**2 + b x + c = 0

          real :: discr,xp,xm      ! discriminante e soluzioni corrispondenti
                                      ! alle due scelte del segno davanti la
                                      ! radice quadrata

          read*, a,b,c                ! i coefficienti vengono letti

          discr = b**2 - 4*a*c
          xp = ( -b + sqrt(discr) )/(2*a)
          xm = ( -b - sqrt(discr) )/(2*a)

          print*,xp,xm
    end program secondo_grado


  17. Il meccanismo di scrittura-compilazione-esecuzione è comune a tutti i lunguaggi compilati. Creare un file di testo di nome primo.c contenente la seguente versione C del programma primo.f90. Compilarlo mediante gcc primo.c ed eseguire il codice binario con il comando ./a.out
    #include <stdio.h>

    int main(void)
    {
    char input[31];
    scanf("%30s",input);
    printf("%s",input);
    return 0;
    }



Si consiglia di svolgere i seguenti esercizi individualmente prima della prossima sessione di laboratorio.
  1. Quanti programmi sono in esecuzione in questo momento sul sistema che state usando ? La lista completa viene fornita dal comando

    ps aux

    Di quanta RAM dispone il processore su cui state lavorando ? L' informazione è recuperabile mediante il comando

    top


  2. Usare il comando man per ottenere informazioni sull' uso dei comandi: ls, pwd, mv, cp, cd, rm, mkdir, rmdir

  3. Si consiglia, per prender pratica con l' interfaccia di linea unix (shell) di dedicare un po' di tempo a seguire interativamente il tutorial indicato alla fine di questa pagina.
  4. Provare infine con un esempio di grafico mediante gnuplot più interessante: il grafico delle isoterme di van der Waals. Queste sono le curve che rappresentano, in modo approssimato,  a varie temperature, la relazione pressione/volume  di un fluido. Si possono ottenere mediante i seguenti comandi:

    R=0.0821
    a=4.18
    b=0.0371
    p(x,T)=R*T/(x-b) - a/x**2
    plot [0.05:0.5] [0:300] p(x,300),p(x,350),p(x,400),p(x,450)
    I valori di a e b sono quelli relativi all' NH3. Altri valori sono: Ar (1.34,0.0322), CO2 (3.59,0.0427), He (0.034,0.0237).

Per chi volesse familiarizzarsi rapidamente con i principali comandi della shell (l'interpretedi comandi), suggerisco di dedicare un po' di tempo a seguire (davanti ad un computer)  il tutorial UNIX Tutorial for Beginner, di  M.Stonebank@surrey.ac.uk (URL: http://www.ee.surrey.ac.uk/Teaching/Unix/ ).  Il tutorial contiene molto piu'  materiale di quello che servira'  nel seguit di questo corso.