Introduzione allo scripting in Java, parte 1

Estratto da Scripting in Java: Languages, Frameworks e Patterns .

Di Dejan Bosanac

Pubblicato da Addison Wesley Professional

ISBN-10: 0-321-32193-6

ISBN-13: 978-0-321-32193-0

Fino a poco tempo fa solo gli hardcore erano entusiasti dello scripting sulla piattaforma Java, ma questo era prima che Sun aumentasse il supporto di JRE per linguaggi tipizzati dinamicamente come Python, Ruby e JavaScript. In questo estratto in due parti dal prossimo Scripting in Java: Languages, Frameworks, and Patterns (Addison Wesley Professional, agosto 2007), Dejan Bosanac accenna a ciò che differenzia la maggior parte dei linguaggi di scripting da un linguaggio di programmazione come Java, quindi spiega perché lo script è un aggiunta degna di tempo al tuo set di competenze di programmazione Java.

Introduzione allo scripting in Java: linguaggi, framework e pattern

L'argomento principale di questo libro è la sinergia tra le tecnologie di scripting e la piattaforma Java. Descrivo i progetti che gli sviluppatori Java possono utilizzare per creare un ambiente di sviluppo più potente e alcune delle pratiche che rendono utile lo scripting.

Prima di iniziare a discutere dell'applicazione dello scripting nel mondo Java, riassumo alcune delle teorie alla base dello scripting in generale e il suo utilizzo nell'infrastruttura informatica. Questo è l'argomento dei primi due capitoli del libro e ci offre una migliore prospettiva della tecnologia di scripting e di come questa tecnologia possa essere utile all'interno della piattaforma Java.

Per iniziare, dobbiamo definire cosa sono i linguaggi di scripting e descrivere le loro caratteristiche. Le loro caratteristiche determinano notevolmente i ruoli in cui potrebbero (dovrebbero) essere utilizzati. In questo capitolo, spiego cosa significa il termine linguaggio di scripting e discuto le loro caratteristiche di base.

Alla fine di questo capitolo, discuto le differenze tra i linguaggi di scripting e di programmazione di sistema e come queste differenze li rendano adatti a determinati ruoli nello sviluppo.

sfondo

La definizione di un linguaggio di scripting è confusa e talvolta incoerente con il modo in cui i linguaggi di scripting vengono utilizzati nel mondo reale, quindi è una buona idea riassumere alcuni dei concetti di base sulla programmazione e l'informatica in generale. Questo riepilogo fornisce una base necessaria per definire i linguaggi di scripting e discutere le loro caratteristiche.

Partiamo dall'inizio. I processori eseguono le istruzioni della macchina , che operano sui dati nei registri dei processori o nella memoria esterna. In parole povere, un'istruzione macchina consiste in una sequenza di cifre binarie (0 e 1) ed è specifica per il particolare processore su cui viene eseguita. Le istruzioni della macchina sono costituite dal codice dell'operazione che indica al processore quale operazione deve eseguire e da operandi che rappresentano i dati sui quali l'operazione deve essere eseguita.

Si consideri ad esempio la semplice operazione di aggiungere un valore contenuto in un registro al valore contenuto in un altro. Ora immaginiamo un semplice processore con un set di istruzioni a 8 bit, in cui i primi 5 bit rappresentano il codice dell'operazione (diciamo, 00111 per l'aggiunta del valore di registro), ei registri sono indirizzati da uno schema a 3 bit. Possiamo scrivere questo semplice esempio come segue:

00111001 010

In questo esempio, ho usato 001 e 010 per indirizzare i registri numero uno e due (R1 e R2, rispettivamente) del processore.

Questo metodo di elaborazione di base è noto da decenni e sono sicuro che lo conosci. Vari tipi di processori hanno strategie diverse riguardo a come dovrebbero apparire i loro set di istruzioni (architettura RISC o CISC), ma dal punto di vista dello sviluppatore del software, l'unico fatto importante è che il processore è in grado di eseguire solo istruzioni binarie. Indipendentemente dal linguaggio di programmazione utilizzato, l'applicazione risultante è una sequenza di istruzioni macchina eseguite dal processore.

Ciò che è cambiato nel tempo è il modo in cui le persone creano l'ordine in cui vengono eseguite le istruzioni della macchina. Questa sequenza ordinata di istruzioni della macchina è chiamata programma per computer . Poiché l'hardware sta diventando più conveniente e più potente, le aspettative degli utenti aumentano. L'intero scopo dello sviluppo del software come disciplina scientifica è fornire meccanismi che consentano agli sviluppatori di creare applicazioni più complesse con lo stesso (o anche meno) sforzo di prima.

Il set di istruzioni di un processore specifico è chiamato linguaggio macchina . I linguaggi macchina sono classificati come linguaggi di programmazione di prima generazione. I programmi scritti in questo modo sono generalmente molto veloci perché sono ottimizzati per l'architettura del processore particolare. Ma nonostante questo vantaggio, è difficile (se non impossibile) per gli esseri umani scrivere applicazioni grandi e sicure in linguaggi macchina perché gli esseri umani non sono bravi a gestire grandi sequenze di 0 e 1.

Nel tentativo di risolvere questo problema, gli sviluppatori hanno iniziato a creare simboli per determinati modelli binari e con questo sono stati introdotti i linguaggi assembly . I linguaggi Assembly sono linguaggi di programmazione di seconda generazione . Le istruzioni nei linguaggi assembly sono solo un livello sopra le istruzioni della macchina, in quanto sostituiscono le cifre binarie con parole chiave facili da ricordare come ADD, SUB e così via. Pertanto, è possibile riscrivere l'esempio di istruzione semplice precedente in linguaggio assembly come segue:

AGGIUNGI R1, R2

