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/