I linguaggi di scripting sono una famiglia popolare di linguaggi di pro­gram­ma­zio­ne che con­sen­to­no di sod­di­sfa­re ra­pi­da­men­te le esigenze più comuni. I primi linguaggi di scripting furono uti­liz­za­ti so­prat­tut­to per ap­pli­ca­zio­ni di nicchia e come co­sid­det­ti “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, sem­pli­fi­can­do l’ela­bo­ra­zio­ne del testo, i linguaggi di scripting si sono rivelati adatti alla creazione dinamica di pagine HTML.

At­tual­men­te i linguaggi di scripting, secondo l’indice TIOBE, rap­pre­sen­ta­no circa un terzo dei linguaggi di pro­gram­ma­zio­ne più usati al mondo. Ja­va­Script è pra­ti­ca­men­te il prin­ci­pa­le lin­guag­gio di scripting lato client uti­liz­za­to nella pro­gram­ma­zio­ne web. Ma anche lato server ci sono linguaggi di scripting come PHP, Python, Ruby e Perl.

In cosa si dif­fe­ren­zia­no i linguaggi di scripting e di pro­gram­ma­zio­ne?

Per com­pren­de­re cosa con­trad­di­stin­gue i linguaggi di scripting, è utile conoscere gli aspetti che li dif­fe­ren­zia­no dai linguaggi di pro­gram­ma­zio­ne con­ven­zio­na­li come C, C++ e Java. In questi linguaggi il pro­gram­ma­to­re scrive un codice sorgente, che viene con­ver­ti­to in codice binario in un passaggio separato. Si uti­liz­za­no quindi due file: il file del codice sorgente in cui lavora il pro­gram­ma­to­re e un file binario generato da questo, che può essere eseguito di­ret­ta­men­te sul computer. Il tra­dut­to­re tra i due file è un programma speciale chiamato com­pi­la­to­re.

La con­ver­sio­ne del codice sorgente in codice binario prende il nome di “com­pi­la­zio­ne”. Durante la com­pi­la­zio­ne, il codice sorgente viene con­trol­la­to per ve­ri­fi­car­ne l’at­ten­di­bi­li­tà: tutte le variabili uti­liz­za­te sono ef­fet­ti­va­men­te definite? I tipi di argomenti delle funzioni cor­ri­spon­do­no alle de­fi­ni­zio­ni delle funzioni? Il pro­gram­ma­to­re ha di­men­ti­ca­to un carattere da qualche parte? Questo controllo è ef­fet­tua­to in ogni com­pi­la­zio­ne per tutto il codice sorgente e può ri­chie­de­re un certo tempo. Il codice binario risultato della com­pi­la­zio­ne è altamente ot­ti­miz­za­to, per fun­zio­na­re durante l’ese­cu­zio­ne il più cor­ret­ta­men­te e ve­lo­ce­men­te possibile. I linguaggi compilati sono quindi par­ti­co­lar­men­te adatti per attività a elevata intensità di calcolo e per sistemi più complessi.

Quando si esegue un programma scritto in un lin­guag­gio di scripting, non c’è nessuna com­pi­la­zio­ne. Pertanto non viene generato nessun file binario dal codice sorgente scritto dal pro­gram­ma­to­re. Di con­se­guen­za, i programmi scritti in linguaggi di scripting sono di solito meno ef­fi­cien­ti nell’ese­cu­zio­ne. Tuttavia, questa perdita di ef­fi­cien­za non è del tutto uno svan­tag­gio ma piuttosto un modo di lavorare con un giusto com­pro­mes­so: i linguaggi di scripting al­leg­ge­ri­sco­no il lavoro del pro­gram­ma­to­re au­men­tan­do il carico del pro­ces­so­re. I linguaggi di scripting sono quindi par­ti­co­lar­men­te adatti per programmi di piccole e medie di­men­sio­ni.

L’idea di fa­ci­li­ta­re il lavoro del pro­gram­ma­to­re è un filo con­dut­to­re che ca­rat­te­riz­za l’ar­chi­tet­tu­ra di molti linguaggi di scripting. Questi non prevedono la gestione manuale della memoria, una tecnica par­ti­co­lar­men­te ef­fi­cien­te ma soggetta a errori. Inoltre, nella maggior parte dei linguaggi di scripting non è ne­ces­sa­rio spe­ci­fi­ca­re 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 per­met­to­no di scrivere il software in modo più diretto e con meno codice sorgente. Con­fron­ta­te gli esempi seguenti. Entrambi i programmi riportati re­sti­tui­sco­no 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!"

