\begin{frame}
  \frametitle{}
  \begin{center}
    {\Large Programmazione}
  \end{center}
\end{frame}

\begin{frame}
  \frametitle{Programmazione}
  \color{Blu}{Stili di programmazione}
  \begin{columns}
    \begin{column}{.5\textwidth}
      \begin{itemize}
      \item Imperativo, monolitico (assembly)
      \item Strutturato, modulare (c, fortran)
      \end{itemize}
    \end{column}
    \begin{column}{.5\textwidth}
      \begin{itemize}
      \item Funzionale (Lisp 1958, php)
      \item Ad oggetti (c++, java, python)
      \end{itemize}
    \end{column}
  \end{columns}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Algoritmi}
  \color{Blu}{L'algoritmo è una sequenza di istruzioni per compiere un calcolo}
  \begin{itemize}
  \item Ada Lovelace, Charles Baggage, Luigi Menabrea sulla macchina analitica (1843)
  \item Macchina di Turing (1936), una sequenza di istruzioni I/O e un processore come strumento ideale per la definizione di un algoritmo
  \end{itemize}
\begin{columns}
  \begin{column}{.5\textwidth}
\begin{verbatim}
double d(double x,int N){
  double  d = 0.,fact1 = 1.,fact2 = 1.;
  for(int i=0;i<N;i++){
    fact1 *= (x - 1.);
    fact2 *= x;
    d += fact1/fact2;
  }
  return d;
}
\end{verbatim}
  \end{column}
  \begin{column}{.5\textwidth}
    \begin{equation}
      d_N(x)=\sum_{i=0}^N\frac{(x-1)^N}{x^N} \nonumber
    \end{equation}
  \end{column}
\end{columns}
\end{frame}

\begin{frame}
  \frametitle{Concetti}
  \color{Blu}{Concetti di programmazione}
  \begin{columns}
    \begin{column}{.5\textwidth}
      \begin{itemize}
      \item Memoria
      \item Variabili
      \item Compilazione
      \item File oggetto
      \end{itemize}
    \end{column}
    \begin{column}{.5\textwidth}
      \begin{itemize}
      \item Librerie
      \item Linking
      \item Debugger
      \item Profilazione
      \end{itemize}
    \end{column}
  \end{columns}
\end{frame}

\begin{frame}
  \frametitle{Memoria}
  \color{Blu}{Cache}
  \begin{itemize}
  \item Memoria messa a disposizione del processore in run time
  \item Il livello di cache determina la velocità di accesso alla memoria
  \end{itemize}
  \color{Blu}{Fissa}
  \begin{itemize}
  \item Legge e scrive su disco
  \end{itemize}
  \color{Blu}{RAM}
  \begin{itemize}
  \item Memoria condivisa dal sistema
  \end{itemize}
  \color{Blu}{Multiprocessore}
  \begin{itemize}
  \item Evitare gli scambi di informazioni tra memorie di processori diversi (lento)
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Variabili}
  \color{Blu}{Variabile}
  \begin{itemize}
  \item Posizione di memoria: fissa o dinamica allocata in compilazione o in run time
  \item Tipo: modalità in cui viene interpretata la sequenza di bit (segno, esponente, mantissa, \ldots) (int 1B, float 1B, double 2B, bool 1b, char 1B, \ldots)
  \end{itemize}
  \color{Blu}{Locali/globali}
  \begin{itemize}
  \item Locali: vengono lette e scritte solo all'interno della funzione/classe
  \item Globali: occupano uno spazio fisso nel programma e possono esser lette/scritte da qualsiasi funzione o classe (pericoloso!!)
  \end{itemize}
  \color{Blu}{Puntatori}
  \begin{itemize}
  \item Occupano uno spazio in memoria e un indirizzo che può essere associato ad un'altra locazione di memoria
  \item Serve per leggere e scrivere altre variabili dello stesso tipo
  \end{itemize}
  \color{Rosso}{Importantissimo: imparare a dare nomi sensati alle variabili!!!!}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Funzioni}
  \color{Blu}{Dichiarazione}\\
