Il laboratorio di Fisica Computazionale: strumentazione

http://www.laureescientifiche.units.it/
Il laboratorio di Fisica Computazionale:
strumentazione
G. Pastore, M. Peressi
Dip. Fisica - Università di Trieste
(aggiornamento e formazione insegnanti;
corso CIRD - CP e M IDIFO3: Lab_A I15)
• L’ hardware per la fisica computazionale
• Strumenti software
• sistemi operativi
• programmazione
• pre- e post-processing
• Criteri di valutazione per le scelte SW
L’ hardware per la fisica computazionale
Non è un problema:
qualsiasi computer di tipo generale
attualmente in commercio dispone di una
potenza di calcolo superiore a quanto
necessario per il più ambizioso progetto
ragionevole per studenti delle superiori.
Strumenti SW: sistema operativo
Il sistema operativo (S.O.) gestisce tutte le componenti HW del
computer e sovrintende a tutte le attività (processi).
In questo momento il panorama delle possibilità è ristretto a due
grandi famiglie: Unix (in tutte le varianti, inclusi MacOsX e Linux)
e Windows (in tutte le varianti e versioni attualmente disponibili).
Dal punto di vista delle funzionalità di base e del supporto ad
attività computazionali non c’è una differenza sostanziale tra le due
alternative. In genere, la scelta è legata a vincoli esterni e
considerazioni che esulano dal contesto computazionale (budget,
sicurezza,conoscenze, ….).
Una considerazione a parte può esser fatta sulla disponibilità di
strumenti di sviluppo per le due piattaforme. Un’ analisi dell’ offerta
di mercato lungo questa linea, che esula dallo scopo di questo corso,
dovrà tener conto dei vincoli di budget e delle politiche generali
stabilite a riguardo, nel contesto operativo concreto (es. necessità
relative a software specifico per altre attività)
Strumenti SW: programmazione
I linguaggi di programmazione assolvono un duplice
scopo:
1.
comunicazione uomo-macchina: descrivere ad un
livello più astratto del linguaggio macchina i passi
di elaborazione da compiere;
2. comunicazione tra esseri umani (programmatorealtri programmatori, programmatore-utilizzatori,
programmatore-con-se-stesso);
Strumenti software: programmazione
I linguaggi di programmazione possono essere classificati secondo diverse
categorie. Qui ci limiteremo a quelle più rilevanti per la valutazione
degli strumenti in ambito computazionale.
-Livelli
-Espressività
-Efficienza della traduzione in linguaggio macchina
-Maturità
-Standardizzazione
-Base utilizzatori
-Software esistente
-Curva di apprendimento
-Disponibilità di ambienti di sviluppo
Programmazione - livelli dei linguaggi
Tradizionalmente si assegna ad un linguaggio di programmazione un
livello tanto più alto quanto più ci si allontana dalle particolarità
dell’ HW e ci si avvicina alla descrizione del problema in termini del
linguaggio naturale per la/le discipline ad esso rilevanti.
Esempio: calcolo della derivata in x della funzione f(x)=x2 :
Assembler
(generato
dal compilatore)
MAIN__:
pushl
movl
subl
movl
movl
call
movl
movl
movl
movl
leal
movl
call
movl
leal
movl
leal
movl
call
movl
leal
movl
leal
%ebp
%esp, %ebp
$376, %esp
$options.0.1502, 4(%esp)
$8, (%esp)
_gfortran_set_options
$.LC0, -352(%ebp)
$3, -348(%ebp)
$128, -360(%ebp)
$5, -356(%ebp)
-360(%ebp), %eax
%eax, (%esp)
_gfortran_st_read
$4, 8(%esp)
-20(%ebp), %eax
%eax, 4(%esp)
-360(%ebp), %eax
%eax, (%esp)
_gfortran_transfer_real
$4, 8(%esp)
-16(%ebp), %eax
%eax, 4(%esp)
-360(%ebp), %eax
movl
%eax, (%esp)
call
_gfortran_transfer_real
leal
-360(%ebp), %eax
movl
%eax, (%esp)
call
_gfortran_st_read_done
flds
-20(%ebp)
flds
-16(%ebp)
faddp %st, %st(1)
fld
%st(0)
fmulp %st, %st(1)
flds
-20(%ebp)
flds
-16(%ebp)
fsubrp %st, %st(1)
fmul
%st(0), %st
fsubrp %st, %st(1)
flds
.LC1
fdivrp %st, %st(1)
flds
-16(%ebp)
fdivrp %st, %st(1)
fstps -12(%ebp)
movl
$.LC0, -352(%ebp)
movl
$5, -348(%ebp)
……
Programmazione - livelli dei linguaggi
Esempio: calcolo della derivata in x=2 della funzione f(x)=x2 :
C
Fortran
Mathematica
#include <stdio.h>
int main(void){
float h,x,der;
scanf("%f%f",&x,&h);
der=( (x+h)*(x+h)-(x-h)*(x-h))/2/h;
printf("%f \n",der);
}
program deri
real :: h,x,der
read*,x,h
der=( (x+h)**2-(x-h)**2)/2/h
print*,der
end program deri
In[3]:= F[x_]:=x^2
In[4]:= F'[x]
Out[4]= 2 x
In[5]:= F'[2]
Out[5]= 4
basso “alto livello”
|
alto livello
|
altissimo livello
Un linguaggio di altissimo livello come Mathematica permette di aderire
in modo completo alla descrizione del problema nell’ ambito specifico.
Per contro si perde l’ informazione sull’ approccio e gli algoritmi
utilizzati.
Programmazione - espressività
Linguaggi dello stesso livello possono avere diversa espressività
in funzione dei diversi tipi dati, strutture di controllo ed
espandibilità disponibili
Es. Coordinata x della posizione di un pianeta
Posizione(1,I)
Pianeta[i].coordinata_x
Programmazione - Efficienza della
traduzione in linguaggio macchina
Programmi scritti in linguaggi di programmazione di vario livello
vengono tradotti con vari meccanismi in applicazioni in linguaggio
macchina (intepreti, compilatori, bytecode intermedi).
I diversi meccanismi possono fornire diversi livelli di efficienza e, anche
all’ interno di un dato meccanismo, per esempio linguaggi compilati, l’
efficienza della traduzione varia da software a software e, in alcuni
casi può anche essere esplicitamente modificata
(livelli di ottimizzazione).
Poco importante per le applicazioni didattiche.
Programmazione - maturità
Ogni linguaggio di programmazione subisce un’ evoluzione analoga a
quella dei linguaggi naturali.
Alcuni linguaggi hanno più di 50 anni di vita (Fortran, Cobol, …)
E subiscono un processo di evoluzione continua, ma hanno comunque
raggiunto una notevole stabilità (compatibilità all’ indietro).
Altri, più recenti, sono ancora sottoposti a frequenti modifiche
sostanziali, richiedendo in alcuni casi cambiamenti anche pesanti nei
codici sviluppati.
Programmazione - standardizzazione
Per alcuni linguaggi, si è proceduto ad una standardizzazione che
garantisce comportamenti dei codici coerenti ed equivalenti su
piattaforme HW e SW diverse.
Il processo di standardizzazione rende più lenta l’ evoluzione del
linguaggio ma in genere rappresenta un vantaggio per il programmatore.
La presenza di standard pubblici rende non ambiguo il comportamento
dei codici e garantisce la portabilità dei programmi a livello sorgente.
Programmazione - base di utilizzatori
La presenza di un numeroso gruppo di utilizzatori, pur non essendo un
obbligo, garantisce:
1.
interesse allo sviluppo del linguaggio e degli strumenti
SW collegati anche da parte di aziende;
2. esistenza di documentazione;
3. spinta all’ evoluzione del linguaggio
4. possibilità di confronto con altri programmatori su
temi di comune interesse
Programmazione - SW esistente
Per ogni linguaggio di programmazione esistono biblioteche di programmi
e sottoprogrammi che implementano moltissime funzionalità utili in
diversi ambiti applicativi.
Utile un’ indagine su quanto è disponibile per il proprio campo di
interesse.
Programmazione - curva di apprendimento
La velocità di apprendimento è un parametro difficile da misurare.
Tuttavia, proprio in ambiente didattico riveste una particolare importanza.
In genere linguaggi non fortemente “tipizzati” possono risultare di più
facile apprendimento perché meno rigidi su un aspetto importante della
sintassi.
Questo vantaggio va però soppesato in confronto ad una maggiore
“disciplina” di programmazione a livello di un “primo linguaggio”
Va anche tenuto conto della semplificazione per l’ apprendimento
offerta dagli strumenti di sviluppo disponibili.
Programmazione: ambiente di sviluppo
IDE (Integrated Development Environment): SW di sviuppo, in genere
costituito da un editor, un compilatore (o interprete), un sistema
automatico di costruzione di applicazioni e un debugger fortemente
integrati e spesso accessibili mediante un’ interfaccia grafica.
A volte con sistemi di controllo versione.
Alcuni sono multilinguaggio (NetBeans, Eclipse, Visual Studio), altri
legati ad un singolo linguaggio e/o su singola piattaforma (Delphi, VB)
Debugger: strumenti per l’ esecuzione controllata di programmi in
fase di sviluppo. Per ottimizzarne le prestazioni è necessario un certo
grado di compatibilità ed integrazione con i compilatori. In ambiente
Unix interessante interfaccia grafica (DDD).
Text editors. Molti, alcuni mono-piattaforma, altri multipiattaforma.
Generici/orientati a linguaggi (Notepad, Jedit, Nedit, Emacs, vi/vim,…)
Programmazione: paradigmi
Con paradigmi di programmazione si intende i diversi approcci all’
analisi e alla descrizione di un problema in vista della sua
implementazione a livello di codice.
I linguaggi di alto livello correntemente usati per attività
computazionali sono tutti di tipo imperativo (elaborazione come
sequenza di istruzioni).
Sono però possibili scelte di analisi molto diverse da approcci
procedurali a quelli orientati agli oggetti.
Approccio proceduurale: separazione tra dati e azioni da compiere
su di essi.
Approccio ad oggetti: dati ed azioni sui dati sono integrati in entità
uniche.
Programmazione: paradigmi
Quale paradigma scegliere ?
Risposta opportunistica: quello che si conosce meglio
Risposta “pedagogica”: quello che “distrae” meno dal problema
computazionale
pre- e post-processing
Preparazione dei dati secondo un determinato formato richiesto da
un’ applicazione, estrazione di alcuni campi, ricerca di dati,
visualizzazione, trasformazione dei dati, sono attività utili (alcune
indispensabili ) nel laboratorio computazionale.
Molte di queste attività possono essere svolte mediante strumenti
di programmazione “leggeri” (tools e linguaggi di scripting) che
ricoprono un ruolo di “collante” tra applicazioni diverse.
Alcuni linguaggi di programmazione (Tcl/Tk, Python, Perl,…) hanno
caratteristiche comuni con linguaggi di scripting puri (come le shell
unix o powershell (o mingw/cygwin) su windows).
Per la visualizzazione invece, data la sua importanza e specificità,
occorre una discussione a parte.
scripting
I linguaggi di scripting automatizzano operazioni di trasformazione/
preparazione dei dati e lancio di applicazioni, rendendone più semplice
la ripetibilità ma anche la documentazione.
Conoscenza di tecniche di scripting e tools di manipolazione dei dati
sono utili (principalmente per il docente) ma non indispensabili nel
laboratorio computazionale.
Visualizzazione
Non è impossibile costruire un proprio programma per visualizzare i
risultati computazionali o inserire in un programma numerico le
chiamate a librerie di visualizzazione più o meno integrate col
linguaggio.
Diverse possibilità multipiattaforma: linguaggi con grafica integrata
(Java, Python, Tcl/Tk) o librerie di grafica (PGLplot, DISLIN,…)
Tuttavia, la pratica computazionale richiede di poter tornare sull’
analisi dei dati in tempi successivi. L’ analisi dei dati è sempre un
processo dinamico e investigativo in cui occorre poter modificare in
tempo reale le modalità di visualizzazione e anche modificare al volo,
in modo anche complesso, i dati originali.
Un approccio modulare, in cui la produzione dei dati è una fase
nettamente separata da quella della loro analisi si rivela, alla lunga,
più produttivo e più facilmente mantenibile nel tempo.
Strumenti di visualizzazione
multipiattaforma
Queste considerazioni motivano verso la scelta di uno strumento di
visualizzazione che offra anche possibilità di modifica e fltro degli
stessi dati.
Grafica 2D, alcune capacità 3D: gnuplot, xmgr/xmgrace
Modellizzazione di molecole: jmol
Per saperne di più
Linguaggi di programmazione (in generale):
http://it.wikipedia.org/wiki/Linguaggio_di_programmazione
http://it.wikipedia.org/wiki/Programmazione_orientata_agli_oggetti
Scripting:
Bash: http://www.gnu.org/software/bash/
Tcl/Tk: http://www.tcl.tk/
Python: http://www.python.it/
Visualizzazione:
Gnuplot: http://www.gnuplot.info/
Xmgr/xmgrace http://plasma-gate.weizmann.ac.il/Grace/
DISLIN: http://www.mps.mpg.de/dislin/
PGPLOT: http://www.astro.caltech.edu/~tjp/pgplot/
Per saperne di più
Linguaggi di programmazione :
C http://www.physics.drexel.edu/courses/Comp_Phys/General/C_basics/
C++ http://www.cplusplus.com/doc/tutorial/
Fortran http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/fortran.html
Java http://download.oracle.com/javase/tutorial/