# Linguaggio di scripting

Un linguaggio di scripting, in informatica, è un linguaggio di programmazione interpretato destinato in genere a compiti di automazione del sistema operativo (batch) o delle applicazioni (macro), o a essere usato nella programmazione web all'interno delle pagine web. I programmi sviluppati con questi linguaggi vengono detti script, termine della lingua inglese utilizzato in ambito teatrale per indicare il copione (anche detto canovaccio) in cui sono tracciate le parti che devono essere interpretate dagli attori. Un linguaggio di scripting è un linguaggio di programmazione per un sistema runtime che automatizza l'esecuzione di compiti che altrimenti verrebbero eseguiti individualmente da un operatore umano.

## Storia

Inizialmente, i primi linguaggi di scripting nacquero dall'esigenza di automatizzare alcune operazioni come l'esecuzione di programmi e l'interazione con essi: non c'erano molti costrutti e spesso erano relegati a mansioni specifiche. I linguaggi di scripting hanno poi trovato applicazione in molte aree della progettazione di software, potendo essere utilizzati come linguaggi indipendenti per l'implementazione di algoritmi per un'ampia gamma di compiti.
La differenza rispetto agli altri linguaggi interpretati è data più che altro da ragioni “storiche”. Inizialmente i primi linguaggi di scripting erano molto rudimentali e permettevano poche e semplici operazioni, non risultando adatti alla scrittura di veri programmi. I moderni linguaggi di scripting hanno poi acquisito i costrutti e la potenza degli altri linguaggi; la distinzione resta solo in base all'uso che si fa del linguaggio.
Per la diffusione di questi linguaggi furono di fondamentale importanza linguaggi come Tcl e Lua, specificatamente sviluppati come linguaggi di scripting, che potevano essere integrati in qualsiasi applicazione o utilizzati autonomamente. Lo sviluppo di questi linguaggi comportò maggiori benefici rispetto alla creazione di nuovi linguaggi per applicazioni specifiche, evitando allo sviluppatore di dover scrivere un traduttore di linguaggio e permettendo all'utente di applicare le proprie capacità acquisite.
Il Common Gateway Interface (CGI) permise ai linguaggi di scripting di controllare i web server, così da comunicare tramite il web. Alcuni dei linguaggi di scripting che usavano il CGI agli albori dell'evoluzione del web furono Perl, ASP, e PHP.
Molti sono i software che integrano linguaggi di scripting. Ad esempio i moderni web browser sono provvisti di un linguaggio per la scrittura di estensioni al browser stesso, e molti altri linguaggi standard per controllare il browser, come ECMAScript (comunemente conosciuto come JavaScript), CSS, e HTML. Al 2020, secondo l'indice TIOBE, i linguaggi di scripting costituiscono circa un terzo dei linguaggi di programmazione più diffusi al mondo.

## Descrizione

Consistono generalmente in semplici programmi il cui scopo è l'interazione con altri programmi, molto più complessi, in cui avvengono le operazioni più significative. Gli script si distinguono dai programmi con cui interagiscono, solitamente implementati in un linguaggio differente e non interpretato. Inoltre, spesso gli script sono creati o modificati dall'utente finale. Nel sorgente è frequente l'uso dello shabang.
Nei linguaggi di scripting il programmatore generalmente si disinteressa delle risorse di sistema che il programma finito dovrà consumare, demandando il tutto al sistema stesso. Per risorse si intendono, per esempio, la gestione della allocazione e deallocazione della memoria, la conversione tra tipi, l'inizializzazione e la chiusura dell'applicazione.
In questo modo si evitano molti problemi tipici della programmazione tradizionale, che risulta essere soggetta a errori insidiosi, non facilmente individuabili e pericolosi, e costringe inoltre il programmatore a occuparsi di problematiche non strettamente connesse con l'obiettivo del software che deve creare. L'utilizzo di un linguaggio di scripting permette di concentrarsi invece direttamente sulla soluzione del problema.

## Tipologia
### I job control language