\begin{verbatim}
double sqr(double a){
  return a*a;
}
\end{verbatim}
\begin{itemize}
\item Riceve degli argomenti
\item Definita da un tipo
\item Ritorna lo stesso tipo
\item Si instanza
\end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Programmazione ad oggetti}
  \color{Blu}{Oggetto}
  \begin{itemize}
  \item Ha le proprie variabili, funzioni, construttore, distruttore
  \item L'oggetto va pensato come struttura a se stante, da utilizzare come scatole chiuse
  \item Ereditarietà
  \end{itemize}
\begin{verbatim}
class Telefono:Comunicazioni{
  public:
  Telefono();
  ~Telefono();
  bool SeLinea,SeAcceso;
  float Mic;
  float Audio;
  int Numero;
};
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Programmazione funzionale}
  \color{Blu}{Definizione più generale del problema, più delicato}
\begin{verbatim}
(defun factorial (n)
   (if (<= n 1)
       1
       (* n (factorial (- n 1)))))
\end{verbatim}
\begin{verbatim}
(defun pow (x n)
   (if (<= n 1)
       x
       (* x (pow (x) (- n 1)))
   )
)
\end{verbatim}
\end{frame}

\begin{frame}
  \frametitle{Compilazione}
  \color{Blu}{Prima della compilazione }
  \begin{itemize}
  \item Il preprocessore sostituisce esplicitamente la macro con la stringa a cui si riferisce
  \item Ricordano le funzioni inline [c++], static [c]
  \end{itemize}
  \color{Blu}{Opzioni per il compilatore}
  \begin{itemize}
  \item static
  \item restrict
  \item virtual
  \end{itemize}
  \color{Blu}{Opzioni di compilazione, flag}
  \begin{itemize}
  \item -w warnings
  \item -o0 -o1 -o2 ottimizzazione
  \item -g debugger
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Debugger}
  \color{Blu}{Bug}
  \begin{itemize}
  \item Segmentation fault: lettura oltre gli elementi di memoria allocati
  \item Aritmetic exepction: incongruenze come 1./0. o sqrt(-1.) (possono essere disibilitati in compilazione)
  \end{itemize}
  \color{Blu}{gdb}
  \begin{itemize}
  \item bt backtrace
  \item breakpoint
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Logging}
  \color{Blu}{Output del programma su shell o su file}
  \begin{itemize}
  \item Ottimo strumento per gestire gli errori, controllare gli accessi
  \item /var/log/ per i principali programmi
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Profilazione}
  \color{Blu}{Nella scrittura:}
  \begin{itemize}
  \item Evitare il calcolo di sin cos sqrt e 1./ (lenti)
  \item Trovare la migliore struttura per allocare i dati per evitare i salti di memoria
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Librerie grafiche}
  \color{Blu}{Sviluppo di GUI}
  \begin{itemize}
  \item Qt, GTK+, Motif (1980)
  \item libpng, libtiff, libcairo
  \end{itemize}
  \color{Blu}{3D}
  \begin{itemize}
  \item openGL
  \item compiz
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Librerie}
  \color{Blu}{Librerie scientifiche}
  \begin{itemize}
  \item gsl (matematica)
  \item CGAL (trasformazioni e ordinamento geometrico)
  \item Elmer (elementi finiti)
  \item splines, bezier
  \end{itemize}
  \color{Blu}{API/Application programming interface}
  \begin{itemize}
  \item Librerie standard 
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Documentazione}
  \color{Blu}{Commentare}
  \begin{itemize}
  \item Scrivere nel sorgente la licenza, il contenuto del file, lo scopo delle funzioni e passaggi delicati
  \end{itemize}
  \color{Blu}{Documentare}
  \begin{itemize}
  \item doxygen (documentazione automatica, pdf, html)
  \item wiki (editata dagli utenti)
  \item blog
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Controllo di versione}
  \color{Blu}{Evoluzione di un programma}
  \begin{itemize}
  \item fork (costola di un programma)
  \item trunk (versione più sviluppata)
  \item branch 
  \item stable (versione +/- fuori dallo sviluppo)
  \end{itemize}
  \color{Blu}{Sviluppo di gruppo (subversion, bazaar)}
  \begin{itemize}
  \item commit (publica un file)
  \item update (aggiorna la macchina locale con i cambiamenti)
  \item diff (mostra la differenza tra le versioni)
  \item add/del (aggiunge/rimulve un file dal repository)
  \end{itemize}
\end{frame}
