sabato 23 dicembre 2023

CORSO STRUTTURA DI UN LINGUAGGIO DI PROGRAMMAZIONE: Lezione 1 Concetti fondamentali di un linguaggio di programmazione

1: Concetti fondamentali di un linguaggio di programmazione


Premessa storica
Classificare i linguaggi di programmazione in base alla loro comparsa e importanza è un compito complesso e dipende anche dal contesto storico e dal dominio di utilizzo. Ecco una classificazione approssimativa basata sull'importanza storica e sull'impatto nel mondo della programmazione:


Linguaggi di Programmazione Primi (anni '50 - '60):

Assembly Language (linguaggio assembly): Uno dei primi linguaggi di programmazione, legato strettamente all'architettura hardware del computer. Utilizzato per scrivere codice a basso livello, vicino al linguaggio macchina.


Fortran: Il primo linguaggio di alto livello, sviluppato per il calcolo scientifico. Rivoluzionò la programmazione scientifica, consentendo di scrivere codice più leggibile e portabile.


Lisp: Introdotto negli anni '50, è uno dei più antichi linguaggi di programmazione ad alto livello. È noto per il trattamento dei dati simbolici ed è stato ampiamente utilizzato nell'intelligenza artificiale e nelle applicazioni di elaborazione del linguaggio naturale.


Linguaggi di Programmazione Successivi (anni '60 - '70):

COBOL: Sviluppato per applicazioni commerciali e aziendali. Ancora utilizzato in settori come finanza, assicurazioni e governo.


ALGOL: Ha influenzato la progettazione di molti linguaggi successivi. Non molto diffuso, ma ha influenzato lo sviluppo di linguaggi come Pascal, C, e simili.


BASIC: Creato per rendere la programmazione accessibile ai principianti. È stato ampiamente usato negli anni '70 e '80 per l'apprendimento e la prototipazione rapida.