I primi sistemi informatici, tipicamente mainframe, erano destinati all'utilizzo da parte di più utenti (multiutenza) che potevano usufruire delle risorse del calcolatore mediante la disciplina fifo tipica dei sistemi a elaborazione a lotti (Batch processing) Il costo notevole dell'hardware fece sì che più istituzioni, anche con sedi diverse, utilizzassero lo stesso computer tramite dei terminali remoti; così l'utente, non potendo interagire direttamente con la macchina, inviava il proprio job (programma, dati e istruzioni per l'esecuzione del programma) tramite i terminali. Nacque così la necessità di un linguaggio per poter codificare le istruzioni relative all'esecuzione del proprio job, quali ad esempio:
* Memoria richiesta.
* Periferiche input/output da utilizzare.
* Parametri e nome dei dati.
Per questo scopo nacquero i primi linguaggi di scripting della storia, i Job control language (abbreviato JCL).

### Bash scripting

Con il termine Bash scripting ci si riferisce alla creazione di script solitamente utili all'automazione di operazioni di routine sui sistemi operativi Unix-like come Linux. Operazioni che richiedono l'inserimento di diversi comandi sulla shell testuale possono così essere inseriti in un unico file utilizzando la sintassi e gli operatori tipici di questo linguaggio. Gli script così creati possono semplificare notevolmente il lavoro dell'utente.
Su alcuni sistemi come Linux è possibile pianificare l'esecuzione degli script, ad esempio è possibile eseguire alcuni script ogni volta che il sistema viene avviato.
Ecco un esempio di script in bash per la cancellazione dei file in /var/log:

### GUI scripting

Con l'avvento delle interfacce grafiche nasce una tipologia di linguaggi di scripting mirati al controllo del computer. Questi linguaggi interagiscono con le finestre grafiche, i menu, i bottoni e gli oggetti grafici che il sistema genera, simulando le azioni che farebbe un utente umano. Il loro scopo è quello di automatizzare le azioni dell'utente. I linguaggi in cui il controllo avviene attraverso la pressione di tasti o click del mouse sono anche chiamati macro. Questa categoria di linguaggi doveva inizialmente essere usata per controllare tutte le applicazioni eseguibili su un computer basato su interfacce grafiche; ma, in pratica, il supporto per questi linguaggi dipende dalle applicazioni e dal sistema operativo. Tuttavia ci sono alcune eccezioni a questa limitazione. Alcuni linguaggi di scripting relativi alle GUI sono basati sul riconoscimento degli oggetti grafici dai loro pixel sullo schermo; essi non dipendono dal sistema operativo o dall'applicazione.

### Linguaggi specifici per le applicazioni

Molti programmi includono un linguaggio di scripting idiomatico adattato al bisogno dell'utente. Allo stesso modo, alcuni videogiochi per il computer utilizzano un linguaggio di scripting per estendere le azioni di personaggi secondari e dell'ambiente. Linguaggi di questo tipo sono sviluppati per una singola applicazione; e, anche se possono assomigliare a un linguaggio generico (ad esempio QuakeC, modellato su C), hanno caratteristiche personali che li distinguono da essi. Emacs Lisp, un dialetto di Lisp ben sviluppato e potente, contiene molte caratteristiche speciali che lo rendono più adatto all'estensione delle funzioni di editing di Emacs.

### Web browser

I Web Browser sono applicazioni per la visualizzazione delle pagine web. Sono stati sviluppati una serie di linguaggi speciali per controllarne operazioni e funzionalità. Fra questi compaiono JavaScript, il cui nome può trarre in inganno per la sua apparente derivazione da Java (in realtà i due linguaggi non hanno quasi nulla in comune); VBScript prodotto dalla Microsoft, che lavora solo con il browser Internet Explorer; XUL prodotto dal progetto Mozilla, che lavora solamente con Firefox; XSLT, un particolare linguaggio che trasforma il contenuto XML in una nuova forma. Le tecniche che comportano la combinazione di scripting fornita da XML e JavaScript sono cresciute al livello tale da acquisire un nome proprio: AJAX.

### Web server

Dal lato server del link HTTP, gli application server e altri server a contenuto dinamico come il content management system (sistema di gestione dei contenuti), forniscono i contenuti attraverso una grande varietà di tecniche e tecnologie caratterizzate dall'approccio di scripting. Particolarmente predominanti in questo campo sono PHP, JSP e ASP, ma altri linguaggi come Ruby e Python, diventati molto conosciuti soprattutto grazie ai loro famosi framework (rispettivamente Ruby on Rails e Django), si sono ritagliati il loro spazio.

