Introduzione alla programmazione

De Cliomatica - Digital History
Tempo di lettura 14 minuti - per Ludovica Binetti& Lorenzo Di Gianvittorio


Avere un’idea, seppure sommaria, di cosa ci sia dietro il funzionamento degli strumenti informatici che oggi agevolano il compito di un public historian potrebbe sembrare superfluo, eppure ciò è indispensabile per un uso consapevole di questi stessi strumenti che spesso e volentieri vengono usati in maniera meccanica. Ciò che, innanzitutto, si deve comprendere è che alla base del dialogo e dell’interazione tra uno studioso e un computer vi sono i linguaggi di programmazione. Di linguaggi di programmazione ne esistono moltissimi e di solito ognuno di questi è orientato ad un particolare campo informatico (quale, ad esempio, la progettazione web, l’analisi di dati storici o lo sviluppo di software) che corrisponde, a sua volta, a un preciso scopo per uno studioso di Storia. Per tale ragione, qui di seguito, si offrirà un’introduzione generica e molto basilare ai concetti che stanno dietro un qualsiasi linguaggio di programmazione. Una volta appresi questi concetti, se ne riuscirà a comprendere la versatilità e la loro possibile applicazione a una grande varietà di campi in quanto basati sui linguaggi di programmazione: dalla manipolazione di dati alla visualizzazione di grafici; dalla rappresentazione digitale di un testo all’estrazione di informazione da questo; dalla creazione di una pagina web alla possibilità di creare strumenti interattivi su di esso.

I linguaggi di programmazione

Nonostante al giorno d’oggi vi siano moltissimi linguaggi di programmazione, ognuno dei quali si presta più o meno facilmente all’esecuzione di un particolare tipo di “task storico”, ognuno di essi lo si può definire come segue: un linguaggio di programmazione è un linguaggio formale rappresentante un insieme di istruzioni atte a svolgere una specifica funzione per il controllo di una macchina o di una sua implementazione. Ciò che contraddistingue questi linguaggi formali dalle lingue naturali è la loro non ambiguità: i linguaggi di programmazione presentano, infatti, «una sintassi e delle regole ben precise che evitano possibili interpretazioni sbagliate da parte del computer»[1], al contrario, invece, delle lingue naturali che sono fortemente ambigue dal punto di vista sintattico e/o lessicale. In questa ragione risiede, dunque, la necessità di dover usare un linguaggio formale per comunicare con un computer.

Linguaggi di alto e di basso livello

La maggior parte dei linguaggi moderni è stata progettata per essere facile da utilizzare, per questo tali linguaggi vengono definiti di alto livello[2]. Tra questi, i più famosi sono Java, Python, Javascript e i vari linguaggi della famiglia C. Per una maggiore precisione, si deve far presente che i linguaggi di alto livello vengono poi tradotti in un linguaggio molto semplice, fatto solo di due simboli 0 e 1, detto linguaggio macchina o di basso livello - l'unico linguaggio che le macchine sono in grado di comprendere. Della traduzione dei comandi che un programmatore scrive in una sequenza di "zeri e uni" si occupa un programma apposito chiamato compilatore o interprete. In realtà, non solo esiste una differenza concettuale tra "compilazione" e "interpretazione", ma tra linguaggio macchina e linguaggio di alto livello si colloca un ulteriore tipo di linguaggio detto assembly. Tuttavia, essendo questi argomenti più avanzati, non verranno qui trattati. Per ulteriori approfondimenti si rimanda alla pagina [1].

Una semplice definizione di "algoritmo"

Altra definizione fondamentale per chiunque voglia avvicinarsi al mondo della programmazione è la definizione di algoritmo: un algoritmo non è altro che una sequenza di istruzioni che indica al computer la procedura attraverso cui, dato un input, produrre un output, risolvendo, dunque, un certo problema. «Per capire cos'è un algoritmo basta pensare a una ricetta di cucina: gli ingredienti per fare una torta [...] sono l'input, la torta pronta da mangiare è l'output, e i passi da seguire secondo una certa sequenza per trasformare gli ingredienti nella torta sono l'algoritmo»[3].

La "grammatica" dei linguaggi

