## Compilazione
* Il *compilatore* trasforma il vostro codice in un eseguibile
* Una volta compilato, il vostro codice può essere eseguito
* Il processo di compilazione va ripetuto dopo ogni modifica al codice
```bash
$ gcc -o hello hello.c
$ ./hello
Hello, world
$ ./hello
Hello, world
```
## Interpretazione
* L'*interprete* esegue il vostro codice riga per riga
* L'interprete va chiamato ogni volta che volete eseguire il vostro programma
```bash
$ python3 hello.py
Hello, world
$ python3 hello.py
Hello, world
```
---
# In questo corso: C e Python
* C è un linguaggio compilato
* Vantaggi: veloce, standard per programmi di sistema e, in parte, codici scientifici
* Svantaggi: basso livello, sintassi complicata, "vecchio"
* Python è un linguaggio interpretato
* Vantaggi: espressivo, tantissime librerie anche per uso scientifico, standard per il machine learning
* Svantaggi: "lento"
* Useremo principalmente il C, che verrà sviluppato durante il corso del prossimo anno
* Usaremo Python principalmente per fare grafici (utile per il laboratorio di meccanica del prossimo semestre)
---
# Introduzione al C
* Il programma si scrive come un insieme di file di testo
* Convenzionalmente i codici sorgente del C hanno estensioni `.c` e `.h`
* Una volta scritto il codice, il programma va compilato
* Esistono tanti compilatori. Noi useremo `gcc` ([*GNU C Compiler*](https://gcc.gnu.org/))
* Apriamo un editor di testo, scriviamo il seguente programma e salviamolo come `hello.c`
```c
#include <stdio.h>
int main() {
// sommiamo degli interi e stampiamo il risultato
int a = 2;
int b = 3;
int sum = a + b;
printf("Hello world, a + b = %d\n", sum);
return 0;
}
```
---
# Come si compila un programma in C?
* Aprite un editor di testo (emacs, gedit, TextEdit per il Mac, *ecc*)
* Scrivete il codice di esempio
* Salvate il file usando l'estensione `.c` (es: `prova.c`)
* Alcuni editor non lo permettono: rinominate il file o lasciatelo così, non è grave
* La compilazione si esegue da terminale con il comando
```bash
$ gcc -o prova prova.c
```
* Nel comando precedente
* `gcc` è il comando che *invoca* il compilatore
* `-o prova` dice a `gcc` di chiamare il file eseguibile `prova`
* `prova.c` è il codice sorgente che vogliamo compilare
---
# Come si compila un programma in C?
Studiate sempre l'*output* del compilatore: potrebbe contenere eventuali errori che impediscono la compilazione. Ad esempio togliamo il `;` alla riga 7:
```bash
$ gcc -o prova prova.c
prova.c: In function ‘main’:
prova.c:8:5: error: expected ‘,’ or ‘;’ before ‘printf’
8 | printf("Hello world, a + b = %d\n", sum);
| ^~~~~~
```
* Usate `ls -l` per controllare se l'eseguibile esiste e a che ora è stato compilato
* Se c'è allora potete eseguirlo:
```bash [1|2]
$ ./prova
Hello world, a + b = 5
```
* Una volta compilato può essere eseguito quante volte volete
```bash [1-2|3-4]
$ ./prova
Hello world, a + b = 5
$ ./prova
Hello world, a + b = 5
```
---
# Analizziamo il nostro primo programma
Questo codice contiene già *quasi* tutto quello che dovrete imparare:
* Direttive del preprocessore: `#include`
* Dichiarazione di funzioni: in questo caso `main()`
* Commenti: la riga che comincia con `//`
* Dichiarazione e inizializzazione di variabili: `a`, `b` e `sum`
* Istruzioni per la manipolazione dei dati: `sum = a + b`
* Chiamata di funzione (`printf()`)
```c [1|3,11|4|5-7|8|10]
#include <stdio.h>
int main() {
// sommiamo degli interi e stampiamo il risultato
int a = 2;
int b = 3;
int sum = a + b;
printf("Hello world, a + b = %d\n", sum);
return 0;
}
```