### Linguaggi per l'elaborazione di testi

L'elaborazione dei documenti di testo fu una delle prime applicazioni dei linguaggi di scripting. Script scritti per strumenti di Unix come Awk, sed e grep automatizzano le attività che coinvolgono la configurazione del testo e del file di log. Di grande importanza è l'espressione regolare, un linguaggio creato per la descrizione formale della struttura lessicale del testo, e usato da tutti questi strumenti.
Perl fu originariamente designato per colmare le limitazioni di questi strumenti, ma è cresciuto diventando uno dei più diffusi linguaggi di uso generico.

### Linguaggi dinamici generici

Alcuni linguaggi, come il Perl, cominciarono come linguaggi di script ma furono implementati in linguaggi adatti per problematiche ben più ampie. Altri linguaggi simili sono stati descritti come "linguaggi di script" per questa somiglianza, anche se sono più comunemente usati per programmare applicazioni.

### Linguaggi estensioni/incorporati

Un considerevole numero di linguaggi sono stati progettati per rimpiazzare linguaggi di programmazione specifici per applicazioni, per essere integrabili nei programmi. Il programmatore (che lavora in C o in un altri linguaggio) include dei "Ganci" tramite i quali il linguaggio di scripting può controllare l'applicazione. Questi linguaggi hanno lo stesso scopo dei linguaggi specifici per applicazioni, ma con il vantaggio di permettere il trasferimento di caratteristiche fra applicazione e applicazione. JavaScript partì, inizialmente, come un linguaggio all'interno dei web browser; tuttavia, la standardizzazione del linguaggio come ECMAScript lo ha reso popolare come un linguaggio incorporabile generico. In particolare, l'implementazione da parte di Mozilla di SpiderMonkey è utilizzata in molti alti ambienti come lo Yahoo! Widget Engine. Altre applicazioni che utilizzano implementazioni ECMAScript includono i prodotti Adobe, come Adobe Flash e Adobe Acrobat.
Tcl fu creato come un linguaggio d'estensione da utilizzare in parallelo come un linguaggio di uso generale, emulando il ruolo di linguaggi come Python, Perl e Ruby.
Altre applicazioni complesse e destinate a un compito specifico, possono incorporare ed esporre un linguaggio di programmazione integrato al fine di consentire agli utenti un maggiore controllo e consentendo loro più funzionalità che possono essere disponibili attraverso una interfaccia utente. Per esempio, Autodesk Maya 3D incorpora il linguaggio di scripting MEL, o Blender che si avvale di Python per il medesimo ruolo.
Altri tipi di applicazioni che necessitano l'aggiunta di veloci funzionalità o cicli di ottimizzazioni (ad esempio un motore grafico), usano anch'esse linguaggi integrati. Durante lo sviluppo, permette ai prototipi di essere modificati in modo facile e veloce, senza forzare l'utente a una conoscenza approfondita del programma(cosa che può richiedere molto tempo). I linguaggi di scripting, grazie alla loro versatilità, sono ampiamente usati, e oggi vanta di una vasta gamma che offre linguaggi come Lua e Python, ma anche meno conosciuti come AngelScript e Squirrel.

## Linguaggi diffusi

Secondo un sondaggio globale, svolta dalla EvansData nel 2008, il più famoso linguaggio di scripting è il JavaScript, al secondo posto il PHP, mentre Perl si aggiudica il terzo posto.
* ASP (Active Server Pages)
* ActionScript
* AppleScript
* AutoHotKey
* Autoit
* Awk
* bash
* Brain
* CobolScript
* E
* Euphoria
* Falcon
* GNU Guile
* Go
* Hybris
* ICI
* JASS
* JavaScript (ECMAScript)
* BeanShell
* Job Control Language (JCL)
* Lingo
* Lua
* MIRC scripting
* Miva
* MUMPS
* ObjectRexx
* Perl
* PHP
* Pike
* Pliant
* Python
* QuakeC
* REBOL
* REXX
* Ruby
* Scheme
* ScriptBasic
* Simkin
* Tcl
* UnrealScript
* VBScript
* Visual DialogScript
* ZZT-oop
* HTML