Nonostante ogni linguaggio di programmazione abbia una propria sintassi (ovvero un insieme di regole che consentono di creare una frase di senso compiuto[4] e delle specifiche parole chiave (a cui è associata una semantica altrettanto specifica), questi condividono uno scheletro, formato da una sorta di “grammatica di base” che, una volta appresa, sarà applicabile a qualsiasi linguaggio.

Variabili

Un concetto fondamentale nei linguaggi di programmazione è quello di variabile. Queste possono essere identificate tramite parole chiave che cambiano in base al linguaggio, es. var, int, String. La loro funzione è quella di memorizzare in uno spazio di memoria fisica dati di ogni genere. Queste possono essere definite come una sorta di contenitore, in cui il dato racchiuso è chiamato valore'[5]. Nei linguaggi di alto livello le variabili devono essere dichiarate prima di poter essere utilizzate, ovvero è necessario definire un nome che le identifichi (es. nome_variabile nella lista in basso). Inoltre, per i linguaggi tipizzati come Javascript e Java è anche obbligatorio stabilire il tipo della variabile che, posto prima del nome, va a rappresentare numeri interi o decimali, stringhe, vettori e altre tipologie di datatype. Di seguito alcuni esempi:

  • in Python: nome_variabile = 10;
  • in Javascript: var nome_variabile = 10;
  • in Java: String nome_variabile = "stringa".

Un tipo particolare di variabili sono le variabili booleane. A differenza di altri tipi di variabili (i cui valori possono essere assegnati arbitrariamente dal programmatore), le variabili booleane hanno due soli valori possibili: true o false. Queste risultano particolarmente utili negli statement condizionali.

Funzioni e pacchetti

Una funzione identifica un blocco di istruzioni volte alla realizzazione di un preciso scopo. Una funzione può essere richiamata in precisi punti di un programma ed esistono due principali tipologie di funzioni:

  • Funzioni predefinite: si tratta “funzioni già fatte” che è possibile trovare nella documentazione di un linguaggio. In Figura 1 è possibile vedere un esempio di funzione (today()) che calcola la data nel giorno attuale;
Figura 1: esempio di funzione predefinita in Python.


  • Funzioni definite dall'utente: funzioni personalizzabili a seconda delle necessità del programmatore. In Figura 2 è stata, ad esempio, definita una funzione “sommaNumeri” che, presi in input due numeri x e y, restituisce la loro somma.

Arquivo:Esempio.jpg

Figura 2: esempio di funzione definita dall'utente.

Si noti che, nel caso di funzioni predefinite, è spesso necessario importare specifici pacchetti, ovverosia moduli che raggruppano funzioni già implementate e che aggiungono funzionalità ad un programma. Nell'esempio di Figura 1 il nome del pacchetto è “datetime” a cui ci si riferisce con il nome di date all’interno del codice. Come si può vedere, la parola chiave da usare per importare i pacchetti è “import” seguita dal nome del pacchetto, from e il nome che vogliamo assegnarvi. Tale direttiva deve precedere la chiamata della funzione. Le funzioni possono, inoltre, ricevere o meno uno o più parametri di input che sono contenuti entro le parentesi quadre. Ogni qual volta la funzione deve essere richiamata, è necessario che, nella sua invocazione, le siano passati esattamente lo stesso numero e tipo di parametri formali definiti in fase di dichiarazione. Un esempio di corretta chiamata della funzione definita in Figura 2 è:

sommaNumeri (3, 10)

Condizioni if-else

Poiché programmare significa trovare una procedura volta alla risoluzione di un problema, è spesso necessario dover considerare diversi scenari al fine di compiere una scelta. Ad esempio, se volessimo creare un programma che simula il comportamento di un semaforo si dovrebbe associare a ogni colore un messaggio per i guidatori:


if (annoDiNascita.equals(“XV”))

tabella.insert(annoDiNascita)


Come si può vedere, per realizzare un programma di tal genere si potrebbero creare delle variabili booleane per i colori del semaforo e stampare dei messaggi con l'ausilio di una funzione di "stampa". Per realizzare una struttura di tal genere si utilizzano i cosiddetti comandi condizionali (o istruzioni condizionali) che hanno la seguente forma:


● parola chiave if seguita dalla condizione (detta guardia) e il comando da eseguire se tale condizione è soddisfatta; ● parola chiave else, che, in realtà, indica un ramo opzionale. Se la premessa dell'if non è soddisfatta, si entra in questo ramo e il comando che segue l'else verrà eseguito.


Ritornando all'esempio precedente, se scrivessimo:


\MODIFICARE ESEMPIO


Verrebbe stampato il messaggio di stop in tutti i casi in cui il colore del semaforo non è verde (quindi che sia rosso o arancione o, addirittura, di un altro colore).

Cicli

Quando, tramite un linguaggio di programmazione, dobbiamo risolvere un problema in un numero fisso o variabile di passi, presentandosi così la necessità di ripetere una serie di azioni, il costrutto che possiamo utilizzare è chiamato ciclo o loop. Il ciclo può quindi essere identificato come un percorso chiuso nel quale vengono inserite determinate istruzioni, eseguite al verificarsi di una certa condizione. Esistono diverse forme di cicli che cambiano in base alla tipologia di parola chiave utilizzata, ad esempio cicli for e cicli while. Per capire meglio il concetto, immaginiamo di avere delle parole racchiuse all'interno di una lista, chiamata convenzionalmente listaDiParole, e vogliamo stampare a schermo tutte le parole utilizzando i vari costrutti avremo:

  • Tramite un ciclo for:

listaDiparole = ["giallo", "verde", "blu"]

for parola in listaDiParole:

print parola

  • Tramite un ciclo while:

listaDiparole = ["giallo", "verde", "blu"]\\

contatore = 0

while (contatore != listaDiParole.length):

print parola

contatore++


Entrambe le istruzioni stampo a schermo tutte le parole della lista, la prima semplicemente iterando per ogni parola presente, la seconda avvalendosi di un indice che, posto inizialmente a 0 \footnote{Si ricordi che gli informatici iniziano sempre a contare da 0 e non da 1!}, aumenta di 1 ad ogni parola stampata, e si ferma quando il contatore è uguale alla lunghezza della lista, nel nostro caso 3.

La capacità di tenersi aggiornati

Una volta presa confidenza con alcuni dei concetti basilari della programmazione, un'altra delle abilità che uno storico, al pari di un informatico, deve acquisire è l'abilità di saper ricercare sul web: abilità di certo non banale né tanto meno da sottovalutare. Difatti, anche un informatico di alto-medio profilo continuerà, nel corso della sua carriera, a fare ricerche in merito al significato di certi costrutti o di certe funzioni, dal momento che sarebbe quasi impossibile ricordarne nomi e relativa semantica. Inoltre, sapersi muovere entro le documentazioni ufficiali fornite dagli sviluppatori non è sempre cosa semplice. Per alcuni linguaggi documentazioni e sistemi di supporto sono già fornite all'interno dell'ambiente di sviluppo. Ad esempio la sezione Help per R in cui è possibile trovare delle spiegazioni semplici e accessibili delle funzioni utilizzate nonché dei parametri che e possibile passarvi come input. Per altri linguaggi, invece, la ricerca delle informazioni potrebbe risultare più ostica: per questo si rimanda qui di seguito a una serie di siti web più usati e affidabili, che potranno di certo risultare utili ai public historian alle prime armi.

  • W3Schools [2], sito in cui è possibile trovare tutorial molto accessibili su html, css, javascript e molto altro.
  • Tutorials Point [3], offre numerosi tutorial circa linguaggi e/o pacchetti specifici. In esso è, inoltre, possibile trovare corsi (a pagamento) online;
  • Stack overflow [4], sito spesso molto affidabile e uno dei top result in un motore di ricerca. Si tratta di una grande piattaforma per la condivisione della conoscenza in cui una community molto attiva aiuta e supporta i programmatori che riscontrano dei problemi durante la scrittura di un programma.
  • Geeks for Geeks [5], sito che, un po' come Stack overflow, offre supporto ai programmatori, ma che, al contempo, offre anche tutorial in diversi linguaggi (esempio Python e Java).

Per questioni specifiche relative, invece, più propriamente agli "strumenti informatici" che uno storico può usare si rimanda, invece, al sito The Programming Historian [6].


Bibliografia e sitografia

  1. ROSSI, Francesca, Il confine del futuro, Milano, Feltrinelli, 2019.
  2. SAVITCH, Walter, Programmazione di base e avanzata con Java, Milano, Pearson, 2018.
  3. ROSSI, Francesca, op. cit.
  4. Il Serra, «La sintassi della programmazione», in ilserra.it, 11 febbraio 2019, URL: < https://www.ilserra.it/la-programmazione/la-sintassi-della-programmazione/ > [consultato il 13 agosto 2021].
  5. SAVITCH, Walter, op. cit..



Citazione di questo articolo
Come citare: BINETTI, Ludovica & Di Gianvittorio, Lorenzo. "Introduzione alla programmazione". In: CLIOMATICA - Portale di Storia Digitale e ricerca. Disponibile in: http://lhs.unb.br/cliomatica/index.php/Introduzione_alla_programmazione. il giorno: 21/05/2024.






Informare errori in questa pagina