Cosa sono i linguaggi di scripting?
I linguaggi di scripting sono una famiglia popolare di linguaggi di programmazione che consentono di soddisfare rapidamente le esigenze più comuni. I primi linguaggi di scripting furono utilizzati soprattutto per applicazioni di nicchia e come cosiddetti “Glue language”, che fungevano cioè da “collante” tra diverse parti di codici già esistenti. Con l’avvento del World Wide Web, si sono affermati diversi linguaggi di scripting per l’utilizzo sui web server; infatti, semplificando l’elaborazione del testo, i linguaggi di scripting si sono rivelati adatti alla creazione dinamica di pagine HTML.
Attualmente i linguaggi di scripting, secondo l’indice TIOBE, rappresentano circa un terzo dei linguaggi di programmazione più usati al mondo. JavaScript è praticamente il principale linguaggio di scripting lato client utilizzato nella programmazione web. Ma anche lato server ci sono linguaggi di scripting come PHP, Python, Ruby e Perl.
In cosa si differenziano i linguaggi di scripting e di programmazione?
Per comprendere cosa contraddistingue i linguaggi di scripting, è utile conoscere gli aspetti che li differenziano dai linguaggi di programmazione convenzionali come C, C++ e Java. In questi linguaggi il programmatore scrive un codice sorgente, che viene convertito in codice binario in un passaggio separato. Si utilizzano quindi due file: il file del codice sorgente in cui lavora il programmatore e un file binario generato da questo, che può essere eseguito direttamente sul computer. Il traduttore tra i due file è un programma speciale chiamato compilatore.
La conversione del codice sorgente in codice binario prende il nome di “compilazione”. Durante la compilazione, il codice sorgente viene controllato per verificarne l’attendibilità: tutte le variabili utilizzate sono effettivamente definite? I tipi di argomenti delle funzioni corrispondono alle definizioni delle funzioni? Il programmatore ha dimenticato un carattere da qualche parte? Questo controllo è effettuato in ogni compilazione per tutto il codice sorgente e può richiedere un certo tempo. Il codice binario risultato della compilazione è altamente ottimizzato, per funzionare durante l’esecuzione il più correttamente e velocemente possibile. I linguaggi compilati sono quindi particolarmente adatti per attività a elevata intensità di calcolo e per sistemi più complessi.
Quando si esegue un programma scritto in un linguaggio di scripting, non c’è nessuna compilazione. Pertanto non viene generato nessun file binario dal codice sorgente scritto dal programmatore. Di conseguenza, i programmi scritti in linguaggi di scripting sono di solito meno efficienti nell’esecuzione. Tuttavia, questa perdita di efficienza non è del tutto uno svantaggio ma piuttosto un modo di lavorare con un giusto compromesso: i linguaggi di scripting alleggeriscono il lavoro del programmatore aumentando il carico del processore. I linguaggi di scripting sono quindi particolarmente adatti per programmi di piccole e medie dimensioni.
L’idea di facilitare il lavoro del programmatore è un filo conduttore che caratterizza l’architettura di molti linguaggi di scripting. Questi non prevedono la gestione manuale della memoria, una tecnica particolarmente efficiente ma soggetta a errori. Inoltre, nella maggior parte dei linguaggi di scripting non è necessario specificare il tipo di variabile. Poiché i programmi scritti in linguaggi di scripting non vengono compilati, non c’è bisogno di una funzione main(). I linguaggi di scripting permettono di scrivere il software in modo più diretto e con meno codice sorgente. Confrontate gli esempi seguenti. Entrambi i programmi riportati restituiscono lo stesso risultato:
// Esempio in Java "Hello world"
class helloworld {
static public void main( String args[] ) {
System.out.println( "Hello world!" );
}
}
# Esempio in Python "Hello world"
print "Hello world!"
Caratteristiche dei linguaggi di scripting
Come menzionato all’inizio, i programmi in un linguaggio di scripting non vengono convertiti in codice binario prima dell’esecuzione da parte di un compilatore. Al posto del compilatore si utilizza un programma chiamato interprete. Concettualmente è come se l’interprete leggesse il codice sorgente dall’alto verso il basso, generando ed eseguendo il codice binario pezzo per pezzo.
Se i termini “codice sorgente”, “codice binario” e “interprete” non vi sono ancora chiari, considerate l’esempio seguente: il codice sorgente può essere paragonato alle note musicali per un’orchestra. Nel nostro esempio, il codice binario corrisponde a una registrazione finita dell’intero brano musicale, memorizzato su un CD. Il brano musicale del CD può essere riprodotto in qualsiasi lettore CD, ma non può essere più modificato. L’interprete corrisponde all’orchestra che esegue il brano dal vivo.
Programmazione interattiva con linguaggi di scripting tramite REPL
In molti linguaggi di scripting è possibile eseguire l’interprete in modo interattivo, utilizzando la cosiddetta modalità REPL, dall’inglese “read-eval-print-loop”, ovvero un ambiente di programmazione che accetta input da parte di un singolo utente, li valuta e restituisce il risultato all’utente. Il programmatore trasmette il codice sorgente all’interprete, che lo legge e lo esegue. L’interprete mostra quindi il risultato (print) e attende l’input successivo (loop).
Se viene emesso un errore in modalità REPL, il programmatore può visualizzare il contenuto delle variabili per localizzarlo. È anche possibile sovrascrivere il valore di una variabile e testare parti del codice sorgente con il nuovo valore. In questo modo si può comporre un programma a partire da pezzi più piccoli testati singolarmente. Lo sviluppo e la correzione dei bug avvengono nello stesso tempo. Ciò facilita e velocizza notevolmente la scrittura di un programma funzionante.
Definire strutture di dati complesse nei linguaggi di scripting come literal
I linguaggi di scripting mirano ad agevolare il lavoro del programmatore e forniscono a tal fine una serie di strumenti che includono strutture di dati complesse come stringhe, liste, campi e oggetti. Questi possono essere scritti nei linguaggi di scripting come i cosiddetti “literal”. Ciò permette di mappare direttamente strutture di dati complesse, invece di svilupparle con diversi comandi. Il programmatore può indicare più facilmente le strutture dei dati necessarie alleggerendo così il suo lavoro.
// Esempio per un oggetto literal in JavaScript
cliente = {
'nome': "Hans",
'cognome': "Rossi",
'età': 40,
'attivo': true,
'indirizzo': {
'privato': {},
'azienda': {},
},
}
# Esempio di generazione di codice HTML tramite template literal in JavaScript
titolo_pagina = 'Cosa sono i linguaggi di scripting?'
h1 = '<h1>${titolo_pagina}</h1>'
# restituisce "<h1>Cosa sono i linguaggi di scripting?</h1>"
Tipizzazione dinamica nei linguaggi di scripting
Negli esempi di codice sopra riportati avrete notato che non sono specificati i tipi come “string”, “int” o “bool”. Tuttavia, il programma ha bisogno di questo tipo di informazioni per eseguirle. Da dove le prende?
I linguaggi di scripting si basano sulla “tipizzazione dinamica”: l’interprete deduce il tipo di variabile dal contesto. Nei linguaggi di scripting, anche il tipo di variabile non è fisso, ma può cambiare a seconda del contesto. Un esempio:
# Esempio di tipizzazione dinamica in Python
# un nome, visualizzato come elenco di nome, cognome
nome = ['Hans', 'Rossi']
# il tipo della variabile "nome" è "list"
type(nome)
# di seguito occorre solo il nome
nome = nome[0]
# il tipo della variabile "nome" è ora "str"
type(nome)
Utilizzo dei linguaggi di scripting
I linguaggi di scripting sono classificati in base al loro utilizzo e alla loro posizione. Alcuni linguaggi di scripting sono usati nella riga di comando per raggruppare sequenze di comandi, contribuendo così all’automazione. Di questi linguaggi fanno parte Blash e PowerShell.
VBA e AppleScript svolgono una funzione simile: possono essere utilizzati per automatizzare i processi a livello di applicazione.
PHP, Perl, Ruby, Python e JavaScript sono utilizzati sul web server per creare siti dinamici e applicazioni web, mentre JavaScript è l’unico linguaggio di scripting per web browser. Originariamente destinate alla programmazione di elementi interattivi, oggi intere applicazioni web sono scritte in JavaScript.
I linguaggi di scripting sono utilizzati anche in ambito statistico e scientifico, in particolare R e Python.