# Linguaggi e concetti base di programmazione
## Scelta degli strumenti e dei linguaggi per il corso

Scegliere il linguaggio di programmazione per un corso di programmazione non è cosa facile ed esistono molte scuole di pensiero in materia. Nel tentativo di dare la maggior panoramica possibile sia per quanto riguarda i diversi paradigmi sia per quanto riguarda le diverse scelte a livello concettuale la scelta ricade sui seguenti:
* C/C++
* Java
* Python

## Concetti base di programmazione

In questa parte del corso verranno presi in esame concetti basilari della programmazione. Concetti che si possono incontrare in tutti i linguaggi di programmazione imperativa e ad oggetti. Alcuni di questi concetti, invece, non sono usati nella programmazione funzionale, che però sarà trattata più esaurientemente più avanti.

### Hello World

L'Hello World è tipicamente il primo programma che viene insegnato a scrivere agli aspiranti programmatori; esso è solitamente semplice nella scrittura, ma usa già diverse strutture del linguaggio di programmazione preso in oggetto.
Il programma esegue semplicemente la stampa a video su una finestra di shell (su Windows, di MS-DOS) della scritta Hello World, rimanendo in quello stato fino a quando l'utente non chiuderà la finestra relativa al programma (o non terminerà l'esecuzione dello stesso, se eseguito all'interno di un ambiente di shell).
In C, esso si scrive:
La riga
serve ad indicare che vanno caricati i valori ed i comandi relativi alla libreria stdio.h, senza i quali il programma non può nemmeno partire.
La parentesi graffa aperta indica l'inizio del codice che comporrà il programma.
La riga
serve ad indicare al calcolatore che dovrà visualizzare su schermo la scritta riportata fra le parentesi e le virgolette, in questo caso Hello World; il punto e virgola indica la fine della riga di codice, e se omesso porta alla non compilazione dello stesso.
La riga
che non funziona su tutti i sistemi operativi per il quale il linguaggio C è scrivibile, indica che il sistema operativo deve mettere in pausa il programma in esecuzione fino alla pressione di un tasto qualsiasi.
La riga
indica di ritornare al sistema operativo il valore zero e di terminare il programma (zero è un valore che indica la corretta esecuzione del programma, valori diversi da zero indicano un'interruzione improvvisa dello stesso.
La parentesi graffa chiusa indica la fine delle righe di codice che compongono il programma.
In JAVA, invece, si scrive:
La riga
è la riga di intestazione di ogni programma Java (seguita dal nome da dare alla classe)
La riga
indica la creazione di un metodo vuoto (diciamo che per un programma così semplice può essere scritta meccanicamente senza apportare alcuna modifica ma in programmi più complessi, dove possono essere creati più metodi, occorre specificare di quale metodo si sta parlando conoscendone le varie caratteristiche.
La riga
rappresenta il comando vero e proprio, cioè quello che noi vogliamo realizzare con il nostro programma ossia la stampa a video della scritta Hello World! La prima parte (System.out) rappresenta un'istruzione di output cioè una cosa che il computer deve mostrare all'utente, la seconda parte (println) rappresenta la vera e propria istruzione cioè una cosiddetta PRINT LINE cioè "stampa (a video) e vai a capo".

### Variabili ed operazioni matematiche

Ogni linguaggio di programmazione deve essere in grado di manipolare e conservare dati: la natura (o il tipo) di tali dati dipende dal linguaggio.
Tipi di dati comuni a molti linguaggi sono: tipo carattere, tipo stringa, tipo numerico intero, tipo numerico decimale ecc.
I linguaggi di programmazione danno la possibilità di fare riferimento all'area di memoria nello spazio degli indirizzi riservato al programma, nella quale è memorizzato il valore di un dato: il programmatore può quindi utilizzare nomi logici (ad esempio: stipendio, imponibile, aliquota, cognome ecc.) per fare riferimento alle aree di memoria nelle quali sono memorizzati i valori di questi dati.
Ognuno di questi nomi logici prende il nome di variabile.
Definizione: una variabile in un programma è un nome logico che individua l'area di memoria nella quale è ospitato un dato.
I dati da solo sarebbero poco utili se non vi fosse la possibilità di manipolarli in qualche modo.
Anche le operazioni ammesse sui dati e la loro sintassi possono variare da linguaggio a linguaggio.

### Creazione ed uso di librerie esterne
## Concetti base
### Algoritmo

L'algoritmo è l'insieme delle istruzioni necessarie per eseguire un determinato compito.

### Compilazione

La compilazione è il processo di trasformazione dei che contengono il codice scritto dal programmatore (detti "sorgenti") nel codice eseguibile finale.
Ciò passerò attraverso 4 fasi, più una usata per linguaggi per cui non esistono compilatori diretti:
* Conversione del codice dal linguaggio di programmazione usato a quello per cui esiste il compilatore (accade, ad esempio, per il linguaggio di programmazione FORTRAN, ove tutti i compilatori traducono i codici sorgenti FORTRAN in codici sorgenti C, data l'estinzione di compilatori diretti);
* Eliminazione delle righe di commento e conversione delle macro e dei valori simbolici in numeri calcolabili;
* Trasformazione del codice sorgente in codice Assembly, con dettagliate istruzioni di come agire passo passo per eseguire le funzionalità del programma;
* Trasformazione del codice Assembly in codice oggetto, ove vi sarà bit per bit quanto il programma deve eseguire;
* Trasformazione del codice oggetto in file eseguibile (con estensione .exe in ambiente Windows), che permette l'esecuzione del programma con l'avvio del file.
La fase della creazione del codice oggetto può prevedere anche l'incorporamento di file di libreria o di moduli del codice legati al file di codice sorgente principale attraverso dei richiami inseriti nei file (o attraverso la creazione di un file di progetto che indichi all'atto della compilazione tutti i file da compilare).
Per quanto riguarda JAVA la compilazione avviene attraverso la creazione di un file cosiddetto BYTE-CODE che in Java ha estensione ".class" (a differenza del linguaggio C che crea direttamente un eseguibile). Questo file rappresenta la traduzione del linguaggio scritto in righe di codice dal programmatore, in un linguaggio comprensibile alla macchina. Per poter essere eseguiti i Byte-Code necessitano della JAVA VIRTUAL MACHINE (JVC) la quale provvederà ad eseguire le istruzioni riportate all'interno del codice. Questo fattore comporta un vantaggio per il programmatore poiché il programma creato in Java avrà maggiore portabilità tra architetture diverse rispetto ai programmi compilati direttamente e un rischio minore di crash. L'operazione della compilazione e quella dell'esecuzione devono essere eseguite utilizzando la riga di comando del prompt dei comandi di DOS, ad esempio:
* Per la compilazione il comando Java è "javac Esempio.java" ----> dove Esempio.java rappresenta il nome del file testuale salvato con estensione ".java";
* Per l'esecuzione "java Esempio" -----> dove esempio indica il nome del programma creato e compilato.