Domain Specific Languages: implementazione in Lisp e integrazione con Java mediante API JSR-223.
Presentazione tenuta il 20/01/2009 in occasione dell'incontro del JUG Genova.
1. DSL in Lisp e Java
Alessio Stalla
alessiostalla@gmail.com
2. DSL in Lisp e Java
Domain Specific Language
Linguaggio specializzato
in un certo dominio applicativo
3. Esempi di DSL
SQL JavaFX Script
Regex Shell Scripting
JSP/JSF EL XUL (Mozilla)
Ant tasks Spring WebFlow
ecc. ecc.
4. DSL e programmazione Bottom-Up
Language Oriented Programming (M. Fowler) o
Bottom-Up Programming (P. Graham)
Avvicinare il Linguaggio al Problema (Bottom-Up)
invece di
avvicinare il problema al linguaggio (Top-Down)
5. DSL – Pro e Contro
Pro
• Linguaggio vicino al problema: alto livello di astrazione, concisione,
semplicità, programmazione dichiarativa
• Ciclo di sviluppo più snello, rapid prototyping
• DSL sono linguaggi di programmazione: possiamo usare le
tecniche che conosciamo – variabili, funzioni, classi, ...
6. DSL – Pro e Contro
Contro
• Babele di linguaggi: curva di apprendimento, scarso supporto dai
tool di sviluppo
• Inefficienza
• DSL sono linguaggi di programmazione: necessario progettare e
implementare parser, compilatore/interprete, ambiente di
esecuzione, ...
8. Esempio
with_transaction {
withdraw 100 € from a;
withdraw 200 € from b;
deposit 300 € on c;
} on_failure {
log(...);
}
9. Lisp
Famiglia di linguaggi con origini molto antiche
(John McCarthy, 1958)
Nasce come linguaggio funzionale per la
manipolazione di dati simbolici
Tradizionalmente associato all'IA, ma con
applicazioni in tutti i campi
10. Lisp
Vari dialetti, i più usati oggi:
Common Lisp (ANSI standard, 1991)
Scheme
Emacs Lisp
Autolisp
11. (Common) Lisp
Linguaggio Multiparadigma:
Imperativo, Funzionale, OO, ...
Interpretato e/o compilato
Altamente interattivo
Molte feature uniche ed interessanti,
ma soprattutto...
Ottimo per scrivere DSL
12. Un po' di teoria...
Sintassi Semantica
for(...) { ... } “The basic for statement executes
some initialization code, then
void method(args) { executes an Expression, a
Statement, and some update
...
code repeatedly until the value of
} the Expression is false.”
The Java Language Specification
17. Macro
Funzioni eseguite prima della compilazione
Operano su Oggetti in memoria e non su testo
Sono scritte in Lisp
Permettono di estendere il linguaggio
aggiungendo nuovi costrutti
Il tool perfetto per scrivere DSL!
18. Ricordate i Contro?
• Babele di linguaggi: curva di apprendimento, scarso supporto dai
tool di sviluppo Sintassi Uniforme (parser integrato)
• Inefficienza Compilatore integrato e trasparente (macro)
• DSL sono linguaggi di programmazione: necessario progettare e
implementare parser, compilatore/interprete, ambiente di
esecuzione... Riutilizzo massimo del linguaggio preesistente:
parser, interprete, compilatore, IDE, ...
19. E Java?
Common Lisp è uno standard
Ne esistono numerose implementazioni,
commerciali e open source
ABCL (Armed Bear Common Lisp) gira sulla JVM
Il compilatore produce bytecode Java
ABCL è nato per portare Java a Lisp, non
viceversa: API molto poco Java-like...
20. ABCL e JSR-223
ABCL supporterà a breve la Java Scripting API:
esecuzione di script da file/stream
chiamate dirette a funzioni Lisp
compilazione
implementazione di interfacce Java in Lisp
21. ABCL e JSR-223
In Lisp, un DSL è un'estensione del linguaggio
tramite macro...
...ciò significa che anche il vostro DSL ABCL-
based è integrato con la Java Scripting API!
Morale: se stai pensando a XML... valuta invece
Lisp e DSL!