Ca­rat­te­ri­sti­che dei linguaggi di scripting

Come men­zio­na­to all’inizio, i programmi in un lin­guag­gio di scripting non vengono con­ver­ti­ti in codice binario prima dell’ese­cu­zio­ne da parte di un com­pi­la­to­re. Al posto del com­pi­la­to­re si utilizza un programma chiamato in­ter­pre­te. Con­cet­tual­men­te è come se l’in­ter­pre­te 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 “in­ter­pre­te” non vi sono ancora chiari, con­si­de­ra­te l’esempio seguente: il codice sorgente può essere pa­ra­go­na­to alle note musicali per un’orchestra. Nel nostro esempio, il codice binario cor­ri­spon­de a una re­gi­stra­zio­ne finita dell’intero brano musicale, me­mo­riz­za­to su un CD. Il brano musicale del CD può essere ri­pro­dot­to in qualsiasi lettore CD, ma non può essere più mo­di­fi­ca­to. L’in­ter­pre­te cor­ri­spon­de all’orchestra che esegue il brano dal vivo.

Pro­gram­ma­zio­ne in­te­rat­ti­va con linguaggi di scripting tramite REPL

In molti linguaggi di scripting è possibile eseguire l’in­ter­pre­te in modo in­te­rat­ti­vo, uti­liz­zan­do la co­sid­det­ta modalità REPL, dall’inglese “read-eval-print-loop”, ovvero un ambiente di pro­gram­ma­zio­ne che accetta input da parte di un singolo utente, li valuta e re­sti­tui­sce il risultato all’utente. Il pro­gram­ma­to­re trasmette il codice sorgente all’in­ter­pre­te, che lo legge e lo esegue. L’in­ter­pre­te mostra quindi il risultato (print) e attende l’input suc­ces­si­vo (loop).

Se viene emesso un errore in modalità REPL, il pro­gram­ma­to­re può vi­sua­liz­za­re il contenuto delle variabili per lo­ca­liz­zar­lo. È anche possibile so­vra­scri­ve­re 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 sin­go­lar­men­te. Lo sviluppo e la cor­re­zio­ne dei bug avvengono nello stesso tempo. Ciò facilita e velocizza no­te­vol­men­te la scrittura di un programma fun­zio­nan­te.

Definire strutture di dati complesse nei linguaggi di scripting come literal

I linguaggi di scripting mirano ad agevolare il lavoro del pro­gram­ma­to­re e for­ni­sco­no 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 co­sid­det­ti “literal”. Ciò permette di mappare di­ret­ta­men­te strutture di dati complesse, invece di svi­lup­par­le con diversi comandi. Il pro­gram­ma­to­re può indicare più fa­cil­men­te le strutture dei dati ne­ces­sa­rie al­leg­ge­ren­do 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>"

Ti­piz­za­zio­ne dinamica nei linguaggi di scripting

Negli esempi di codice sopra riportati avrete notato che non sono spe­ci­fi­ca­ti i tipi come “string”, “int” o “bool”. Tuttavia, il programma ha bisogno di questo tipo di in­for­ma­zio­ni per eseguirle. Da dove le prende?

I linguaggi di scripting si basano sulla “ti­piz­za­zio­ne dinamica”: l’in­ter­pre­te 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 clas­si­fi­ca­ti in base al loro utilizzo e alla loro posizione. Alcuni linguaggi di scripting sono usati nella riga di comando per rag­grup­pa­re sequenze di comandi, con­tri­buen­do così all’au­to­ma­zio­ne. Di questi linguaggi fanno parte Blash e Po­wer­Shell.

VBA e Ap­ple­Script svolgono una funzione simile: possono essere uti­liz­za­ti per au­to­ma­tiz­za­re i processi a livello di ap­pli­ca­zio­ne.

PHP, Perl, Ruby, Python e Ja­va­Script sono uti­liz­za­ti sul web server per creare siti dinamici e ap­pli­ca­zio­ni web, mentre Ja­va­Script è l’unico lin­guag­gio di scripting per web browser. Ori­gi­na­ria­men­te destinate alla pro­gram­ma­zio­ne di elementi in­te­rat­ti­vi, oggi intere ap­pli­ca­zio­ni web sono scritte in Ja­va­Script.

I linguaggi di scripting sono uti­liz­za­ti anche in ambito sta­ti­sti­co e scien­ti­fi­co, in par­ti­co­la­re R e Python.

Vai al menu prin­ci­pa­le