Rivoluzione Moderna (dagli anni '70 in poi):

C: Lanciato negli anni '70, C è ancora ampiamente utilizzato per il suo controllo di basso livello sull'hardware, ed è stato la base per lo sviluppo di molti altri linguaggi, inclusi C++, Java e altri.


C++: Una estensione di C che ha introdotto il paradigma della programmazione orientata agli oggetti. È utilizzato per sviluppare software di sistema, giochi, applicazioni desktop e altro ancora.


Java: Creato negli anni '90, ha guadagnato popolarità per la sua portabilità e la capacità di eseguire codice su diverse piattaforme. È usato in applicazioni enterprise, Android e altri contesti.


Python: Ha guadagnato una rapida popolarità negli ultimi anni grazie alla sua sintassi semplice, leggibilità e ampia applicabilità. È utilizzato in sviluppo web, analisi dati, intelligenza artificiale e altro ancora.


JavaScript: Un linguaggio di scripting per il web, è diventato essenziale per lo sviluppo front-end e back-end delle applicazioni web.


PHP: Utilizzato principalmente per lo sviluppo web lato server. Anche se è in calo rispetto agli anni passati, resta ancora una scelta comune per molti siti web.


Nuove Entrate (anni 2000 - in poi):

Ruby: Conosciuto per il framework Ruby on Rails, è stato utilizzato per lo sviluppo web e applicazioni veloci da costruire.


Swift: Linguaggio sviluppato da Apple per lo sviluppo di applicazioni iOS, macOS e altri prodotti Apple.


Go: Linguaggio di programmazione sviluppato da Google, noto per la sua efficienza e prestazioni. Utilizzato per lo sviluppo di software di rete e applicazioni basate su cloud.


Questa classificazione riflette l'importanza storica e l'impatto di alcuni dei principali linguaggi di programmazione. Tuttavia, ci sono molti altri linguaggi importanti che potrebbero essere menzionati in base a contesti specifici e a settori di applicazione particolari.


1.1 Sintassi e Semantica

I linguaggi di programmazione sono strumenti che i programmatori utilizzano per scrivere istruzioni che i computer possono comprendere ed eseguire. Ogni linguaggio di programmazione ha una sintassi specifica, che rappresenta le regole e la struttura delle istruzioni.


Sintassi

La sintassi di un linguaggio di programmazione definisce le regole e le strutture che governano la corretta composizione delle istruzioni nel codice. È una serie di regole che indicano come scrivere correttamente il codice affinché sia comprensibile e accettabile per il compilatore o l'interprete del linguaggio.

Ecco alcuni elementi chiave della sintassi di un linguaggio di programmazione:


Sintassi delle istruzioni:

Le istruzioni nel codice devono essere scritte seguendo regole specifiche. Ad esempio, in molti linguaggi, ogni istruzione termina con un punto e virgola (;).

La sintassi delle istruzioni in programmazione si riferisce alle regole e alle convenzioni che determinano come scrivere correttamente le istruzioni in un linguaggio di programmazione specifico. Una corretta sintassi è essenziale affinché il codice possa essere compreso e eseguito correttamente dall'interprete o dal compilatore del linguaggio.


Esempio di sintassi delle istruzioni in Python:

python

Copy code

# Esempio di istruzione if-else

x = 10

if x > 5:

    print("x è maggiore di 5")

else:

    print("x è minore o uguale a 5")

# Esempio di loop for

for i in range(5):

    print(i)

# Esempio di definizione di funzione

def saluta(nome):

    print("Ciao,", nome)

# Chiamata alla funzione

saluta("Alice")

In questo esempio:

Le istruzioni if-else, for, la definizione della funzione saluta e la sua chiamata seguono la sintassi specifica di Python.

Ogni istruzione segue le regole del linguaggio: l'indentazione corretta per definire i blocchi di codice, l'uso delle parole chiave (if, else, for, def), l'identificatore range(), l'uso dei due punti :, ecc.


La sintassi corretta è essenziale per scrivere codice funzionante e leggibile in modo che il linguaggio di programmazione possa interpretare o compilare correttamente le istruzioni scritte.


Elementi della sintassi delle istruzioni:


Parole chiave (Keywords):

Sono parole riservate del linguaggio di programmazione che hanno uno scopo specifico e non possono essere utilizzate come identificatori. Esempi comuni includono if, else, for, while, def in Python.


Le parole chiave, conosciute anche come keywords, sono parole riservate all'interno di un linguaggio di programmazione che hanno uno scopo specifico e una funzione predefinita nel linguaggio stesso. Queste parole hanno un significato specifico e vengono utilizzate per definire la struttura e il comportamento del codice all'interno di un programma. Le parole chiave non possono essere utilizzate come identificatori per nominare variabili, funzioni o classi poiché sono riservate e hanno uno scopo specifico nel linguaggio.


Ecco alcuni punti importanti riguardanti le parole chiave:


Riservatezza: Le parole chiave sono riservate e non possono essere ridefinite o utilizzate come nomi per identificatori personalizzati (come nomi di variabili, funzioni, classi, ecc.).


Scopo specifico: Ogni parola chiave ha uno scopo specifico all'interno del linguaggio e svolge un ruolo fondamentale nella struttura e nell'esecuzione del codice. Ad esempio, parole chiave come if, else, for, while definiscono strutture di controllo del flusso del programma.


Sintassi del linguaggio: Le parole chiave sono integrate nella sintassi del linguaggio di programmazione e sono riconosciute dal compilatore o dall'interprete del linguaggio.


Esempi comuni di parole chiave in Python includono:

if: Utilizzato per eseguire un blocco di istruzioni se una condizione è vera.

else: Utilizzato insieme a if per eseguire un blocco di istruzioni alternativo se la condizione di if non è vera.

for: Utilizzato per iterare attraverso una sequenza di elementi (come liste, tuple, dizionari, ecc.).

while: Utilizzato per eseguire un blocco di istruzioni fintanto che una condizione è vera.

def: Utilizzato per definire una funzione.

Le parole chiave variano da un linguaggio all'altro e hanno significati specifici all'interno del contesto di quel linguaggio. È importante conoscere e comprendere le parole chiave specifiche di un linguaggio per utilizzare correttamente la sintassi e la struttura del codice.


Identificatori (Identifiers):

Sono nomi dati alle variabili, funzioni, classi, ecc. Gli identificatori devono seguire regole specifiche del linguaggio riguardanti l'uso di lettere, numeri e caratteri speciali.

Gli identificatori in programmazione sono nomi assegnati alle variabili, funzioni, classi o altri oggetti all'interno di un programma. Sono utilizzati per identificare e fare riferimento a queste entità nel codice. Ogni identificatore deve seguire regole specifiche definite dal linguaggio di programmazione utilizzato. Le regole comuni per la definizione degli identificatori includono:

Caratteri ammessi: Gli identificatori possono contenere lettere (maiuscole o minuscole), numeri o underscore (_). In alcuni linguaggi, l'underscore può essere utilizzato come primo carattere dell'identificatore.

Primo carattere: In genere, un identificatore non può iniziare con un numero. Deve iniziare con una lettera o con l'underscore.

Parole riservate: Gli identificatori non possono essere parole chiave o riservate del linguaggio di programmazione.

Case sensitivity: La maggior parte dei linguaggi di programmazione è case-sensitive, il che significa che identificatori come variabile e Variabile sono considerati distinti.

Lunghezza: La lunghezza degli identificatori può variare da linguaggio a linguaggio. Alcuni linguaggi possono avere limiti sulla lunghezza massima degli identificatori.


Ecco alcuni esempi di identificatori validi in Python:

nome

_variabile

numero2

NomeClasse

funzione

variabile_temporanea


Esempi di identificatori non validi in Python:

2numero (inizia con un numero)

if (parola chiave riservata)

nome con spazi (contiene spazi)

È importante seguire le regole specifiche del linguaggio di programmazione riguardo agli identificatori per evitare errori di sintassi e garantire che il codice sia correttamente interpretato o compilato. La scelta di identificatori significativi e descrittivi migliora la leggibilità del codice e facilita la comprensione del suo scopo e della sua logica da parte di altri programmatori.


Operatori (Operators):

Sono simboli che indicano un'operazione matematica, logica o di confronto tra variabili o valori. Esempi comuni includono +, -, *, / per operazioni matematiche, ==, !=, <, > per confronti logici, &&, || per operazioni booleane, ecc.

Gli operatori in programmazione sono simboli speciali o parole riservate che consentono di eseguire operazioni su variabili, costanti e valori. Questi operatori possono essere utilizzati per eseguire operazioni matematiche, confronti logici, operazioni booleane e altro ancora. Sono fondamentali per eseguire calcoli, definire condizioni e controllare il flusso del programma. Di seguito sono riportati alcuni tipi comuni di operatori:


Operatori matematici:

Addizione (+): Esegue l'addizione tra due valori.

Sottrazione (-): Esegue la sottrazione tra due valori.

Moltiplicazione (*): Esegue la moltiplicazione tra due valori.

Divisione (/): Esegue la divisione tra due valori.

Modulo (%): Restituisce il resto della divisione tra due numeri interi.

Incremento (++) e Decremento (--): Aumenta o diminuisce il valore di una variabile di 1.

Operatori di confronto/logici:

Uguaglianza (==): Verifica l'uguaglianza tra due valori.

Diverso (!=): Verifica la disuguaglianza tra due valori.

Maggiore di (>), Minore di (<): Verifica se un valore è maggiore o minore di un altro.

Maggiore o uguale (>=), Minore o uguale (<=): Verifica se un valore è maggiore/maggiore-uguale o minore/minore-uguale di un altro.

And (&&): Restituisce vero se entrambe le condizioni sono vere.

Or (||): Restituisce vero se almeno una delle condizioni è vera.

Not (!): Restituisce il contrario di una condizione booleana.

Altri operatori:

Assegnamento (=): Assegna un valore a una variabile.

Concatenazione (+): Concatena due stringhe.

Puntatore/Accesso a un campo (->): Utilizzato per accedere ai campi di una struttura dati in alcuni linguaggi.


Esempi di utilizzo degli operatori:

python

Copy code

# Operatori matematici

a = 10

b = 5

c = a + b  # Addizione

d = a * b  # Moltiplicazione


# Operatori di confronto/logici

x = 15

y = 20

print(x > y)   # Restituisce False

print(x != y)  # Restituisce True


# Assegnamento

z = 5

z += 3  # Equivale a z = z + 3

print(z)  # Output: 8


Gli operatori sono essenziali per eseguire operazioni e valutazioni nel codice e vengono utilizzati per creare condizioni, eseguire calcoli e controllare il flusso del programma. La comprensione degli operatori e del loro utilizzo corretto è cruciale per scrivere codice funzionale e efficiente.


Punteggiatura (Punctuation):

Include caratteri come virgole, punti e virgole, parentesi, parentesi graffe, che vengono utilizzati per separare elementi, definire blocchi di codice, ecc.

La punteggiatura in programmazione si riferisce a una serie di caratteri speciali utilizzati per strutturare e organizzare il codice, separare elementi, definire blocchi di codice e specificare la sintassi di un linguaggio di programmazione. Questi caratteri hanno ruoli specifici e sono essenziali per definire la struttura logica e la corretta esecuzione del codice.


Ecco alcuni esempi comuni di punteggiatura:

Virgola (,):

Separazione di elementi: La virgola è utilizzata per separare elementi in una lista, tuple, argomenti di funzioni, ecc.


Esempio in Python:

python

Copy code

lista = [1, 2, 3, 4]  # Lista con virgole per separare gli elementi

Punto e virgola (;):


Separazione di istruzioni: In alcuni linguaggi di programmazione, come JavaScript, il punto e virgola è utilizzato per separare istruzioni.


Esempio in JavaScript:

javascript

Copy code

var x = 5; y = 10;  // Separazione di istruzioni con punto e virgola


Parentesi tonde ( ), Parentesi graffe { }, Parentesi quadre [ ]:

Definizione di blocchi di codice: Le parentesi vengono utilizzate per delimitare e organizzare blocchi di codice come in dichiarazioni di funzioni, strutture di controllo, definizione di liste, dizionari e altro ancora.


Esempio in Python:

python

Copy code

def funzione():

    for i in range(5):  # Utilizzo di parentesi per definire il blocco del ciclo for

        print(i)


Punteggiatura speciale (: . ? ! ecc.):

Punteggiatura specifica del linguaggio: Altri simboli come i due punti, il punto, il punto interrogativo e il punto esclamativo hanno significati specifici all'interno della sintassi del linguaggio di programmazione e sono utilizzati per definire regole di scrittura del codice.


Esempio in Python:

python

Copy code

if condizione:  # Utilizzo dei due punti per definire un blocco di codice sotto l'if

    print("Condizione vera!")

else:

    print("Condizione falsa.")


La punteggiatura è fondamentale per la corretta interpretazione del codice da parte del compilatore o dell'interprete del linguaggio di programmazione. Utilizzare correttamente la punteggiatura è cruciale per definire la struttura e la logica del codice in modo chiaro e comprensibile.


Commenti:

Sono porzioni di testo nel codice che vengono ignorate dall'interprete o dal compilatore e servono per fornire spiegazioni, annotazioni o documentazione al codice. Possono iniziare con simboli specifici come # in Python per commenti su una sola riga, o /* ... */ in linguaggi come C++ per commenti su più righe.


I commenti sono porzioni di testo all'interno del codice sorgente di un programma che vengono ignorate dall'interprete o dal compilatore. Servono a fornire spiegazioni, annotazioni, o documentazione riguardo al codice scritto e sono utili per migliorare la comprensione, la manutenzione e la collaborazione nel processo di sviluppo del software.


Ecco alcune caratteristiche principali dei commenti:


Tipi di commenti:

Commenti su una sola riga:

Sono commenti brevi e sono utilizzati per aggiungere annotazioni o spiegazioni a una singola riga di codice.


Esempio in Python:

python

Copy code

# Questo è un commento su una sola riga in Python


Commenti su più righe:


Sono utilizzati per commentare più righe di codice o per fornire spiegazioni più dettagliate.


Esempio in C++:

cpp

Copy code

/*

Questo è un commento su

più righe in C++ per documentare

più sezioni di codice.

*/

Uso dei commenti:

Spiegazioni del codice: I commenti possono essere utilizzati per spiegare parti complesse del codice o algoritmi, rendendo il codice più comprensibile per altri sviluppatori o per se stessi in futuro.


Annotazioni e TODO: Vengono utilizzati per evidenziare aree in cui è necessario fare ulteriori modifiche o implementare funzionalità future.


Risoluzione dei problemi: Possono essere utilizzati per commentare temporaneamente parti di codice per scopi di debug o per identificare e risolvere errori.


Migliori pratiche:

Mantenere i commenti aggiornati: I commenti dovrebbero essere accurati e aggiornati man mano che il codice viene modificato o evoluto.


Evitare commenti ovvi: I commenti dovrebbero fornire informazioni utili e non duplicare ciò che è evidente dal codice stesso.


Scrittura chiara e concisa: I commenti devono essere scritti in modo chiaro e conciso, evitando ambiguità o eccessiva verbosità.


L'uso corretto dei commenti è una pratica importante nella scrittura del codice. Questi contribuiscono a rendere il codice più comprensibile, manutenibile e collaborativo, facilitando la comprensione delle intenzioni dietro il codice scritto.


1.2 Tipi di dati e Variabili

Tipi di dati: rappresentazione e manipolazione dei dati.

Variabili: contenitori per memorizzare e manipolare i dati.


Dichiarazioni di variabili e tipi di dati:

La sintassi per dichiarare variabili e definire i tipi di dati varia da linguaggio a linguaggio. Alcuni linguaggi richiedono la dichiarazione esplicita del tipo di variabile, mentre altri possono inferirlo automaticamente.

Le dichiarazioni di variabili e i tipi di dati possono variare significativamente da un linguaggio di programmazione all'altro. In molti linguaggi, la dichiarazione delle variabili coinvolge specificare il nome della variabile e, in alcuni casi, il tipo di dati che la variabile conterrà.


Ecco alcuni concetti chiave:

Dichiarazione di variabili:

Dichiarazione esplicita del tipo:


In alcuni linguaggi, come C, C++, Java, è necessario specificare il tipo di dato quando si dichiara una variabile. 

Ad esempio:

java

Copy code

int numero; // Dichiarazione di una variabile intera in Java

float valore; // Dichiarazione di una variabile float in Java

Inferenza del tipo (Type inference):


Alcuni linguaggi, come Python, JavaScript e alcuni dialetti di C#, supportano l'inferenza del tipo, il che significa che il tipo di dato può essere dedotto dal valore assegnato alla variabile. 


Ad esempio:

python

Copy code

numero = 10  # Python deduce automaticamente che "numero" è di tipo intero

nome = "Alice"  # Python deduce automaticamente che "nome" è di tipo stringa

Tipi di dati comuni:

Interi (integers): Rappresentano numeri interi senza parte frazionaria.


Numeri in virgola mobile (floating-point numbers): Rappresentano numeri con una parte frazionaria, come 3.14.


Stringhe (strings): Sequenze di caratteri, come "hello world".


Booleani (booleans): Rappresentano valori di verità, True o False.


Liste/Array: Raccolte di elementi omogenei o eterogenei.


Oggetti/Classi (Objects/Classes): Rappresentano istanze di classi che possono contenere dati e metodi.


Esempi di dichiarazioni di variabili in diversi linguaggi:

Java:

java

Copy code

int numero; // Dichiarazione di una variabile intera

String nome; // Dichiarazione di una variabile stringa


Python:

python

Copy code

numero = 10  # Python deduce automaticamente che "numero" è di tipo intero

nome = "Alice"  # Python deduce automaticamente che "nome" è di tipo stringa


JavaScript:

javascript

Copy code

let numero; // Dichiarazione di una variabile senza assegnazione di valore iniziale

const PI = 3.14; // Dichiarazione di una costante


La scelta del tipo di dato e il modo in cui le variabili vengono dichiarate varia in base alle esigenze del programma e alle convenzioni specifiche del linguaggio di programmazione utilizzato. Alcuni linguaggi offrono maggiore flessibilità mentre altri richiedono maggiore rigidità nella dichiarazione delle variabili.


1.3 Strutture di controllo

Istruzioni per il controllo del flusso del programma.


Strutture di controllo:

I costrutti come if, else, for, while, switch ecc., hanno una sintassi specifica per definire il flusso di controllo all'interno del programma.


Le strutture di controllo in programmazione sono costrutti che influenzano il flusso di esecuzione del programma. Queste strutture consentono di prendere decisioni, ripetere azioni o gestire il flusso di esecuzione del codice in base a determinate condizioni. Le strutture di controllo più comuni includono if, else, for, while, switch e do-while.


Esempi di strutture di controllo:

Istruzione if-else:

Utilizzata per eseguire un blocco di codice se una condizione è vera e un altro blocco di codice se la condizione è falsa.


python

Copy code

if condizione:

    # Blocco di codice se la condizione è vera

else:

    # Blocco di codice se la condizione è falsa


Ciclo for:

Utilizzato per eseguire un blocco di codice per un numero specifico di volte.

python


Copy code

for elemento in sequenza:

    # Blocco di codice che viene eseguito per ciascun elemento nella sequenza


Ciclo while:

Esegue un blocco di codice fintanto che una condizione è vera.

python

Copy code

while condizione:

    # Blocco di codice che viene eseguito fintanto che la condizione è vera


Istruzione switch-case (in alcuni linguaggi):

Permette di confrontare un'espressione con una serie di casi e eseguire il codice corrispondente al caso trovato.


javascript

Copy code

switch (espressione) {

    case valore1:

        // Blocco di codice se l'espressione è uguale a valore1

        break;

    case valore2:

        // Blocco di codice se l'espressione è uguale a valore2

        break;

    default:

        // Blocco di codice se nessun caso corrisponde all'espressione

}

Le strutture di controllo consentono ai programmatori di dirigere il flusso del programma in base a condizioni specifiche. Queste strutture possono includere decisioni, cicli o selezioni di percorsi in base ai requisiti dell'applicazione o del problema da risolvere. Combinando queste strutture, è possibile creare algoritmi più complessi e adattabili per gestire scenari diversi all'interno di un programma.


Nessun commento:

Posta un commento