In questo esempio, la parola chiave ADD rappresenta il codice dell'operazione dell'istruzione e R1 e R2 definiscono i registri coinvolti nell'operazione. Anche se osservi solo questo semplice esempio, è ovvio che i linguaggi assembly hanno reso i programmi più facili da leggere per gli esseri umani e quindi consentito la creazione di applicazioni più complesse.

Sebbene siano più orientati all'uomo, tuttavia, i linguaggi di seconda generazione non estendono in alcun modo le capacità del processore.

Inserisci linguaggi di alto livello , che consentono agli sviluppatori di esprimersi in forme semantiche di livello superiore. Come avrai intuito, questi linguaggi sono indicati come linguaggi di programmazione di terza generazione . I linguaggi di alto livello forniscono vari potenti loop, strutture dati, oggetti e così via, rendendo molto più semplice creare molte applicazioni con essi.

Nel corso del tempo, è stata introdotta una vasta gamma di linguaggi di programmazione di alto livello e le loro caratteristiche variavano notevolmente. Alcune di queste caratteristiche classificano i linguaggi di programmazione come linguaggi di scripting (o dinamici), come vedremo nelle prossime sezioni.

Inoltre, c'è una differenza nel modo in cui i linguaggi di programmazione vengono eseguiti sulla macchina host. Di solito, i compilatori traducono costrutti linguistici di alto livello in istruzioni macchina che risiedono in memoria. Sebbene i programmi scritti in questo modo inizialmente fossero leggermente meno efficienti dei programmi scritti in linguaggio assembly a causa dell'incapacità dei primi compilatori di utilizzare le risorse di sistema in modo efficiente, con il passare del tempo i compilatori e le macchine miglioravano, rendendo i linguaggi di programmazione del sistema superiori ai linguaggi assembly. Alla fine, i linguaggi di alto livello sono diventati popolari in un'ampia gamma di aree di sviluppo, dalle applicazioni aziendali e dai giochi al software di comunicazione e alle implementazioni del sistema operativo.

Ma c'è un altro modo per trasformare i costrutti semantici di alto livello in istruzioni della macchina, ed è interpretarli mentre vengono eseguiti. In questo modo, le tue applicazioni risiedono negli script, nella loro forma originale, ei costrutti vengono trasformati in fase di esecuzione da un programma chiamato interprete . Fondamentalmente, stai eseguendo l'interprete che legge le istruzioni della tua applicazione e poi le esegue. Chiamati scripting o linguaggi dinamici , tali linguaggi offrono un livello di astrazione ancora più elevato di quello offerto dai linguaggi di programmazione di sistema, e li discuteremo in dettaglio più avanti in questo capitolo.

Le lingue con queste caratteristiche si adattano naturalmente a determinate attività, come l'automazione dei processi, l'amministrazione del sistema e l'incollaggio di componenti software esistenti; in breve, ovunque la sintassi rigida e i vincoli introdotti dai linguaggi di programmazione del sistema si intromettessero tra gli sviluppatori e il loro lavoro. Una descrizione dei ruoli usuali dei linguaggi di scripting è al centro del Capitolo 2, "Applicazioni appropriate per i linguaggi di scripting".

Ma cosa c'entra tutto questo con te come sviluppatore Java? Per rispondere a questa domanda, riassumiamo prima brevemente la storia della piattaforma Java. Man mano che le piattaforme sono diventate più diversificate, è diventato sempre più difficile per gli sviluppatori scrivere software che può essere eseguito sulla maggior parte dei sistemi disponibili. Questo è quando Sun ha sviluppato Java, che offre la semplicità "scrivi una volta, esegui ovunque".

L'idea principale alla base della piattaforma Java era quella di implementare un processore virtuale come componente software, chiamato macchina virtuale . Quando abbiamo una macchina virtuale di questo tipo, possiamo scrivere e compilare il codice per quel processore, invece della piattaforma hardware o del sistema operativo specifico. L'output di questo processo di compilazione è chiamato bytecode e rappresenta praticamente il codice macchina della macchina virtuale di destinazione. Quando l'applicazione viene eseguita, la macchina virtuale viene avviata e il bytecode viene interpretato. È ovvio che un'applicazione sviluppata in questo modo può essere eseguita su qualsiasi piattaforma con installata una macchina virtuale appropriata. Questo approccio allo sviluppo del software ha trovato molti usi interessanti.

La motivazione principale per l'invenzione della piattaforma Java è stata la creazione di un ambiente per lo sviluppo di software client facile, portatile e compatibile con la rete. Ma soprattutto a causa delle limitazioni delle prestazioni introdotte dalla macchina virtuale, Java è ora più adatto nell'area dello sviluppo di software per server. È chiaro che con l'aumento della velocità dei personal computer, vengono scritte più applicazioni desktop in Java. Questa tendenza continua solo.

Uno dei requisiti di base di un linguaggio di scripting è avere un interprete o un qualche tipo di macchina virtuale. La piattaforma Java viene fornita con Java Virtual Machine (JVM), che le consente di ospitare vari linguaggi di scripting. C'è un interesse crescente in quest'area oggi nella comunità Java. Esistono pochi progetti che cercano di fornire agli sviluppatori Java la stessa potenza che hanno gli sviluppatori dei linguaggi di scripting tradizionali. Inoltre, c'è un modo per eseguire la tua applicazione esistente scritta in un linguaggio dinamico come Python all'interno della JVM e integrarla con un'altra applicazione o modulo Java.

Questo è ciò di cui discutiamo in questo libro. Adottiamo un approccio di scripting alla programmazione, discutendo tutti i punti di forza e di debolezza di questo approccio, come utilizzare al meglio gli script in un'architettura applicativa e quali strumenti sono oggi disponibili all'interno della JVM.